Форум программистов, компьютерный форум, киберфорум
Visual C++: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/55: Рейтинг темы: голосов - 55, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 21
Другое

Запуск транзакции БД. Подключение БД к Visual C++, вывод данных sql запросом

27.06.2023, 09:32. Показов 18089. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый день.

Прошу помочь разобраться с работой транзакций. Имеется база данных firebird, к которой подключаемся через провайдера LCPI.IBProvider. По щелчку на windows form происходит выборка нужной таблицы из БД и дальнейший ее вывод данных. Ниже приведу пример кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
System::Void ExampleCPP::MyForm::button1_Click(System::Object^ sender, System::EventArgs^ e)
{   //String^ connectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=STATIONDATA.FDB";
    
    String^ connectionString = "Provider=LCPI.IBProvider.5;" + 
        "data source=localhost:STATIONDATA.FDB;" + 
        "ctype=win1251;user id=Sysdba;password=masterkey";
    OleDbConnection^ dbConnection = gcnew OleDbConnection(connectionString);
    //выполняем запрос к бд
    dbConnection->Open();//открываем соединение
    
    String^ query = "SELECT * FROM BLACKBOX";//запрос
    OleDbCommand^ dbComand = gcnew OleDbCommand(query, dbConnection);
    OleDbTransaction^ trans = dbConnection->BeginTransaction();
    
    OleDbDataReader^ dbReader = dbComand->ExecuteReader();//считываем данные
    
    //проверяем данные
    if (dbReader->HasRows == false) {
        MessageBox::Show("Ошибка считывания данных", "Ошибка");
    }
    else {
        while (dbReader->Read()) {
            dataGridView1->Rows->Add(dbReader["HOST"], dbReader["DATETIME"], dbReader["ENTER"], dbReader["ACTION"]);
        }
    }
    dbReader->Close();
    dbConnection->Close();
 
    return System::Void();
}
С БД Access запрос отрабатывает без ошибок, но при использовании база данных firebird выходит ошибка компиляции: ExecuteReader требует, чтобы команда имела транзакцию, если подключение, назначенное команде, находится в отложенной локальной транзакции Свойство Transaction для команды не инициализировано."
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.06.2023, 09:32
Ответы с готовыми решениями:

Вывод русского текста в консольном окне Visual C++ программы Visual Studio Community 2017
Опробовал разные варианты, но почему-то в версии 2017 предыдущие методы не работают. Программа...

Запуск студией и запуск самой виндой. Разница работы программы
Итак, проблема такова: есть проект, который замечательно работает при нажатии F5 в студии. При...

Запуск Visual Studio с компьютера в локальной сети
Есть ли такая возможность - не устанавливать целиком пакет Visual Studio .NET 2002 на компьютере, а...

4
70 / 14 / 4
Регистрация: 10.07.2018
Сообщений: 308
02.07.2023, 21:01
Ошибка компиляции говорит о том, что для выполнения команды ExecuteReader требуется активная транзакция, но свойство Transaction для объекта dbCommand не было инициализировано.

Для решения данной проблемы нужно инициализировать объект транзакции при создании объекта dbCommand. Для этого нужно добавить следующий код:

C++
1
2
3
4
5
OleDbTransaction^ trans = dbConnection->BeginTransaction(); dbComand->Transaction = trans;
 
Также не забудьте закрыть транзакцию после выполнения команды, например, таким образом:
 
trans->Commit();
Кроме того, важно учитывать, что при использовании транзакций для выполнения запросов требуется аккуратность и следование правилам транзакционности, чтобы избежать ошибок и непредсказуемого поведения приложения.
1
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 21
03.07.2023, 09:01  [ТС]
А можно по подробнее как объявить правильно
C++
1
dbComand->Transaction = trans;
0
70 / 14 / 4
Регистрация: 10.07.2018
Сообщений: 308
03.07.2023, 11:30
после этой строки
dbConnection->Open();//открываем соединение
вы должны провести проверку, действительно ли соединение открылось? а вас ее нет, а проблема в том что соединение не открывается.

Добавлено через 1 минуту
а причину по которой соединение не открывается в этой строке

C++
1
2
3
String^ connectionString = "Provider=LCPI.IBProvider.5;" + 
        "data source=localhost:STATIONDATA.FDB;" + 
        "ctype=win1251;user id=Sysdba;password=masterkey";
Добавлено через 2 минуты
Firebird может потребоваться указание параметра "dialect" для задания используемой версии SQL-диалекта.
0
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 21
03.07.2023, 13:36  [ТС]
Извините за глупый вопрос разве условие if не является проверкой? я просто новичёк в программировании так сказать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
System::Void bdblackbox::MyForm::button1_Click(System::Object^ sender, System::EventArgs^ e)
{//String^ connectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=STATIONDATA.FDB";
    
    String^ connectionString = "Provider=LCPI.IBProvider.5;" +
        "data source=localhost:STATIONDATA.FDB;" +
        "ctype=win1251;user id=Sysdba;password=masterkey"; auto commit = true; auto rollback = true;
    OleDbConnection^ dbConnection = gcnew OleDbConnection(connectionString);
    //выполняем запрос к бд
    dbConnection->Open();//открываем соединение
    OleDbTransaction^ trans = dbConnection->BeginTransaction();
    OleDbCommand^ dbComand->Transaction = trans;
    String^ query = "SELECT * FROM BLACKBOX";//запрос
    OleDbCommand^ dbComand = gcnew OleDbCommand(query, dbConnection);
    OleDbDataReader^ dbReader = dbComand->ExecuteReader();//считываем данные
    //проверяем данные
    if (dbReader->HasRows == false) {
        MessageBox::Show("Ошибка считывания данных", "Ошибка");
    }
    else {
        while (dbReader->Read()) {
            dataGridView1->Rows->Add(dbReader["HOST"], dbReader["DATETIME"], dbReader["ENTER"], dbReader["ACTION"]);
        }
    }
    trans->Commit();
    dbReader->Close();
    dbConnection->Close();
    return System::Void();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.07.2023, 13:36
Помогаю со студенческими работами здесь

Запуск программы VC7 на Visual Studio 2010
Есть программа (в архиве) расширения оболочки для изменения иконок у dll в зависимости от типа,...

Запуск приложений, созданных в visual studio 2012 и windows 7 на компьютерах со старым windows xp!
Может кому понадобится! Запуск приложений, созданных в visual studio 2012 и windows 7 на...

Какая разница между Visual C++ и Visual C++.NET?
Какая раздница между Visual C++ и Visual C++.NET, чисто в том что NET ориентировано на WEB...

Какое отличие между Visual C++ от Visual C++ 2010 Express
Подскажите какая разница между какимто стандартным Visual C++ от Visual C++ 2010 Express... Что...

Вылетает Visual Studio 2008 из-за системы управления версиями Microsoft Visual SourceSafe.
Всем здравствуйте. Недавно установил VS 2008 sp1 rus. Хочу создать проект на VC++ (делаю всё...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru