我用Delphi的ADO连接SQL Server,奇怪的是,发布时居然要配置一下客户的ODBC才能连接成功!而后就是删除ODBC配置都无所谓,而我明明都是用ADO连接数据库的啊 !
ADO怎么会这样的,(我是用Delphi7的)              
怎么办?才能不用客户配ODBC?!

解决方案 »

  1.   

    你不要用 odbc 来连接数据库啊
    使用 jet4.0 不行吗?(你不会连这个不知道吧?)
      

  2.   

    你一定是用了ado下的odbc驱动访问的数据库,即Microsoft OLE DB provider for ODBC试试Microsoft OLE DB provider for SQL Server
      

  3.   

    支持WuJunLiang(亮)的说法,用这个连,一定没有错啊
      

  4.   

    不一定吧,我也遇到和楼主类似的问题,我是用ADO+SQL开发的,发布的时候却必须配置ODBC,连接SQL数据库。
      

  5.   

    如果你连接数据库确实使用了ADO的OLEDB对象,那么,可以考虑在客户的机子上安装MDAC2.7/8
      

  6.   

    你的connectionstring里面就是使用dsn作为连接的,发布当然需要配置dsn了,你是用别的阿,不要使用dsn,在配置里面使用连接字符串!!
      

  7.   

    我也喜欢用ado
    不过是用ado+access
    本人已经解决了连接的问题,发布后不用做任何dsn配置,其方法是在program Project1;中加入以下几句:
    varconntion:string;begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TDM, DM);
      conntion:='Provider=MSDASQL.1;Password=yourpassword;Persist Security Info=False;Extended Properties="DBQ=';
      conntion:=conntion+ExtractFilePath(Application.ExeName);
      conntion:=conntion+'db\personnel.mdb;DefaultDir='+ExtractFilePath(Application.ExeName)+'db;Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"';
    unit2.DM.ado1.ConnectionString:=conntion;如此unit2.dm.ado1便不用做任何属性设置了,
    发布时只要把personnel.mdb放在应用程序下的db目录中即可,
    不知sql server能不能参照执行?另我也有一问题请指教
    http://community.csdn.net/Expert/topic/3237/3237134.xml?temp=.8410761
      

  8.   

    今天刚好请个高手给我讲解了一下,如果使用ado下的驱动Microsoft OLE DB provider for SQL Server访问Sql Server 数据库,也要配置ODBC.
      

  9.   

    不可能,如果用ADO还要配置ODBC的话,哪还要ADO干吗?
      

  10.   

    这种情况可能是在win98下会出现的情况,win98下的默认网络协议不是tcp/ip,是命名管道,我估计是这个问题
      

  11.   

    在ADO的connectionstring属性通过动态赋字符串,如串1(用于连接MASTER库)、串2(用于连接你的应用程序所访问的数据库)如此做的好处是当你需要还原数据库时连接串1即可,动态建一个INI文件再配合一个服务器设置界面对以下变量赋值即可:
    [DATABASE]
    Driver Name=MSSQL
    DATABASE NAME=Master
    SERVER NAME=SD   //此处的SD通过主窗的ONCREATE事件获取机器名
    OPEN MODE=READ/WRITE
    USER NAME=sa  //此处的用户名及密码通过服务器设置界面写入
    PASSWORD=sa
    如下:
      servs :=  SYSINI.ReadString('DATABASE','SERVER NAME','');
      users :=  SYSINI.ReadString('DATABASE','USER NAME','');
      paswds :=  SYSINI.ReadString('DATABASE','PASSWORD','');《串1》  consmaster := 'Provider=SQLOLEDB.1;Password='+paswds+';Persist Security Info=True;'+
      'User ID='+users+';Initial Catalog=master;Data Source='+servs+';'+
                    'Use Procedure for Prepare=1;Auto Translate=True;'+
                     'Packet Size=4096;Workstation ID='+servs;《串2》   connstr := 'Provider=SQLOLEDB.1;Password='+paswds+';Persist Security Info=True;'+
                           'User ID='+users+';Initial Catalog=SSMIS;Data Source='+servs+';'+
                           'Use Procedure for Prepare=1;Auto Translate=True;'+
                           'Packet Size=4096;Workstation ID='+servs;试试吧,包你好用,还不赶快谢谢我。
      

  12.   

    通过ADO连接SQL SERVER数据库,是不用通过ODBC,微软给自己的OLEDB专门进行了优化,直接连接,但是必须使用Microsoft OLE DB provider for SQL Server,具体的资料可以参考SQL SERVER 2000相关资料
      

  13.   

    可能是命名管道访问的缘故吧,因为window默认的是命名管道访问,而不是通过TCP/IP访问,没有接触过delphi不好说.
      

  14.   


    //-------初次访问数据库,设定访问的方式为“TCP/IP”端口1433的访问方式---------
      CheckDSN(Trim(EditDataBase.Text));
      DataBase_Registry(Trim(EditServer.Text));  ADOConnectionTest.Connected:=False;
      ADOConnectionTest.ConnectionString:=ConnectSTR;
      ADOConnectionTest.LoginPrompt:=False;procedure TLoginFrm.CheckDSN(a_DataSource: string);
    var
      ODBC_Reg1,ODBC_Reg2: TRegistry;
      Driver_Name: string;
    begin
      ODBC_Reg1:=TRegistry.Create;
      ODBC_Reg2:=TRegistry.Create;  try
        ODBC_Reg1.RootKey:=HKEY_LOCAL_MACHINE;
        ODBC_Reg2.RootKey:=HKEY_CURRENT_USER;    if ODBC_Reg1.OpenKey('SOFTWARE\ODBC\ODBCINST.INI\SQL Server',False) then
          Driver_Name:=ODBC_Reg1.ReadString('Driver')
        else
          exit;       ODBC_Reg2.CloseKey;
        if (ODBC_Reg1.OpenKey('Software\ODBC\ODBC.INI\'+a_DataSource,False)) or
           (ODBC_Reg2.OpenKey('Software\ODBC\ODBC.INI\'+a_DataSource,False))
        then
          RemoveDSN(a_DataSource);    ODBC_Reg2.CloseKey;
        if ODBC_Reg2.OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
        begin
          ODBC_Reg2.WriteString(a_DataSource,'SQL Server');
        end
        else Exit;    ODBC_Reg2.CloseKey;
        if ODBC_Reg2.OpenKey('Software\ODBC\ODBC.INI\'+a_DataSource,True) then
        begin
          ODBC_Reg2.WriteString('Server',EditServer.Text);
          ODBC_Reg2.WriteString('Database','master');
          ODBC_Reg2.WriteString('Driver',Driver_Name);
          ODBC_Reg2.WriteString('LastUser',EditUser_ID.Text);
          ODBC_Reg2.WriteString('Password',EditPassword.Text);
        end;    ODBC_Reg1.CloseKey;
        ODBC_Reg2.CloseKey;
      finally
        ODBC_Reg1.Free;
        ODBC_Reg2.Free;
      end;
    end;
    procedure TLoginFrm.DataBase_Registry(a_DataSource: string);
    var
      DataBase_Reg1: TRegistry;
    begin
      DataBase_Reg1:=TRegistry.Create;  try
        DataBase_Reg1.RootKey:=HKEY_LOCAL_MACHINE;    if DataBase_Reg1.OpenKey('SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo',True) then
           DataBase_Reg1.WriteString(a_DataSource,'DBMSSOCN,' + a_DataSource);    DataBase_Reg1.CloseKey;
      finally
        DataBase_Reg1.Free;
      end;
    end;