我用delphi6和access2000数据库做了一个人事管理系统,现在发现用Install shield Express将其打包作成安装盘的时候,odbc数据源老是注册不上。这样的程序到底应该如何打包呢?哪位高手能写一个详细步骤给我参考一下吗?BDE,尤其是数据库别名、路径 那里应该如何设置呢?谢谢了

解决方案 »

  1.   

    最好改用ADO,发布的时候就不用装什么odbc和BDE啦,直接拷贝程序和access文件就好了。
      

  2.   

    可是我的ado用的是odbc的连接字符串呀,也可以吗?
      

  3.   

    Object/merge Moudles
       在右边的选择框里选一个你要装的,会弹出以对话框,照对话框做既可
      

  4.   

    根据你的情况修改下成的内容。然后存盘为111.reg。在客户的电脑双击使可注册
    ----------------------------------
    Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\我的数据]
    "Driver"="C:\\WINNT\\System32\\odbcjt32.dll"
    "DBQ"="D:\\VB5\\BIBLIO.MDB"
    "Description"="测试用"
    "DriverId"=dword:00000019
    "FIL"="MS Access;"
    "SafeTransactions"=dword:00000000
    "UID"=""[HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\我的数据\Engines][HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\我的数据\Engines\Jet]
    "ImplicitCommitSync"=""
    "MaxBufferSize"=dword:00000800
    "PageTimeout"=dword:00000005
    "Threads"=dword:00000003
    "UserCommitSync"="Yes"
      

  5.   

    "Driver"="C:\\WINNT\\System32\\odbcjt32.dll"
    "DBQ"="D:\\VB5\\BIBLIO.MDB"这两句里的“\\”是否应该为“\”???Rootkey是HKEY_CURRENT_USER吗?
    不是HKEY_LOCAL_MACHINE吗?还是随便哪个都可以?
      

  6.   

    改成动态配置数据库//***************************************************
    //目的:读取驱动程序位置
    //参数: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;
      

  7.   

    直接在程序里面建立,因为你数据库文件存放的路径是变化的,用REG文件不能解决.
    procedure TForm1.Button1Click(Sender: TObject);
    var
      pFn: TSQLConfigDataSource;
      hLib: LongWord;
      strDriver: string;
      strHome: string;
      strAttr: string;
      strFile: string;
      fResult: BOOL;
      ModName: array[0..MAX_PATH] of Char;
      srInfo : TSearchRec;
    begin
       Windows.GetModuleFileName( HInstance, ModName, SizeOf(ModName) );
      strHome := ModName;
        strfile:=extractfilepath(application.ExeName)+'2002.mdb';
        //strfile:=extractfileDIR(application.ExeName);    self.Caption:=strfile;
      hLib := LoadLibrary( 'ODBCCP32' );
      if( hLib <> NULL ) then
      begin
      @pFn := GetProcAddress( hLib, 'SQLConfigDataSource' );
      if( @pFn <> nil ) then
      begin
     messagebox(handle,'test','succ',mb_ok);
     strDriver := 'Microsoft Access Driver (*.mdb)';
      strAttr := Format( 'DSN=myTEST'+#0+
      'DBQ=%s'+#0+
      'Exclusive=1'+#0+
      'Description=Test Data'+#0+#0,
      [strFile] );
         fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
      if( fResult = false ) then ShowMessage( '创建MDB文件失败!' );
       FreeLibrary( hLib );end;
     end;
    end;
      

  8.   

    最简单的方式--------
    不要用odbc,在程序里直接实用ado,
    在数据库连接前这样
    mainconn.ConnectString := '...............';
    mainConn.OPen;这样最好的了,不用发布什么东西,只要exe就行了