各位:
   我现遇到一个问题,想大家帮忙:
    关于用D6如何编写程序自动设置数据源 (ODBC)

解决方案 »

  1.   

    api我不知道。
    修改注册表可以
      

  2.   

    这个是BCB 代码改改看看C++ builder 动态设定odbc数据源
     
    本文以access为例
    需要文件 odbcinst.h(bcb或vc的include目录) odbccp32.dll(winnt\system32\目录) implib.exe(通过dll生成lib库) coff2omf.exe (将coff库转化为omf库)首先将上面文件拷贝到工程目录,
    执行下面命令:
    implib.exe odbccp32.lib odbccp32.dll
    coff2omf Odbccp32.lib下面程序的功能为当应用程序启动时,动态添加/修改一个指向当前目录的,名为test的系 统数据源。
    新建一个工程,在工程主文件(含有winmain函数)中添加
    #include <odbcinst.h>
    USELIB("odbccp32.lib");//lib在工程当前目录修改后的代码如下;
    file://---------------------------------------------------------------------------#include <vcl.h>
    #include <odbcinst.h>#pragma hdrstop
    USEFORM("main.cpp", Form1);
    file://工程的其他单元申明.....
    USELIB("odbccp32.lib");
    file://---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    try
    {Application->Initialize();
    AnsiString Data,DataPath,dbpath;
    unsigned char temp[255];//接收转化后的连接字符串
    LPSTR ch;//字符串指针相当于char *
    DataPath=GetCurrentDir();//获取当前目录 
    Data=DataPath+"\\test.mdb\b";//假定当前数据库为test.mdb
    dbpath="DSN=test\bDBQ="+Data+"DEFAULTDIR="+DataPath+"\b\b";
    file://构造odbc连接字符串,test为数据源名,非法字符先用\b代替ch=dbpath.c_str();//将AnsiString转化为字符串
    int i=0;
    while(*ch!='\0')//查找并替换非法字符,并装入字符数组
    {if(*ch=='\b')
    *ch='\0';
    temp[i]=*ch;
    ch++;
    i++;
    }
    if(::SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,(LPSTR)"Microsoft Access Driver (*.mdb)\0",(LPSTR)temp))//修改或添加数据源,如果成功,程序正常启动
    {Application->Title = "动态设定odbc数据源";Application->CreateForm(__classid(TForm1), &Form1);Application->Run();
    }
    else
    {
    ShowMessage("数据库设定失败!");
    Application->Terminate(); 
    }
    }
    catch (Exception &exception)
    {
    Application->ShowException(&exception);
    }
    return 0;
    }
    file://---------------------------------------------------------------------------
     
      

  3.   

    其中
    SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,(LPSTR)  配置ODBC
      

  4.   

    odbc其实就写在注册表中了。给你段代码参考一下:procedure TFrmMain.CreateReg();
    var
      Reg : TRegistry;
      SysDir : PChar;
      SystemDir : String;
      AppDir : String;
    begin
      Reg := TRegistry.Create;
      with Reg do
        begin
          Try
            GetMem(SysDir,255);
            GetSystemDirectory(SysDir,255);
            SystemDir := String(SysDir);
            FreeMem(SysDir);
            AppDir := ExtractFilePath(Application.ExeName);
            RootKey:=HKEY_LOCAL_MACHINE;
            if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
              WriteString( 'Cpic', 'Microsoft Access Driver (*.mdb)' );
            CloseKey;
            if OpenKey('Software\ODBC\ODBC.INI\Cpic',True) then
              begin
                WriteString( 'DBQ', AppDir + 'DataBase\CPIC.MDB' );
                WriteString( 'Driver', SystemDir + '\odbcjt32.dll' );
                WriteInteger( 'DriverId', 25 );
                WriteString( 'FIL', 'Ms Access;' );
                WriteInteger( 'SafeTransaction', 0 );
                WriteString( 'UID', '' );
              end;
            CloseKey;
            if OpenKey('Software\ODBC\ODBC.INI\Cpic\Engines\Jet',True) then
              begin
                WriteString( 'ImplicitCommitSync', '' );
                WriteInteger( 'MaxBufferSize', 2048 );
                WriteInteger( 'PageTimeout', 5 );
                WriteInteger( 'Threads', 3 );
                WriteString( 'UserCommitSync', 'Yes' );
              end;
            CloseKey;
            Free;
          except
            Application.MessageBox('系统初始化失败!','提示',0+64);
            CloseKey;
            Free;
            exit;
          end;
        end;
    end;
      

  5.   

    从注册表导出ODBC数据源分支(9x/NT两种),安装ODBC时判断操作系统类型后执行以下命令(WinExec, ShellExe...):
        regedit /s ODBC_9x.reg
      

  6.   

    ---- ODBC管理程序设置DSN的秘密在注册表中,不信可以到HKEY_LOCAL_MACHINE\Software\ODBC去看看,肯定让你感觉已经成功了一半. ---- 首先来看看系统中已安装的ODBC数据库驱动程序.在HKEY_LOCAL_MACHINE\Software\ODBC\ ODBCInst.INI中,存放着已经安装了的ODBC数据库驱动程序的信息,从这里可以查到已安装的ODBC数据库驱动程序对应的DLL文件等信息.在ODBCInst.INI\ODBC Drivers的各个键值中,键名是驱动程序名称(如Microsoft Access Driver(*.mdb)),键值为“Installed”,表示驱动程序已安装.在 ODBCInst.INI\DriverName(DriverName为一个驱动程序名称,如Microsoft Access Driver(*.mdb)) 中,有驱动程序的详细信息,我们主要从这里获得ODBC驱动程序对应的DLL文件的路径和文件名,即键名Driver的键值,一般为"C:\WINDOWS\SYSTEM\FileName.DLL"。
      

  7.   

    直接写注册表就可以阿
    procedure TFrmSet.SpeedButton4Click(Sender: TObject);
    var ODBC_1,ODBC_2:Tregistry;
    begin
      if Trim(Edit3.Text)='' then
        begin
          Application.MessageBox('ODBC名称不能为空值,请重新填写!','提示',MB_OK+MB_IConinformation);
          Exit;
        end;
      if Trim(Edit4.Text)='' then
        begin
          Application.MessageBox('请确定Fox文件所在的位置!','提示',MB_OK+MB_IConinformation);
          Exit;
        end;
     try
      ODBC_1:=Tregistry.Create;
      ODBC_1.RootKey:=HKEY_LOCAL_MACHINE;
      ODBC_1.CreateKey('Software\ODBC\ODBC.INI\'+Trim(edit3.Text));
      ODBC_1.OpenKey('Software\ODBC\ODBC.INI\'+Trim(edit3.Text),false);
      ODBC_1.WriteString('Backgroundfetch','Yes');
      ODBC_1.WriteString('Collate','Machine');
      ODBC_1.WriteString('Deleted','yes');
      ODBC_1.WriteString('Description','');
      ODBC_1.WriteString('Driver','C:\WiNNT\SYStems32\vfpodbc.dll');
      ODBC_1.WriteString('Exclusive','NO');
      ODBC_1.WriteString('NULL','Yes');
      ODBC_1.WriteString('SetNoCountOn','NO');
      ODBC_1.WriteString('SourceDB',Trim(ExtractFileDir(Edit4.Text)));
      ODBC_1.WriteString('SourceType','DBF');
      ODBC_2:=Tregistry.Create;
      ODBC_2.RootKey:=HKEY_LOCAL_MACHINE;
      ODBC_2.OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',true);
      ODBC_2.WriteString(Trim(Edit3.Text),'Microsoft FoxPro VFP Driver (*.dbf)');
      Application.MessageBox('配置ODBC成功!','提示',MB_OK+MB_Iconinformation);
     except
       Application.MessageBox('配置ODBC出现错误,请重新配置!','提示',MB_OK+MB_Iconerror);
       Exit;
     end;
    end;
    一个简单的例子
      

  8.   

    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.dbf';
        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 FoxPro VFP Driver (*.dbf)';
      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( '创建DBF文件失败!' );
       FreeLibrary( hLib );
     end;
     end;end;
      

  9.   

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