数据库中保存了多个服务器的ip、sid、password、database等字段,需要逐个探测各条记录保存的数据连接是否可连接,若逐个测试耗费时间太长,所以我想用多线程来实现,可我是线程编程的菜鸟,请各位大侠指点指点,若能给段简单例程,小弟更是感激不尽!
这几天为此事快憋疯了!

解决方案 »

  1.   

    实在代码太多~~白花花滴分啊~只能眼睁睁地看着他远走... -_-#CSDN论坛浏览器:浏览、发帖、回复、结贴自动平均给分,下载地址:http://CoolSlob.ys168.com
      

  2.   

    可以根据向导生成一个线程类,之后在线程里面的Excte事件下写:
    unit Unit2;interfaceuses
      Classes,ADODB,DB;type
      TDBInfo = class
        //数库服务器信息 ,其它自己添加吧
        ConnectString: String;
      end;  TCheckDB = class(TThread)
      private
        { Private declarations }
        FDBInfo: TDBInfo;
        procedure UpdateUI;
      protected
        procedure Execute; override;
      public
        constructor Create(Suspended: Boolean; DBInfo: TDBInfo);
      end;
    implementation
    uses
      unit1;
    constructor TCheckDB.Create(Suspended: Boolean; DBInfo: TDBInfo);
    begin
      FDBInfo := DBInfo;
    end;procedure TCheckDB.Execute;
    var
      ADO: TADOTable;
    begin
      ADO := TADOTable.Create(nil);
      ADO.Connectionstring := FDBInfo.ConnectString;
      //设置其它相关ADO属性...
      if ADO.Open then
        Synchronize(Update);
      { Place thread code here }
    end;procedure TCheckDB.UpdateUI;
    begin
      Form1.label1.caption := '数库1成功';
    end;
    end.
      

  3.   

    建一个线程(看看资料就知道怎么建了),加上数据库连接字符串为属性参数
    把你所有要连的数据库信息组合成连接字符串放到一个stringlist中,循环该List,
    里面创建线程挂起,然后赋属性参数,再唤醒线程,就可以了
    代码就省了
      

  4.   

    TCheckDB.Create(Suspended: Boolean; DBInfo: TDBInfo)怎么使用阿,线程的Execute中没有调用该过程阿
      

  5.   

    建议LZ最好先找段线程得代码,研究一下。
    DELPHI自带得DEMO中有那么一段。
      

  6.   

    而且在程序中TCheckDB.Create(false,adotable1)也不可行;
      

  7.   

    出现的问题是,我在主程序中使用adotable1.next时提示'句柄无效'
      

  8.   

    如果改成线程内部递归的话,则在主程序TCheckDB.Create(false,adotable1)是提示:‘句柄无效’(注:线程不是无限制递归,用FDBInfo.eof来决定)
      

  9.   

    看看这一段嘛  
    TDBInfo = class
        //数库服务器信息 ,其它自己添加吧
        ConnectString: String;
      end;
    ///下面DBInfo: TDBInfo声明是为了你要测试的数库信息,比如地址,端等等啰而不是叫你传ADOTable进去...
    TCheckDB.Create(Suspended: Boolean; DBInfo: TDBInfo)
      

  10.   

    我是在一窗体的主程序中建立的线程,测试数据连结用的是adoconnectionThrd = class(TThread)
    private
        { Private declarations }
        FDBInfo: string;
        procedure UpdateUI;   
    protected
      procedure Execute; override;
        
    public
        constructor Create(Suspended: Boolean; DBInfo: string);
    end;var
       f_ljqk: Tf_ljqk;implementation{$R *.dfm}constructor Thrd.Create(Suspended: Boolean; DBInfo: string);
    begin
      FDBInfo := DBInfo;
    end;procedure Thrd.Execute;
    var
      ADO: TADOConnection;
    begin
      //self.FreeOnTerminate:=true;
      ADO := TADOConnection.Create(nil);
      ADO.Connectionstring := FDBInfo;
      ado.CommandTimeout:=10;
      ado.ConnectionTimeout:=5;
      if ADO.connected then
        Synchronize(UpdateUI)
      { Place thread code here }  end;procedure Thrd.UpdateUI;
    begin
      //f_ljqk.label1.caption := '数库1成功';
      showmessage('数库成功');end;
    procedure Tf_ljqk.FormCreate(Sender: TObject);
    var
      inifile: TIniFile;
      v_Path,dbconstr,v_dbstr: string;
    begin
       with adoquery1 do
       begin
         while not eof do
         begin
           v_dbstr:='Provider=SQLOLEDB.1;Password='+trim(FieldByName('loadpwd').AsString)+';'+
            'Persist Security Info=True;User ID='+trim(FieldByName('loadid').AsString)+';Initial Catalog=master'+
            ';Data Source='+trim(FieldByName('ip').AsString)+';pooling=false';
          Thrd.Create(false,v_dbstr);
          next; 
         end;
       end;
    end;
      

  11.   

    GARNETT2183(KingWolves (http://kevin-lu.blogspot.com)) ( ) 信誉:100  2006-8-11 14:59:02  得分: 0  
     
     
       
    看看这一段嘛  
    TDBInfo = class
        //数库服务器信息 ,其它自己添加吧
        ConnectString: String;
      end;
    ///下面DBInfo: TDBInfo声明是为了你要测试的数库信息,比如地址,端等等啰而不是叫你传ADOTable进去...
    TCheckDB.Create(Suspended: Boolean; DBInfo: TDBInfo)您能帮我修改一下吗,我的源码如上所示