C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ADOQuery1->ExecSQL() = AccessViolation, ExecSQL — вызывает AccessViolation
DVV
Отправлено: 27.02.2005, 10:58


Не зарегистрирован







База банных MySQL.
Создаем на форме компонент TADOQuery1 и TButton1. В cобытии последнего прописываем код:

ADOQuery1->ConnectionString="Provider=MSDASQL.1;Persist Security Info=False;Data Source=Factory";
ADOQuery1->SQL->Text="select * from steel";
ADOQuery1->Open();
ADOQuery1->SQL->Text="Insert into steel (name) values ('Сталь 40х')";
ADOQuery1->ExecSQL();

На последней строке программа вылетает по AccessViolation . . . в msado15.dll

На базе MSAccess происходит тоже самое. Первый способ победить это я нашел такой:
Вместо последней строки написать это:
TADOQuery* ADOQuery=new TADOQuery(NULL);
ADOQuery->ConnectionString=ADOQuery1->ConnectionString;
ADOQuery->SQL->Text=ADOQuery1->SQL->Text;
ADOQuery->ExecSQL();
delete ADOQuery;

Слишкол громоздко!

Если работать с приличными серверами напр. MSSQL то последние две строки можно написать так:

ADOQuery1->SQL->Text="Insert into steel (name) values ('Сталь 40х'); Select 0;";
ADOQuery1->Open();
И это сработает.

Но MySQL, к сожалению, не выполняет два запроса подряд.
Может есть другие пути решения этой проблемы?


xim
Отправлено: 27.02.2005, 15:29


Станционный диспетчер

Группа: Участник
Сообщений: 143



Исключение возникает из-за попытки выполнить вставку записи уже открытым ADOQuery1.
Почему не используется ADOConnection? Зачем менять SQL->Text у ADOQuery1?
Добавляем ADOCommand. Если не использовать ADOConnection:
CODE

ADOQuery1->ConnectionString="Provider=MSDASQL.1;Persist Security Info=False;Data Source=Factory";
ADOQuery1->SQL->Text="select * from steel";
ADOQuery1->Open();

ADOCommand1->ConnectionString=ADOQuery1->ConnectionString;
ADOCommand1->CommandText="Insert into steel (name) values ('Сталь 40х')";
ADOCommand1->Execute();

DVV
Отправлено: 27.02.2005, 16:47


Не зарегистрирован







QUOTE (xim @ 27/02/2005, 15:29)
CODE

ADOCommand1->Execute();

Точно, все получилось!
Кстати открытый запрос тут ни при чем. Во первых, когда я пишу ADOQuery1->SQL->Text="select * from steel"; т.е. изменяю свойство SQL, ADOQuery1 автоматически закрывается. Во вторых, я уже об этом думал, и пробовал принудительно закрывать ADOQuery1. Не помогает.

ADOConnection я не использовал только в конференции, что бы упростить код.

Спасибо!

Вернуться в Работа с базами данных в C++Builder