Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Access Violation in msjet40.dll


Автор: Norfonzor 25.7.2011, 09:31
Делфи, работаю с: ADOConnection, ADOCommand, DataSource, ADODataSet, DBGridEh. БД в excel.

Схема цепочки для работы с БД
http://www.imgup.ru/image-fgsx171351320.html

DBGridEh3 -таблица, которую заполняет пользователь
DBGridEh2- таблица служебная (пользователь ее не видит) для обработки запросов к БД

Код

//перебор по таблице DBGridEh3, (используются DataSource3, DataSet3, DBGridEh3)
while not (DBGridEh3.DataSource.DataSet.EOF) do
BEGIN

//выполняются куча запросов SELECT (используются DataSource2, DataSet2, DBGridEh2)
s:='SELECT...'
ADODataSet2.Active:=false;
ADODataSet2.CommandText:=s;
ADODataSet2.Active:=true;

...

ADOCommand.CommandText:='UPDATE ...'; //изменение полей (используются ADOCommand)
ADOCommand.execute;

...

HISTORY1(VAR_id_login,id_tovara,id_tari,'Продажа',0,kol,cena_punkta);
//ЗДЕСЬ возникает ошибка "Нарушение прав доступа в msjet40.dll"


END;


ошибка появляется при работе с 1ой процедурой:
Код

procedure HISTORY(id_sotr,id_tovara,id_tari:integer; soderjanie:string; types:integer; value,summa:real);
begin
// 0 - продажа
// 1 - вход
// 2 - выход
// 3 - приход товара
// 4 - отчет
// 5 - откат
// 6 - служебное сообщение
// 7 - открытие смены

FrmMain.ADOCommand.CommandText:='INSERT INTO история (дата, id_сотрудника,id_товара, содержание, тип, значение, id_тары, сумма) VALUES ("'+DateTimeToStr(Now)+'", '+inttostr(id_sotr)+', '+inttostr(id_tovara)+', "'+soderjanie+'", '+inttostr(types)+', '+floattostr(value)+', '+inttostr(id_tari)+', '+floattostr(summa)+');';  
FrmMain.ADOCommand.execute;
end;


ошибка появляется случайно, с одними и теми же входными данными может появится а может и нет. Причем появляется только в этой процедуре. 
В других процедурах аналогично обращаюсь к FrmMain.ADOCommand.CommandText:=ТЕКСТ

Перевод ошибки: "Нарушение прав доступа в msjet40.dll"

таблица история:


Господа подскажите пожалуйста в чем может быть ошибка! Голову уже сломал над этим вопросом.

Автор: Norfonzor 25.7.2011, 10:52
Добавил схему БД. Может быть проблема в связях? как будто бы ошибка появляется при работе с INSERT

Автор: 14SatanA88 25.7.2011, 11:02
http://www.restoreguard.com/p/file-Msjet40.dll.html

попробуй пропатчить саму либу

Автор: 14SatanA88 25.7.2011, 11:23
Цитата(Norfonzor @  25.7.2011,  10:52 Найти цитируемый пост)
Может быть проблема в связях?


если
Цитата(Norfonzor @  25.7.2011,  09:31 Найти цитируемый пост)
ошибка появляется случайно, с одними и теми же входными данными может появится а может и нет


то не в связях дело

Автор: Norfonzor 25.7.2011, 11:34
В инете читал что такая ошибка возникает если коряво написан запрос. 
Может быть ли ошибка изза того что я работаю с "while not (DBGridEh3.DataSource.DataSet.EOF) do" и оттуда обращаюсь к ADOCommand?

Автор: 14SatanA88 25.7.2011, 11:39
Цитата(Norfonzor @  25.7.2011,  11:34 Найти цитируемый пост)
коряво написан запрос

я думаю, что генерировалось бы исключение именно по запросу.
а у тебя ошибка с либой, которую пользует драйвер JET 4.0

попробуй все-таки пропатчить либу.

p.s. если ошибка выпадает на одних и тех же данных не каждый раз, то дело точно не в запросе

Автор: Norfonzor 25.7.2011, 12:25
Ошибка появляется на нескольких ПК. Обновить MDAC и MS Jet 4.0 SP3 не удается тк установлены последние версии

Автор: 14SatanA88 25.7.2011, 12:26
у меня больше нет идей...

Автор: Norfonzor 25.7.2011, 12:29
А какими средствами вы вносите данные в БД INSERT ??

Автор: 14SatanA88 25.7.2011, 12:54
Цитата(Norfonzor @  25.7.2011,  12:29 Найти цитируемый пост)
А какими средствами вы вносите данные в БД INSERT ??


AdoQuery.SQL - сюда вношу запрос
AdoQuery.ExecSQL - выполняю

Добавлено через 34 секунды
AdoCommand не пользовался.

Автор: Norfonzor 25.7.2011, 13:34
AdoQuery ясно, встречался с ним, слышал что были глюки с INSERT в нем, мне рекомендовали ADOCommand=) сейчас вижу обратное

Автор: 14SatanA88 25.7.2011, 13:50
Цитата(Norfonzor @  25.7.2011,  13:34 Найти цитируемый пост)
были глюки с INSERT

честно говоря, первый раз слышу)
да и ошибка, насколько я знаю, не связана с самим запросом.
хотя я могу и ошибаться

Автор: Norfonzor 25.7.2011, 13:52
Воспользовался компонентом ADOQuery, пока ошибка не появлялась, для внесения информации достаточно ли этого:
Код

ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Text := 'INSERT INTO история (дата, id_сотрудника,id_товара, содержание, тип, значение, id_тары, сумма) VALUES ("'+DateTimeToStr(Now)+'", '+inttostr(id_sotr)+', '+inttostr(id_tovara)+', "'+soderjanie+'", '+inttostr(types)+', '+floattostr(value)+', '+inttostr(id_tari)+', '+floattostr(summa)+');';
ADOQuery2.ExecSQL;


Слышал что кто то перед началом работы пишет ADOQuery2.Active:=False;

Автор: 14SatanA88 25.7.2011, 14:01
Цитата

Слышал что кто то перед началом работы пишет ADOQuery2.Active:=False;


Ну, это не повлияет в худшую сторону, все что могу сказать.

можно ADOQuery2.Close; это то же самое

Автор: Norfonzor 26.7.2011, 18:51
Ошибка не появляется больше, тьфу тьфу тьфу =) Спасибо 14SatanA88

Автор: 14SatanA88 26.7.2011, 20:44
не за что
закрывай тему

Автор: Norfonzor 28.7.2011, 10:48
 smile  Проблема снова проявилась текст запроса:

Код

UPDATE тара SET остаток=-427 WHERE id=999999998;


Может использовать критическую секцию для внесения изменений?
http://www.imgup.ru/image-fhox9719209.html

Автор: 14SatanA88 28.7.2011, 11:42
http://support.microsoft.com/kb/277711

Добавлено через 2 минуты и 4 секунды
Цитата

This problem was fixed in Jet 4.0 Service Pack 6 (SP6).

наверное без апдейта никак

Добавлено через 6 минут и 45 секунд
а как данные физически хранятся?

Автор: Norfonzor 29.7.2011, 07:37
Обновляться не хочет C:\Windows\system32\msjet40.dll установлена версия 4.0.9511.0
Данные хранятся в бд MS Access .mdb
Увеличил длину числовых типов данных с "Одинарное с плавающей точкой" до "Двойное с плавающей точкой"
А структура схемы такой допускается?

http://www.imgup.ru/image-fhux01515194.html

Автор: 14SatanA88 29.7.2011, 07:57
честно говоря, больше идей нет.
еще вариант - попробуй имена полей НЕ кириллицей задавать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)