Периодически при использовании связки ADO 2.8, MS SQL 2000 SP4 и QueueUserWorkItem возникает ошибка:
[DBNETLIB][ConnectionRead (recv()).] General network error. Check your network documentation
Ниже приведен пример для повторения данной ошибки.
Запускать необходимо из-под отладчика т.к. не реализованна обработка исключительной ситуации.
program DBNETLIBRecv2;
{$APPTYPE CONSOLE}
uses
SysUtils,
Windows,
Classes,
ComObj,
Variants,
ActiveX,
ADODB_TLB; // Type Lib: C:\Program Files\Common Files\System\ado\msado27.tlb
const
WT_EXECUTEINIOTHREAD = $00000001;
function QueueUserWorkItem(ACallback: TThreadStartRoutine; AContext: Pointer;
AFlags: ULONG): LongBool; stdcall; external kernel32 name 'QueueUserWorkItem';
procedure RunQuery;
var
cmd: ADODB_TLB.Command;
rs: ADODB_TLB.Recordset;
RecordsAffected: OleVariant;
begin
cmd := CreateComObject(ADODB_TLB.CLASS_Command) as ADODB_TLB.Command;
cmd.Set_ActiveConnection('Provider=SQLOLEDB.1;Server=127.0.0.1;Trusted_Connection=yes;Database=Northwind');
cmd.CommandText := 'select * from dbo.[Order Details]';
cmd.CommandType := ADODB_TLB.adCmdText;
rs := cmd.Execute(RecordsAffected, EmptyParam, 0);
while not rs.EOF do
rs.MoveNext;
end;
function ExecCallback(AContext: Pointer): Integer; stdcall;
begin
CoInitialize(nil);
RunQuery;
CoUninitialize;
Win32Check(QueueUserWorkItem(ExecCallback, nil, WT_EXECUTEINIOTHREAD));
end;
var
i: Integer;
begin
for i:=0 to 10 - 1 do
Win32Check(QueueUserWorkItem(ExecCallback, nil, WT_EXECUTEINIOTHREAD));
Sleep(60000);
end.