我用ADO做了个数据库程序到别人的机子上就不能运行了,首先我认为是别人的
机子上没装补丁程序mdac.typ.exe文件,但我装了以后还是运行出错,这时我想
起来我的ADOconnection的connectionstring属性是在程序设计时静态指定的,如
设计时是在e盘,而别人把我的程序拷贝到d盘,那样就肯定会出错了。请问我该
在程序中怎样动态改变ADOconnection的connectionstring属性了?
我的数据库是用access2000创建的,别人机子上没有access2000会不会有问题了?
请多多指教!

解决方案 »

  1.   

    procedure TDataModule1.DataModuleCreate(Sender: TObject);
    var
    s:string;
    begin
     s:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
     s:=s+当前目录+'data\glxt.mdb;';
     s:=s+'Persist Security Info=False';
     ADOConnection1.Connected:=false;
     ADOConnection1.ConnectionString:=s;
    end;
    别人机子上没有access2000不会有问题
      

  2.   

    你可以做一个函数取得当前目录
    Function GetNowPath:string;
    Var
      NowPath:string;
    begin
      GetDir(0,NowPath);
      if GetRightText(NowPath,1)<>'\' then
         nowpath:=nowpath+'\';
      Result:=NowPath;
    end;
      

  3.   

    ADOConnection.ConnectionString :='Provider=xx;Persist Security Info=False;User ID=yy;Password=zz;Initial Catalog=aa;Data Source=IP';
    你把通过向导生成的ConnecionString截取下来,自己往里拼接就行了,注意,IP是指服务器的IP
      

  4.   

    Access文件的路径使用相对路径就可以了,没必要搞得那么麻烦。
    我就这么用的,很好用。
      

  5.   

    to caochsh:我会试试你的方法。
    to heixiu1980:你似乎理解错了我的意思,我做的是单机数据库。
    to flyingkiller:相对路径?我不懂,该怎样去做了?
      

  6.   

    uses 
      adodb
    tmpStr :=PromptDataSource(0,'')
      

  7.   

    tmpStr就是你设置的链接字符串
      

  8.   

    to yhtang:你的意思是说把connectionstring:=tmpstr?
      

  9.   

    在程序中直接连接connectstring:=tempstring
      

  10.   

    to yhtang and qiusw:如果用你们的做法则程序每次启动都会要你选择ole db的提供者,
    数据源,你所在的数据库的目录,而使用你软件的人可能是非专业的人员,怎能要求他们
    这样做了,似乎不太实际。
    拜托各位拉!
      

  11.   

    to caochsh:我试你的方法的时候getrighttext函数没有定义,请给我这个函数。
      

  12.   

    你在设计期生成的串信息,把数据库放在程序的同目录(至少是相对固定的目录便于程序查找),把连接串里面的路径修改为你程序运行时数据库的路径,然后赋值给adoconnectionv.connectionstring不就ok了吗,不会每次都要求选择提供者。
    例如我一个连接excel文件的连接串如下拼接:
    adoConnection1.ConnectionString:= 'DBQ='+ExtractFilePath(Application.ExeName)+'cxxt.xls;DefaultDir='
         +ExtractFilePath(Application.ExeName)+';Driver={Microsoft Excel Driver (*.xls)};DriverId=790;FIL=excel 8.0;FILEDSN='
         +ExtractFilePath(Application.ExeName)+'cxxt.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;ReadOnly=0;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;';
      

  13.   

    Function GetRightText(Text:string;len:integer):string;
    begin
      Result:=copy(text,length(text)-len+1,len);
    end;
      

  14.   

    procedure Tdm.DataModuleCreate(Sender: TObject);
    begin                                                                               
       self.ADOCon.close;        //  :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.exename)+'shdata.mdb;Persist Security Info=False'
       self.ADOCon.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.exename)+'*.mdb;Persist Security Info=False';
       self.ADOCon.Open;end;
      

  15.   

    //设置连接文件到系统目录下
       with dmmain.ADOMain do
          begin
            connectionstring:='Provider=Microsoft.Jet.OLEDB.4.0;'+
                 'Data Source='+ExtractFilePath(paramstr(0))+'sdsf.mdb';
            open;
          end;
    //ExtractFilePath(paramstr(0))为应用程序所在的目录
      

  16.   

    谢谢各位的参与我现在实现了动态设置connectionstring属性,我的程序在自己的机子上
    无论在哪里都能够执行,但一跑到别人的机子上就不行了,我不知这是为什么?
    在别人机子上的出错信息是:exception estackoverflow in module project.exe at 
    0009964D stack over flow.
    请指教拉!
      

  17.   

    先把你机子上的connectionstring中目录设置成你的相对目录
      

  18.   

    例如你的工作目录是d:\aaa
    数据库是d:\aaa\data\a.mdb
    将connectionstring设置为
    系统默认为
    Provider=Microsoft.Jet.OLEDB.4.0;Data Source='d:aaa\data\a.mdb...'
    改为
    Provider=Microsoft.Jet.OLEDB.4.0;Data Source='data\a.mdb...'
    应可以了
      

  19.   

    use function EditConnectionString(TComponent) can build the connectionString
      

  20.   

    如果你想调用Data Link Properties对话框来设置,可以使用PromptDataSource函数或EditConnectionString函数来直接在程序中显示这个对话框;如果你想直接操纵UDL文件来设置,可以使用一个TIniFile类对象来进行读写操作;当然也可以自己创建一个IDataInitialize接口来读写,不过这种方法比较麻烦!
      

  21.   

    To:
     FrameSniper(框架狙击手)  EditConnectionString这函数怎样使用啊?是API吗
      

  22.   

    不是, 好象是在那个PAS里面定义的!忘记了,你输入EditConnectionString,然后按住Ctrl,然后点这个串,看看他在那里定义的!