![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Большой цикл с запросами к БД Access [D5, Access]
RedKat © (2002-10-28 17:47:00)Вот такой вот простенький код вызывает проблемы ;-(
for i :=0 to 10000 do
begin
TmpQuery :=nil;
try
TmpQuery :=TADOQuery.Create(nil);
TmpQuery.Connection :=Base.ADOBackUpConnection;
TmpQuery.SQL.Add(Format("Exec SelectFileIdentByFile %d, %s", [1, StrToDBStr("12345.txt")]));
TmpQuery.Open;
finally
TmpQuery.Close;
TmpQuery.Free;
end;
Те. в цикле вызывается хранимая процедура Access
На 2038 проходе возникает ошибка -"Объект более не существует"
D-5, Win200Server, Access2000/Xp
В чем проблема ? Под Win98 работает нормально.
sniknik (2002-10-29 16:07:00) [1]просто не используй процедуры
не трудно ведь
DMod.ADOCommand1.CommandText:="SELECT FileIdent FROM Files WHERE .....";
DMod.ADOCommand1.Execute;
вместо
DMod.ADOCommand1.CommandText:="EXECUTE .....";
DMod.ADOCommand1.Execute;
гдето внутрях jet-а, можно конечно поискать... но влом.
кстати это ограничение даже не на параметры а на вызовы этих самых процедур. (процедура без параметров тоже вылетает на 2040 м разе)
RedKat (2002-10-29 15:16:00) [2]Значит в моем случае в начале процесса необходимо открыть Connection, а по окончании - закрыть и все будет Ok ?
Но тут возникает др. проблема, программа должна оперативно вносить изменения в БД (задержки крайне не желательны), а открытие/закрытие Connection это очень большое время ;-((
sniknik (2002-10-29 14:01:00) [3]странно но в этой ситуации ODBC драйвер повел себя на удивление хорошо.
Provider=MSDASQL;Persist Security Info=False;Extended Properties="DSN=База данных MS Access;DBQ=D:\1C.mdb;DefaultDir=D:\;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"
при таком подключении 10000 вызовов подряд без проблем.
а вот jet дал Маху :-)).
могу только предположить что там ограничение на созданые параметры, где устанавливаются хрен знает. Параметры которые внутри jet-а передаются в QueryDef (вернее коллекция параметров т.к. от количества их не зависит) и возможны 2040 шт.
вот так работает (убрать 2 строчку тоже будет ошибка)
for i:= 1 to 9999 do begin
if i mod 100 = 0 then DMod.ADOConnection1.Close;
DMod.ADOCommand1.CommandText:= "EXECUTE 1saccsQueryDef 1";
DMod.ADOCommand1.Execute;
Label1.Caption:= IntToStr(i);
Form1.Refresh;
end;
DMod.ADOCommand1.CommandText:= "EXECUTE 1saccsQueryDef 1";
DMod.ADODataSet1.Recordset:= DMod.ADOCommand1.Execute;
короче еще один аргумент против процедур в Access получился или за ODBC кому как нравится.
sniknik (2002-10-29 12:58:00) [4]значит Jet в чистом виде :-((, (плохо больной что вы не курите, а то бросили бы, помогает :о))).
просто не используй процедуры да и все. или это принципиально? хотя докопатся почемубыло бы интересно.
RedKat (2002-10-29 12:32:00) [5]В рабочем варианте подключение к той-же базе, просто текст запроса перенесен из Access в Delphi. Строка подключения (задана в исх. коде при создании TDataModule) :
ADOBackUpConnection.ConnectionString :="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+
"c:\tmp\SysMain.mdb"+
";Persist Security Info=False";
sniknik (2002-10-29 11:22:00) [6]А рабочий вариант это к чему подключение? разве не к Access?
проблема на самом деле в том что в Микрософте превратно понимают понятие процедура в отношении к Access. Проще признать что процедур в нем НЕТ и не использовать то чего нет.
кстати покажи строку какую используеш, возможно и с этим проблемы (если через ODBC подключатся, у меня были)
RedKat (2002-10-29 10:15:00) [7]Только что проверил такой вариант :
Base.ADOBackUpQuery.Close;
Base.ADOBackUpQuery.SQL.Clear;
Base.ADOBackUpQuery.SQL.Add( Format("SELECT FileIdent FROM Files WHERE (LineIdent=%d) And (FileName=%s) ", [1, StrToDBStr("12345.txt")]));
Base.ADOBackUpQuery.Open;
Все Ok ! Те проблема в самом Access ;-( Но как бороться непонятно.
RedKat (2002-10-29 10:01:00) [8]Этот код работает аналогично ;-(
for i :=0 to 10000 do
begin
Base.ADOBackUpQuery.Close;
Base.ADOBackUpQuery.SQL.Clear;
Base.ADOBackUpQuery.SQL.Add( Format("Exec SelectFileIdentByFile %d, %s", [1, StrToDBStr("12345.txt")]));
Base.ADOBackUpQuery.Open;
end;
Иногда вылетает ошибка "Слишком много открытых таблиц, Процесс остановлен"
RedKat (2002-10-29 09:52:00) [9]Это не рабочий, а только отладочный код.
В реальной программе работает цикл по отобраным записям.
Для каждой записи необходимо выполнить около 5-6 Select/Insert/Update, соотв. чтобы не задумываться можно или нет закрывать QueryXXX я применил такой подход.
Впрочем это не столь важно, поскольку при статических Query ситуация такая-же ;-(
LordOfSilence (2002-10-28 18:03:00) [10]Встречный вопрос: а зачем 10000 (!) раз в цикле
уничтожать и затем создавать один и тот же по сути объект?
Если такой подход уж так необходим, не проще ли
очищать SQL.Clear() и заново прописывать SQL.Add();
Тоже не совсем понятно из кода, что Вы этим хотите
добиться.
Darts (2002-10-28 18:00:00) [11]2038 - здесь зарыта собака? Наверное, надо увеличить количество выходных строк.