Форум: "Базы";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
ВнизБольшой цикл с запросами к БД Access Найти похожие ветки
← →
RedKat (2002-10-28 17:47) [0]Вот такой вот простенький код вызывает проблемы ;-(
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 работает нормально.
← →
Darts (2002-10-28 18:00) [1]2038 - здесь зарыта собака? Наверное, надо увеличить количество выходных строк.
← →
LordOfSilence (2002-10-28 18:03) [2]Встречный вопрос: а зачем 10000 (!) раз в цикле
уничтожать и затем создавать один и тот же по сути объект?
Если такой подход уж так необходим, не проще ли
очищать SQL.Clear() и заново прописывать SQL.Add();
Тоже не совсем понятно из кода, что Вы этим хотите
добиться.
← →
RedKat (2002-10-29 09:52) [3]Это не рабочий, а только отладочный код.
В реальной программе работает цикл по отобраным записям.
Для каждой записи необходимо выполнить около 5-6 Select/Insert/Update, соотв. чтобы не задумываться можно или нет закрывать QueryXXX я применил такой подход.
Впрочем это не столь важно, поскольку при статических Query ситуация такая-же ;-(
← →
RedKat (2002-10-29 10:01) [4]Этот код работает аналогично ;-(
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 10:15) [5]Только что проверил такой вариант :
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 ;-( Но как бороться непонятно.
← →
sniknik (2002-10-29 11:22) [6]А рабочий вариант это к чему подключение? разве не к Access?
проблема на самом деле в том что в Микрософте превратно понимают понятие процедура в отношении к Access. Проще признать что процедур в нем НЕТ и не использовать то чего нет.
кстати покажи строку какую используеш, возможно и с этим проблемы (если через ODBC подключатся, у меня были)
← →
RedKat (2002-10-29 12:32) [7]В рабочем варианте подключение к той-же базе, просто текст запроса перенесен из 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 12:58) [8]значит Jet в чистом виде :-((, (плохо больной что вы не курите, а то бросили бы, помогает :о))).
просто не используй процедуры да и все. или это принципиально? хотя докопатся почему было бы интересно.
← →
sniknik (2002-10-29 14:01) [9]странно но в этой ситуации 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 кому как нравится.
← →
RedKat (2002-10-29 15:16) [10]Значит в моем случае в начале процесса необходимо открыть Connection, а по окончании - закрыть и все будет Ok ?
Но тут возникает др. проблема, программа должна оперативно вносить изменения в БД (задержки крайне не желательны), а открытие/закрытие Connection это очень большое время ;-((
← →
sniknik (2002-10-29 16:07) [11]просто не используй процедуры
не трудно ведь
DMod.ADOCommand1.CommandText:="SELECT FileIdent FROM Files WHERE .....";
DMod.ADOCommand1.Execute;
вместо
DMod.ADOCommand1.CommandText:="EXECUTE .....";
DMod.ADOCommand1.Execute;
гдето внутрях jet-а, можно конечно поискать... но влом.
кстати это ограничение даже не на параметры а на вызовы этих самых процедур. (процедура без параметров тоже вылетает на 2040 м разе)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c