Ошибка при использовании ADO, MSSQL и QueueUserWorkItem
От: kuda2004  
Дата: 01.08.05 11:09
Оценка:
Периодически при использовании связки 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.