在做数据库程序时不妨会用到ODBC来做数据连接,但每客户配置ODBC显得相当麻烦,大家也知道可以通过修改注册表来建立ODBC数据源,但我在做设置好服务端参数:
1.数据源的名称
2.服务器地址
3.默认的数据库
4.连接的用户及密码在Delphi中该用什么方式来测试此ODBC数据源是否真的连接成功呢?以此来做一个像Windows中的ODBC数据源的测试哪种,成功则弹出"测试成功"
最好能给付点源码,问题解决就结贴且给出主要回答人。

解决方案 »

  1.   

    我不通过odbc ,我直接连接oledb
    另:delphi 只要用
     try  
       
       xxxx.open;
     except 来测试是否真的连接成功就行了。
      

  2.   

    用一个数据库控件
    然后判断connected属性
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ADODB, Db, Registry, Midas, DBTables, Grids, DBGrids;type
      TForm1 = class(TForm)
        Button1: TButton;
        OpenDialog1: TOpenDialog;
        Database1: TDatabase;
        Query1: TQuery;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        procedure Button1Click(Sender: TObject);
        procedure ADOConnection1Login(Sender: TObject; Username,
          Password: String);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      Function ReadODBCDriver(AName: String):String;
      Function CreateMsAccess(AName: String; APath: String; ADriver:String):Boolean;
    implementation{$R *.DFM}//***************************************************
    //目的:读取驱动程序位置
    //参数:AName--要读取的数据库驱动类型的标志(自己可以任意定制)
    //***************************************************
    Function ReadODBCDriver(AName: String):String;
    var
      registerTemp: TRegistry;
      s:string;
    begin  registerTemp:=TRegistry.Create;
      if AName='Access' then
      begin
        with registerTemp do
        begin
          RootKey:=HKEY_LOCAL_MACHINE;
          if OpenKey('Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',True) then
          begin
            s:=ReadString('Driver');
            ReadODBCDriver:=ReadString('Driver');
            CloseKey;
            Free;
            Exit;
          end;
        end;
      end;
      registerTemp.Free;
      ReadODBCDriver:=''; end;//****************************************************
    //目的:建立数据库驱动程序并配置
    //参数:AName--要建立的ODBC数据库别名
    //      APath--要连接的数据库路径名称
    //      ADriver--ODBC驱动名称,由系统获取
    //****************************************************
    Function CreateMsAccess(AName: String; APath: String; ADriver: String):Boolean;
    var
      registerTemp:TRegistry;
      bData:array[0..0] of byte;
    begin  if ADriver='' then
      begin
        //ShowMessage('读取ODBC驱动程序失败,请重新安装ODBC!');
        CreateMsAccess:=False;
        Exit;
      end;
      
      registerTemp:=TRegistry.Create;
      CreateMsAccess:=True;
      with registerTemp do
      begin
        RootKey:=HKEY_LOCAL_MACHINE;
        if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
        begin
          //注册一个DSN名称--AName
          WriteString(AName,'Microsoft Access Driver (*.mdb)');
        end
        else
        begin
          CreateMsAccess:=False;
          Exit; 
        end;
        CloseKey;
        
        //写入DSN配置信息
        if OpenKey('Software\ODBC\ODBC.INI\'+AName,True) then
        begin
          //数据库目录,连接你的数据库
          WriteString('DBQ',APath);
         
          //数据源描述 --任意修改??????????
          WriteString('Description','Nsky Access DataBase');      //驱动程序DLL文件
          WriteString('Driver',ADriver);      //驱动程序标志
          WriteInteger('DriverId',25);      //Filter依据
          WriteString('FIL','Ms Access;');      //支持的事务操作数目
          WriteInteger('SafeTransaction',0);      //用户名称
          WriteString('UID','');      //用户密码--可以修改定制??????????
          WriteString('PWD','nsky');
          
          bData[0]:=0;
          //非独占方式
          WriteBinaryData('Exclusive',bData,1);      //非只读方式
          WriteBinaryData('ReadOnly',bData,1);     
        end
        else
        begin
          CreateMsAccess:=False;
          Exit;
        end; 
        CloseKey;
        
        //写入DSN数据库引擎配置信息
        if OpenKey('Software\ODBC\ODBC.INI\'+AName+'\Engines\Jet',True) then
        begin
          WriteString('ImplicitCommitSync','Yes');
          //缓冲区大小
          WriteInteger('MaxBufferSize',512);      //页超时
          WriteInteger('PageTimeout',10);     //支持的线程数目
         WriteInteger('Threads',3);
        
         WriteString('UserCommitSync','Yes');
        end
        else
        begin
          CreateMsAccess:=False;
          Exit;
        end;
        CloseKey;
        Free;
      end;    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      FileName:String;
      s:string;
    begin
      s:='select * from tab_answ where A10 like ''11%'' and (E2 = '''' or E2 is null)'+' order by A13 ASC,A1 DESC';
      if OpenDialog1.Execute then
      begin    FileName:=OpenDialog1.FileName;
        //创建ODBC
        if CreateMsAccess('TemAccess',FileName,ReadODBCDriver('Access')) = False then
        begin
          ShowMessage('数据库连接错误,请与公司联系!');
          Application.Terminate;
        end;
        //连接ODBC
        Database1.Connected:=False;
        Database1.AliasName := 'TemAccess';
        Database1.DatabaseName := 'TemAccess';
        Database1.Connected := True;
        Query1.DatabaseName := DataBase1.DatabaseName ;
        Query1.RequestLive := True;
        with Query1 do
        begin
          Close;
          SQL.Clear;
          SQL.Add(s);
          Open;
        end;    if Query1.CanModify = true then
          showmessage('ok')
        else
          showmessage('no');
      end;end;