通过ADO进行多线程数据库访问

时间:2014-06-19 14:10:46

标签: multithreading delphi

我使用ADO / MSSQL数据库在多线程中进行了基本的类设计 完整的课程设计为here

基本的线程代码是这样的:

constructor PaintBitmapThread.Create(bmp_width, bmp_height: Integer;
  server, databasename, tablename, sqlstr: String; ThreadId: Integer);
begin
    FBitmap  :=TBitmap.create;
    FBitmap.Width := bmp_width;
    FBitmap.Height := bmp_height;
    FBitmap.PixelFormat := pf24bit;

    FConnection :=TAdoConnection.Create(nil);
    fserver := server;
    fdatabasename := databasename;
    ftablename  := tablename;

    FConnection.LoginPrompt := false;
    ConnecttoDatabase(fserver, fdatabasename, FConnection)

end;

destructor PaintBitmapThread.destroy;
begin
   FBitmap.Free;
   FConnection.Free;
  inherited;
end;

procedure PaintBitmapThread.Execute;
 var
   ThreadQuery : TADOQuery;
   k : integer;
 begin
   inherited;

   CoInitialize(nil) ; //CoInitialize was not called

   ThreadQuery := TADOQuery.Create(nil) ;
   try
// ADO DB THREAD MUST USE OWN CONNECTION
     ThreadQuery.Connection := FConnection;
     ThreadQuery.CursorLocation := clUseServer;
     ThreadQuery.LockType := ltReadOnly;
     ThreadQuery.CursorType := ctOpenForwardOnly;
     ThreadQuery.SQL.Text := FSQLStr;

     ThreadQuery.Open;
     while NOT ThreadQuery.Eof and NOT Terminated do
        begin



       //Canvas Does NOT Allow Drawing if not called through Synchronize
       //Synchronize(RefreshCount) ;

        ThreadQuery.Next;
       end;
   finally
     ThreadQuery.Free;
   end;

   CoUninitialize()
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
     fserver := 'localhost\sqlexpress';
     fdatabase := 'test_wbbugfix';
     ftable := 'obj';

     ServerEdit.Text := fserver;
     DatabaseEdit.Text := fdatabase;
     TableEdit.Text := ftable
end;

在离开thread.create构造函数之前,我得到一个像enter image description here下面的屏幕转储一样的AV,

我的代码有什么问题???

1 个答案:

答案 0 :(得分:4)

错误消息说明这里有什么问题。 您正在创建将CreateSuspended参数设置为False的线程。 这意味着线程将在调用构造函数后立即启动。 任何对Start的调用都会导致此异常。

<强>解决方案

创建CreateSuspended标志设置为True的线程。 现在,您可以启动调用Start方法的线程。

除了这个问题,我想指出你的TADOConnectionTADOQuery不在同一个帖子上。这是因为PaintBitmapThread构造函数在创建PaintBitmapThread线程对象的线程的上下文中执行。您可以通过在Execute方法中移动连接构造代码来解决此问题。