+ -
当前位置:首页 → 问答吧 → delphi多线程查询多个数据库数据,可以同时运行的多线程数目?

delphi多线程查询多个数据库数据,可以同时运行的多线程数目?

时间:2011-08-26

来源:互联网

通过config文件中的IP地址,去查询各IP电脑中的数据库数据,各电脑数据库用户名和密码是相同的。我创建多线程同时查询各数据库中的数据,当查询10个以内的数据库时,程序正常,但当查询多余十个数据库时,程序就死掉了。小弟本人水平有限,求高手帮忙。下面是程序代码。


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  Dialogs, StdCtrls, IniFiles, Grids, DBXpress, DB,ActiveX,
  ComObj, Math, SqlExpr, ADODB;
type
  TForm1 = class(TForm)
  StringGrid1: TStringGrid; //查询数据显示框
  Button1: TButton; //多线程数据库查询按钮
  procedure FormCreate(Sender: TObject);
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
  {数据库IP以及查询数据变量}
  BjServer:string;
  BjZkjbzl, BjZkxmzh, BjSxz, BjZtry: Integer;
  DjLst: TStringList; //数据库IPList
  ThreadsRunning: Integer; //线程计数变量
  procedure ThreadDone(Sender: TObject);
  public
  { Public declarations }
  {多个数据库连接控件--动态创建 }
  UnADOConnection: TADOConnection;
  UnADOQuery: TADOQuery;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
uses
  Unit2;
procedure TForm1.FormCreate(Sender: TObject);
var
  DjIni: TIniFile;
  I: Integer;
begin
  //从config.ini中读取数据库IP地址
  DjIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config.ini');
  DjLst := TStringList.Create;
  BjServer:=DjIni.ReadString('BJMainServer','IP','');
  DjIni.ReadSection('DjServer', DjLst);
  StringGrid1.RowCount := DjLst.Count;//动态增加行
  for I := 0 to DjLst.Count do
  StringGrid1.Cells[0, I] := DjIni.ReadString('DjServer', DjLst.Strings[I-1], '');  
  //创建的线程数目
  ThreadsRunning := DjLst.Count;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  i:Integer;
  IpString:string;
begin
  for i := 2 to DjLst.Count+1 do
  begin
  UnADOConnection:=TADOConnection.Create(nil);
  UnADOConnection.Close; UnADOConnection.ConnectionString := 'Provider=MSDAORA.1;Data Source='+ IPString +';Persist Security Info=True';
  UnADOConnection.LoginPrompt := False;
  try
  UnADOConnection.Open('user', 'password');
  except
  StringGrid1.Cells[5, i] := '数据打开失败';
  UnADOConnection.Free;
  raise;
  Continue;
  end;
  //动态创建数据库连接组件
  UnADOQuery:=TADOQuery.Create(nil);
  UnADOQuery.Connection:= UnADOConnection;
  //创建线程
  with QueryThread.Create(i, UnADOConnection, UnADOQuery) do
  OnTerminate := ThreadDone;
  end;
end;
//线程结束处理函数
procedure TForm1.ThreadDone(Sender: TObject);
begin
  Dec(ThreadsRunning);
  if ThreadsRunning = 0 then //判断线程是否都已经结束
  begin
  ShowMessage('查询完毕');
  end;
end;
end.

查询线程代码如下:
unit Unit2;
interface
uses
  Classes, Windows, SyncObjs, SysUtils, SqlExpr, Forms, ADODB, DB,Variants, StdCtrls, ExtCtrls, FMTBcd;
type
  QueryThread = class(TThread)
  private
  { Private declarations }
  FADOConnection: TADOConnection; { 与查询组件相关的数据感知组件 }
  FADOQuery: TADOQuery; { 线程中的查询组件 }
  FIntRow:Integer;
  protected
  procedure Execute; override;
  public
  constructor Create(introw:Integer; Connection:TADOConnection;Query:TADOQuery);
  end;
implementation

uses
  Unit1;

{ QueryThread }
{ 线程查询类的构造器 }
constructor QueryThread.Create(introw:Integer; Connection:TADOConnection;Query:TADOQuery);
//线程的构造函数,执行初始化工作
begin
  FIntRow:=introw;
  FADOConnection:= Connection;
  FADOQuery:= Query;
  FreeOnTerminate := True; {让线程执行完毕后随即释放}
  inherited Create(False);
end;
procedure QueryThread.Execute;
begin
  AConnection.Connected:=True;
  Query.Close;
  Query.SQL.Clear;
  //数据库查询
  //查询zkxmzh
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Add('select count(rowid) from bj_yw_t_zkxmzh');
  Query.Open;
  Form1.StringGrid1.Cells[1, introw] := IntToStr(Query.Fields[0].AsInteger);
  //查询ztry
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Text:= 'select count(rowid) from bj_yw_t_ztry';
  Query.Open;
  Form1.StringGrid1.Cells[2, introw] := IntToStr(Query.Fields[0].AsInteger);
  //查询sxz
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Text:= 'select count(rowid) from bj_yw_t_sxz';
  Query.Open;
  Form1.StringGrid1.Cells[3, introw] := IntToStr(Query.Fields[0].AsInteger);

  application.ProcessMessages;//同步显示
  AConnection.Connected:=False;
  AConnection.Close;
  Form1.StringGrid1.Cells[4, introw] := '连接成功';
end;
end.

作者: wellwellsen   发布时间: 2011-08-26

代码写的多了点,望高手帮忙,小弟不胜感激

作者: wellwellsen   发布时间: 2011-08-26

热门下载

更多