第一篇博客:Delphi中修改ODBC數據源

小舅子報名學車,要參加筆試,非要給他弄個考試模擬程序,從昨天下午開始研究別人的程序,終於把MDB中的數據折騰出來了,稍微改了下以前的程序,就算搞定了.突然想起他不會配置ODBC數據源等操作,而我的程序是用Delphi寫的,是通過ODBC訪問的ACCESS數據庫,看來只有在程序裏添加這個功能了.在網上搜了一下,知道了數據源的配置實際上就是註冊表的修改,那就很簡單了;找了個例子參考了一下,中間還折騰了好一會總算把註冊表修改及刪除操作弄清楚了.
添加數據源ks_access:
  registerTemp := TRegistry.Create; //建立一個Registry實例
  with registerTemp do
  begin
     RootKey:=HKEY_CURRENT_USER;//設置根鍵值爲HKEY_CURRENT_USER
    if not OpenKey('Software/ODBC/ODBC.INI/ks_access',False) then //第二個參數要注意爲False
    begin
      if OpenKey('Software/ODBC/ODBC.INI/ODBC Data Sources',True) then
      begin //註冊一個DSN名稱
        WriteString( 'ks_access', 'Microsoft Access Driver (*.mdb)' );
      end
      else
      begin//創建鍵值失敗
        ShowMessage('增加ODBC數據源失敗');
        exit;
      end;
      CloseKey;
      if OpenKey('Software/ODBC/ODBC.INI/ks_access',True) then
      begin
        WriteString( 'DBQ', curdir + '/MyExam.MDB' );//數據庫目錄
        WriteString( 'Description', '駕校考試數據源' );//數據源描述
        WriteString( 'Driver', 'C:/WINDOWS/SYSTEM/odbcjt32.dll' );//驅動程序DLL文件
        WriteInteger( 'DriverId', 25 );//驅動程序標識
        WriteString( 'FIL', 'Ms Access;' );//Filter依據
        WriteInteger( 'SafeTransaction', 0 );//支持的事務操作數目
        WriteString( 'UID', '' );//用戶名稱
        bData[0] := 0;
        WriteBinaryData( 'Exclusive', bData, 1 );//非獨佔方式
        WriteBinaryData( 'ReadOnly', bData, 1 );//非只讀方式
      end
      else//創建鍵值失敗
      begin
        ShowMessage('增加ODBC數據源失敗');
        exit;
      end;
      CloseKey;
      //寫入DSN數據庫引擎配置信息
      if OpenKey('Software/ODBC/ODBC.INI/ks_access/Engines/Jet',True) then
      begin
        WriteString( 'ImplicitCommitSync', 'Yes' );
        WriteInteger( 'MaxBufferSize', 512 );//緩衝區大小
        WriteInteger( 'PageTimeout', 10 );//頁超時
        WriteInteger( 'Threads', 3 );//支持的線程數目
        WriteString( 'UserCommitSync', 'Yes' );
      end
      else//創建鍵值失敗
      begin
          ShowMessage('增加ODBC數據源失敗');
          exit;
      end;
      CloseKey;
    end;
    Free;
  end;

刪除數據源:
  registerTemp:=TRegistry.Create;
  with registerTemp do
  begin
    RootKey:=HKEY_CURRENT_USER;
    try
      if OpenKey('Software/ODBC/ODBC.INI/ks_access/Engines/Jet',False) then //必須OpenKey後才能刪除
      begin
        if not deletevalue('ImplicitCommitSync') then
          exit;
        if not deletevalue('MaxBufferSize') then
          exit;
        if not deletevalue('PageTimeout') then
          exit;
        if not deletevalue('Threads') then
          exit;
        if not deletevalue('UserCommitSync') then
          exit;
      end;
      CloseKey;
      if not DeleteKey('Software/ODBC/ODBC.INI/ks_access/Engines/Jet') then
        exit;
      if not DeleteKey('Software/ODBC/ODBC.INI/ks_access/Engines') then
        exit;
     if OpenKey('Software/ODBC/ODBC.INI/ks_access',False) then
      begin
        if not deletevalue('DBQ') then
          exit;
        if not deletevalue('Description') then
          exit;
        if not deletevalue('Driver') then
          exit;
        if not deletevalue('DriverId') then
          exit;
        if not deletevalue('FIL') then
          exit;
        if not deletevalue('SafeTransaction') then
          exit;
        if not deletevalue('UID') then
          exit;
        if not deletevalue('Exclusive') then
          exit;
        if not deletevalue('ReadOnly') then
          exit;
      end;
      CloseKey;
      if not DeleteKey('Software/ODBC/ODBC.INI/ks_access') then
        exit;
      if OpenKey('Software/ODBC/ODBC.INI/ODBC Data Sources',False) then
      begin
        if not deletevalue('ks_access') then
          exit;
      end;
      CloseKey;
    finally
      Free;
    end;
  end;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章