Ошибка при многократном вызове OpenRowSet (DBASE): Не хватает системных ресурсов

Mamontov
Дата: 12.09.2006 09:13:43
В программе на C++Builder осуществляется интенсивный прием данных из DBASE в MS SQL Server 2000 с помощью OpenRowSet. После определененого количества вызовов возникает ошибка "[OLE/DB provider returned message: [Microsoft][Драйвер ODBC dBase]Недостаточно системных ресурсов.]"
Ситуацию воспроизвел путем выполнения в бесконечном цикле запросов:

truncate table lpu

insert into lpu
(lpu_id,title,code,oms_code,ogrn,department_id)
select lpu_id,name,code,oms_code,ogrn,dep_id
from openrowset('MSDASQL','Driver={Microsoft dBase Driver (*.dbf)};SourceDB=D:\;DefaultDir=D:\;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Russian;Null=No;Deleted=No;',
'SELECT * FROM LPUEX' ) ORDER BY LPU_ID

После выполнения 1541 раза происходит ошибка. И так постоянно. В памяти загружаю еще какие-нибудь программы не связанные с SQL Server и ошибка постоянно выдается через 1011 раз.

Последующее выполнение запросов невозможно. Помогает только перезагрузка сервера.
Как быть?
tpg
Дата: 12.09.2006 09:17:31
Ну, во-первых, привести результат запроса select @@version.
Mamontov
Дата: 12.09.2006 09:25:25
Версия:
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 1)
Mamontov
Дата: 12.09.2006 09:26:59
Версия:
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 1)
tpg
Дата: 12.09.2006 10:08:18
А в QA не пробовали свой цикл делать?
tpg
Дата: 12.09.2006 10:08:46
Да... И версию MDAC покажите.
Mamontov
Дата: 12.09.2006 10:23:58
Выполнил в QA. Эффект тот же самый:

Server: Msg 7399, Level 16, State 1, Line 6
OLE DB provider 'MSDASQL' reported an error. The provider ran out of memory.
[OLE/DB provider returned message: [Microsoft][Драйвер ODBC dBase] Недостаточно системных ресурсов.]
OLE DB error trace [OLE/DB Provider 'MSDASQL' ICommandText::Execute returned 0x8007000e: The provider ran out of memory.].

Подскажите, как узнать версию MDAC.
Mamontov
Дата: 13.09.2006 11:43:59
Спасибо tpg за помощь.
К сожалению:
Ни установка SP4 для SQL Server
Ни отработка OpenRowSet с другим драйвером ODBC
Ни отработка OpenRowSet с другим провайдером Microsoft.Jet.OLEDB.4.0

НЕ ПОМОГЛО!
При этом я не писал, но при каждом выполнении OpenRowSet SQL Server забирает оперативную память и ее не освобождает.

Как можно решить эту проблему:
1) Не использовать OpenRowSet и функции данной группы (OpenQuery, OpenDataSource), то есть использовать отдельный Connect к DBF таблице, а в SQL добавлять записи с помощью TSQL
2) Я провел эксперимент выполнения данной функции на SQL Server 2005:
ТАМ ВСЕ РАБОТАЕТ, вот уже более 2 часов крутится мой бесконечный цикл запущенный в QA (на SQL Server 2000 вылетал через 10 минут), при этом память оперативная не изменяется.
tpg
Дата: 13.09.2006 11:56:05
Mamontov
Подскажите, как узнать версию MDAC.
http://support.microsoft.com/kb/301202/ru