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

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

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

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

Прошу помочь разобраться с работой транзакций. Имеется база данных firebird, к которой подключаемся через провайдера LCPI.IBProvider. По щелчку на windows form происходит выборка нужной таблицы из БД и дальнейший ее вывод данных. Ниже приведу пример кода
C++ (Qt)
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
Ответы с готовыми решениями:

Вывод данных SQL запросом
Прошу помогите пожалуйста! Столкнулся с проблемой вывода данных. Имеется два таблицы Student и Mark (1 и 2 png файл) с информации о...

QT и MS SQL. Вывод данных в табличную форму полученных запросом в хранимой процедуре
Если получаю данные используя QSqlQuery просто написав текст запроса, то всё без проблем работает и данные выводятся ...

Подключение к Visual Studio базу данных SQL Server
Пытаюсь добавить в решение базу данных SQL Server. Visual Studio 2010 SQL Server 2008 R2 Оба расположены на одном компе. База...

4
70 / 14 / 4
Регистрация: 10.07.2018
Сообщений: 303
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
Сообщений: 303
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
Помогаю со студенческими работами здесь

Подключение базы данных SQL в Visual Studio 2014
В колледже практику делаем, а у меня всё крахом пошло в конце, решил сделать дома всё заново по-другому. Итак, чтобы "рассказать о...

Вывод строк запросом sql
Вот мой запрос: SELECT a_data_klemma.ID, b_iblock_element.NAME, b_catalog_price.PRICE, b_iblock_element_property.IBLOCK_ELEMENT_ID, ...

Вывод поля из таблицы запросом SQL
Имеется таблица с полем NAME в котором более 5000 позиций. Каким запросом можно вывести их все? С помощью такого запроса выводит...

Вместо данных текущей транзакции приходят данные предыдущей транзакции. Sandbox Paypal
Здравствуйте! Проблема в том что вместо данных текущей транзакции, IPN с paypal приходят данные предыдущей транзакции. Например я...

Транзакции,влияет ли количество изменяемых данных в рамках одной транзакции, как, на что и почему?
ууу


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Как генерируется мир в Minecraft
GameUnited 28.05.2025
Задумывались ли вы когда-нибудь о том, сколько песчинок на нашей планете? По приблизительным подсчетам - более 7 квинтиллионов! Это цыфра с 18 нулями. И все же, это даже не половина количества. . .
Один суперкластер Kubernetes для вообще всего
Mr. Docker 28.05.2025
Ваша компания развивается, количество сервисов множится, команды разработки разрастаются, а DevOps-инженеры начинают напоминать ту самую собаку из мема про "всё нормально, когда ничего не нормально". . . .
CAP-теорема или почему идеальной распределенной системы не существует
ArchitectMsa 28.05.2025
Вы переводите деньги со своего счета на счет друга. Казалось бы, что может быть проще? Вы открываете приложение банка, вводите сумму, жмете кнопку - и деньги мгновенно переходят с одного счета на. . .
Пишем первый чатбот на C# с нейросетью и Microsoft Bot Framework
UnmanagedCoder 28.05.2025
Microsoft Bot Framework представляет собой мощнейший инструментарий для создания разговорных интерфейсов любой сложности. Он предлагает целостную экосистему, которая включает SDK для C#, сервисы. . .
Event-Driven приложения с Apache Kafka и KafkaFlow в .NET
stackOverflow 26.05.2025
Для . NET разработчиков работа с Kafka традиционно сопряжена с определенными трудностями. Официальный клиент Confluent хорош, но часто требует написания большого количества шаблонного кода. Многие. . .
Квантовое программирование: Реализуем первый алгоритм на Q#
EggHead 26.05.2025
Квантовое программирование — одна из тех областей, которая ещё недавно казалась чем-то недоступным обычному разработчику. Многие представляют себе учёных в белых халатах, работающих с огромными. . .
Запилил скелет проекта физического симулятора.
Hrethgir 26.05.2025
Нзвание публикации "Вычислить VS запомнить — простой и экономичный пример организации обработки потока данных для физической симуляции". Пока только скелет, но всё - будет. . . .
Авто-векторизация в C с GCC 14
NullReferenced 25.05.2025
Современные процессоры давно перестали наращивать тактовую частоту как основной способ увеличения производительности. Вместо этого они обзавелись специализироваными блоками SIMD (Single Instruction,. . .
Типы данных в Python
py-thonny 25.05.2025
Когда я только начинал работать с Python, меня поразило, насколько органично типы данных встроены в синтаксис. Забавно, но факт: некоторые программисты, перешедшие с Java или C++, сначало даже не. . .
.NET Aspire и cloud-native приложения C#
stackOverflow 24.05.2025
. NET Aspire — новый продукт в линейке Microsoft, который вызвал настоящий ажиотаж среди разработчиков облачных приложений. Компания называет его "опинионированным, облачно-ориентированным стеком для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »