我用的是delphi6。0自带的安装制作软件做的数据库安装程序,因为我连的是access数据库,所以就用到了ado的控件,用他的TADOConnection的Connectionstring属性连的我d盘的数据库,也就是说用到了绝对路径,这就有问题了,在我做安装程序的时候我的access数据库文件怎么打包,怎么加也不行,他总是找不到那个access数据库,难道我在安装的程序里必须指定这个数据库的安装路径不行吗?朋友们告诉我用:“ExtractFilePath(Application.ExeName) + 数据库文件名” 
但我还是有些不明白ExtractFilePath(Application.ExeName) + 数据库文件名 
这条指令放在那呀,我真的是从来没有用过,是放到我的应用程序的TADOConnection的Connectionstring属性里吗,还是放到别的什么地方,还有我的每一个窗体都用到了我自己硬盘里的图标,这个也需要怎么做吗?

解决方案 »

  1.   

    用相对路径就是了。
    图标是已二进制形式存入form文件了的,跟路径无关。
      

  2.   

    ExtractFilePath(Application.ExeName) + 数据库文件名 
    替换你用的绝对的数据库文件名
      

  3.   

    你的ADOCONNECTION控件有一个CONNECTIONSTRING 的属性,只要你动态指定这个属性,就可以了,如:
    在adoconnection的OnwillConnect事件中写:
    var
      tmpName : String;
    begin
      tmpName := ExtractFilePath(Application.ExeName) + '数据库文件名';
      adoconnection1.connectionString := '...'+tmpName+'..';
    {以上详细内容根据你的配置补充}
      

  4.   

    那是不是说我得把ADOCONNECTION控件有一个CONNECTIONSTRING 的属性清空,然后在adoconnection的OnwillConnect动态指定呀,那么这样我在没有做安装程序之前我的这个程序还可以运行吗?
      

  5.   

    unit MainData;interfaceuses
      SysUtils, Classes, DB, ADODB, Forms, Windows;Resourcestring
      strConn = 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=%s;'+
                'Mode=Share Deny None;Extended Properties="";Jet OLEDB:System '+
                'database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database '+
                'Password=123;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking '+
                'Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk '+
                'Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create '+
                'System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:'+
                'Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without '+
                'Replica Repair=False;Jet OLEDB:SFP=False';
      strSQl = 'SELECT fName FROM Info WHERE fID = ''%s''';
    type
      TMData = class(TDataModule)
        dbTemp: TADOConnection;
        tblInfo: TADOQuery;
        tblInfofId: TWideStringField;
        tblInfofName: TWideStringField;
        tblInfofSex: TWideStringField;
        tblInfofAge: TIntegerField;
        tblMark: TADOQuery;
        tblMarkfID: TWideStringField;
        tblMarkfChinese: TFloatField;
        tblMarkfMath: TFloatField;
        tblMarkfTotal: TFloatField;
        tblMarkfAverage: TFloatField;
        tblMarkfName: TStringField;
        SearchName: TADOQuery;
        allId: TADOQuery;
        allIdfID: TWideStringField;
        tblMarkfEnglish: TFloatField;
        SearchNamefName: TWideStringField;
        procedure DataModuleCreate(Sender: TObject);
        procedure tblMarkCalcFields(DataSet: TDataSet);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure Dsp_Err(strErr: string);
      end;var
      MData: TMData;implementation{$R *.dfm}procedure TMData.DataModuleCreate(Sender: TObject);
    var
      strFile: string;
    begin
      if dbTemp.Connected then dbTemp.Connected := False;
      strFile := ExtractFileDir(Application.ExeName) + '\temp.mdb';
      dbTemp.ConnectionString := Format(strConn, [strFile]);
      try
        dbTemp.Connected := True;
      except
        //other code
      end;
    end;procedure TMData.Dsp_Err(strErr: string);
    begin
      Application.MessageBox(PChar(strErr),PChar(Application.Title), MB_ICONERROR);
    end;procedure TMData.tblMarkCalcFields(DataSet: TDataSet);
    var
      strName: string;
    begin
      strName := '';
      if SearchName.Active then SearchName.Close;
      SearchName.SQL.Text := Format(strSQl,[tblMarkfID.AsString]);
      try
        SearchName.Open;
        strName := SearchNamefName.AsString;
      except  end;
      tblMarkfName.AsString := strName;//通过“编号”找出“姓名”  tblMarkfTotal.AsFloat := tblMarkfChinese.AsFloat + tblMarkfMath.AsFloat + tblMarkfEnglish.AsFloat;
      tblMarkfAverage.AsFloat := tblMarkfTotal.AsFloat / 3;
    end;end.
      

  6.   

    那ADOCONNECTION控件的监视器的CONNECTIONSTRING 属性用不用改呀!