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

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

27.06.2023, 09:32. Показов 18189. Ответов 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
Сообщений: 314
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
Сообщений: 314
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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru