Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.06;
Скачать: CL | DM;

Вниз

Помогите убить баг!!!!!!!   Найти похожие ветки 

 
Salivan   (2003-09-16 10:47) [0]

Написал прогу под BDE, преимущественно использую SQL инструкции, и часто выдается ошибка "can"t create cursor handle". точно не могу сказать при каких обстоятельствах, но ошибка возникает либо при попытке выполнить "update mytable", либо "insert into". Не подскажете, в чем может быть дело?

Заранее благодарен.


 
HSolo ©   (2003-09-16 10:54) [1]

У Вас, по-видимому, везде стоит Query.Open
А для запросов на обновление данных (insert/update/delete) нужно Query.ExecSQL - т.к. ничего эти запросы не возвращают. Open - это только для select


 
Salivan   (2003-09-16 11:09) [2]

> HSolo © (16.09.03 10:54) [1]
> У Вас, по-видимому, везде стоит Query.Open

Да нет, там правильно все. Если бы был Query.Open, то я бы SQL запрос ни вжисть бы не поменял. ошибка вообще как-то нерегулярно выскакивает, вемя от времени


 
Sandman25 ©   (2003-09-16 11:29) [3]

Приведите кусок кода, на котором возникает ошибка.


 
Salivan   (2003-09-16 11:51) [4]

> Sandman25 © (16.09.03 11:29) [3]
> Приведите кусок кода, на котором возникает ошибка.

{-------begin-----регистрация отправления исходящих-----------------}
with DataModule1.Query1 do
begin
Close;
while State<>dsInactive do
Application.ProcessMessages;
SQL.Clear;
SQL.Add("update buffer");
SQL.Add("set parol=""2""");
Application.ProcessMessages;
try
ExecSQL;
while State<>dsInactive do
Application.ProcessMessages;
except
on E:Exception do
begin
Application.MessageBox(PChar(e.Message),"Ошибка при регистрации п/п в таблице buffer.dbf",MB_OK);
raise;
end;
end;
while State<>dsInactive do
Application.ProcessMessages;
SQL.Clear;
SQL.Add("insert into o_reestr");
SQL.Add("select * from buffer");
Application.ProcessMessages;
try
ExecSQL;
while State<>dsInactive do
Application.ProcessMessages;
except
on E:Exception do
begin
Application.MessageBox(PChar(e.Message),"Ошибка при переносе п/п в реестр",MB_OK);
raise;
end;
end;
while State<>dsInactive do
Application.ProcessMessages;
end;
{------end-----регистрация отправления исходящих------------}

Где-то здесь. Потому как далее никаких операций с базой не производится кроме переоткрытия, но это уже в блоке finally


 
Sandman25 ©   (2003-09-16 11:53) [5]

Наверное, некорректно обращаться к State после ExecSQL. Кстати, в любом случае эта проверка Вам ничего не даст. Попробуйте ее убрать.


 
Salivan   (2003-09-16 12:02) [6]

> Sandman25 © (16.09.03 11:53) [5]
> Наверное, некорректно обращаться к State после ExecSQL.
> Кстати, в любом случае эта проверка Вам ничего не даст.
> Попробуйте ее убрать.

Попробую, конечно, но как тогда определять, что Query уже все выполнил и с таблицей уже можно работать дальше?


 
Sandman25 ©   (2003-09-16 12:07) [7]

Пока ExecSQL не выполнится, программа дальше выполняться все равно не будет. Это не асинхронная процедура. Попробуйте пройтись по программе пошагово в режиме отладки и сами увидите. Поставьте точку останова (F5) на ExecSQL, а потом нажмите F8.


 
Val ©   (2003-09-16 12:11) [8]

+Sandman25 © (16.09.03 12:07) [7]
поэтому, в данном случае Application.ProcessMessages; не нужен, думаю.



Страницы: 1 вся ветка

Текущий архив: 2003.10.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
4-18668
Pindos
2003-08-01 02:36
2003.10.06
Handle Активного Окна


1-18430
petro
2003-09-25 11:25
2003.10.06
проблема со стартовыми параметрами


1-18464
aaZ69
2003-09-24 13:52
2003.10.06
Динамическое обращение к однотипным компонентам


14-18563
Rif
2003-09-17 15:01
2003.10.06
Как отправить письмо


1-18481
HolACost!
2003-09-23 17:43
2003.10.06
Потоки, Сообщения, Семафоры