Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.48 MB
Время: 0.009 c
3-59045
omar
2002-10-30 06:55
2002.11.18
Длительность транзакций


1-59112
_acme
2002-11-08 07:33
2002.11.18
Проблема минимизации


1-59276
Брат
2002-11-07 12:14
2002.11.18
Как узнать, занят ли файл каким-нибудь приложением?


14-59416
gek
2002-10-23 13:48
2002.11.18
Наш ответ поклонникам C,и иже с ними


7-59462
^SANYA
2002-09-15 19:55
2002.11.18
Перехват смены раскладки клавиатуры...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский