1. 程式人生 > >delphi如何用儲存資料庫連線引數(INI篇)

delphi如何用儲存資料庫連線引數(INI篇)

在設計資料庫應用程式的時候,經常需要將一些資訊從程式中獨立出來,以保證程式的可移植性。其中最重要的資訊就是資料庫的連線引數。
在Delphi中,獲得正確的資料庫連線引數的方法十分簡單,你只需要建立一個數據模組,在其中新增一個ADO Connection,雙擊之,然後在彈出的視窗中選“Use Connection String”,單擊“Build”按鈕,在“資料鏈接屬性”視窗中選擇適當的驅動引擎,並設定相應的連線引數就可以了。點選“確認”後,系統將自動生成連線串,顯示在Object Inspector的Connection String中。
以Microsoft SQL Server 為例,連線串就類似於: Provider=SQLOLEDB.1;Password=map;Persist Security Info=True;User ID=map;Initial Catalog=SuperWorkFlow;Data Source=GTSERVER 連線串中各項引數由分號(;)分隔,具體含義如下: Provider —— 驅動型別
Data Source —— 伺服器名稱
Initial Catalog —— 資料庫名稱
User ID —— 使用者名稱
Password —— 口令
Persist Security Info —— 是否使用持續安全驗證 現在我們所要做的第一件工作是將各項引數寫入一個INI檔案中。
Windows INI檔案,可解釋為Windows初始化檔案。它是一種專門用來儲存應用程式初始化資訊和執行環境資訊的文字檔案。例如Windows 3.1中兩個著名的INI檔案win.ini和system.ini就在Windows啟動時定義了Windows環境中滑鼠響應速度、使用的外殼(shell)程式等設定,Windows系統附帶的許多應用程式也都有自己的INI檔案。Windows軟體初始化引數的獲取與儲存是通過讀取副檔名為INI的文字檔案實現的,即程式執行前先從制定的INI檔案中搜索到所需的引數,並反映到程式的執行環境中,當程式退出時又將當前的環境引數儲存到制定的INI檔案中。
INI檔案是文字檔案,由若干section組成,在每個帶括號的標題下面,是若干個Keyword和一個等號,每個Keyword會控制應用程式某個功能的工作方式,等號右邊的Value制定Keyword的操作方式,其一般形式如下: [section1]
keyword1=value1
keyword2=value2
[section2]
keyword1=value1
keyword2=value2 其中SectionName和KeywordName分別是段名和關鍵字明,Value為關鍵字對應的設定值,如果等號右邊無任何內容(value為空),表示Windows應用程式已為該Keyword指定了預設值,如果在整個檔案中找不到某個Keyword,同樣表示為它們指定了預設值,各Section所出現的順序是無關緊要的,在每一個Section裡,各個Keyword的順序同樣也無關緊要,Keyword的值的型別多為String或Integer,應分兩種情況讀寫。
INI檔案的書寫有嚴格的要求:
1、Section的名稱必須加以“[”和“]”,且“[”必須在螢幕的第一列。
2、Keyword名稱也必須從螢幕的第一列開始書寫,且後面必須緊跟“=”
3、可以對檔案加以註釋,每行註釋須以“;”開頭。
依照上述規則,我們編寫下面的INI檔案儲存資料庫的連線資訊: [dbParam]
Data Source=GTSERVER
Initial Catalog=SuperWorkFlow
User ID=map
Password=map 下面要做的工作就是編寫程式碼,在程式執行的時候從INI檔案中讀取資料庫連線引數,為此,我編寫了下面的程式碼: //RWini.pas
{
模組名稱:配置檔案讀寫
編寫人:blue
編寫日期:2003-4-26
模組功能:從系統配置檔案中讀取系統執行所需的各項引數
           將系統執行所需的各項引數寫入系統配置檔案
           生成資料庫連線字串
}
unit RWini;
interface
uses INIFiles;
const strINIname = 'db.ini';//INI檔案的檔名,大家根據具體情況修改
var
   iniParam : TINIFile;
   strLocal : String;
   procedure readParam(out server:String;out database:string;out user:string;out password:string);
   procedure writeParam(server:string;database:string;user:string;password:string);
   function getConnStr:string;
implementation    procedure readParam(out server:String;out database:string;out user:string;out password:string);
   begin
     //從配置檔案中讀取資料庫連線引數
     server := iniParam.ReadString('dbParam','Data Source',');
     database := iniParam.ReadString('dbParam','Initial Catalog',');
     user := iniParam.ReadString('dbParam','User ID',');
     password := iniParam.ReadString('dbParam','Password',');
   end;    procedure writeParam(server:string;database:string;user:string;password:string);
   begin
     //將資料庫連線引數寫入配置檔案
     iniParam.WriteString('dbParam','Data Source',server);
     iniParam.WriteString('dbParam','Initial Catalog',database);
     iniParam.WriteString('dbParam','User ID',user);
     iniParam.WriteString('dbParam','Password',password);
   end;    function getConnStr:String;
   var
     server,database,user,password : String;
   begin
     //生成資料庫連線串
     readParam(server,database,user,password);
     result := 'Provider=SQLOLEDB.1;Password=' + password + ';Persist Security Info=True;User ID=' + user + ';Initial Catalog=' + database + ';Data Source=' + server;
   end; initialization
   getDir(0,strLocal);
   iniParam := TINIFile.Create(strLocal + '/' + strINIname); finalization
   iniParam.Free;
end. 在程式資料模組的Create事件中新增下面的程式碼: procedure TDM.DataModuleCreate(Sender: TObject);
var
   confForm : TConf;
begin
   conn.ConnectionString := RWini.getConnStr;
   try
     conn.Open;
   except
     on Err : EOLEException do
     begin
       confForm := TConf.Create(self);
       confForm.ShowModal;
     end;
   end;
end; 這樣,在程式執行過程中,將自動從INI檔案中讀取資料庫連線引數,連線資料庫,如果連接出現錯誤,將顯示引數配置視窗,讓使用者配置資料庫連線引數。配置視窗的程式碼如下: //上面的程式碼省略
uses RWini; {$R *.dfm} procedure TConf.FormShow(Sender: TObject);
var
   sServer,sDatabase,sUser,sPassword : String;
begin
   readParam(sServer,sDatabase,sUser,sPassword);
   self.edtServer.Text := sServer;
   self.edtDatabase.Text := sDatabase;
   self.edtUser.Text := sUser;
   self.edtPassword.Text := sPassword;
   self.ActiveControl := self.btnOK;
end; procedure TConf.btnCancelClick(Sender: TObject);
begin
   close;
end; procedure TConf.btnOKClick(Sender: TObject);
var
   sServer,sDatabase,sUser,sPassword : String;
begin
   sServer := self.edtServer.Text;
   sDatabase := self.edtDatabase.Text;
   sUser := self.edtUser.Text;
   sPassword := self.edtPassword.Text;
   writeParam(sServer,sDatabase,sUser,sPassword);
   close;
end; 是不是很簡單呢?INI檔案不僅可以儲存資料庫連線引數,也同樣可以儲存其他資訊,具體的方法大同小異,我就不再詳述了