1. 程式人生 > 實用技巧 >Delphi 從tnsnames.ora檔案中獲取Oracle服務名

Delphi 從tnsnames.ora檔案中獲取Oracle服務名

1 //從登錄檔中讀出tnsnames.ora路徑並呼叫解析函式
 2 procedure TfmLogin.GetServer;
 3 var
 4   reg : Tregistry;
 5   regValue : TStrings;
 6   values : string;
 7 begin
 8   reg := TRegistry.Create;
 9   regValue := TStrings.Create;
10   try
11     reg.RootKey := HKEY_LOCAL_MACHINE;
12     reg.OpenKeyReadOnly('SOFTWARE\ORACLE\SYSMAN\OracleDBConsoleorcl
'); 13 //reg.GetValueNames(regValue); 14 values := reg.ReadString('ORACLE_HOME'); 15 values := values + '\NETWORK\ADMIN\tnsnames.ora'; 16 regValue := ParseTnsnames(values); 17 //ShowMessage(regValue.Text); 18 cbbDataSoure.Items := regValue; 19 cbbDataSoure.Items.Delete(cbbDataSoure.Items.Count-1
); 20 finally 21 reg.CloseKey; 22 reg.Free; 23 regValue.Free; 24 end 25 26 end;--------------------------------------------------------------------------------------------------------------------獲取oracle主路徑的改進版本,使用遞迴查詢ORACLE_HOME鍵 1 procedure TForm1.btn1Click(Sender: TObject); 2 var
3 reg : Tregistry; 4 regValue : TStrings; 5 values : string; 6 regStr : string; 7 i : Integer; 8 begin 9 regStr := 'SOFTWARE\ORACLE'; 10 reg := TRegistry.Create; 11 regValue := TStrings.Create; 12 13 reg.RootKey := HKEY_LOCAL_MACHINE; 14 //reg.OpenKeyReadOnly('SOFTWARE\ORACLE\SYSMAN\OracleDBConsoleorcl'); 15 16 values := GetPath(reg,regStr); 17 // ShowMessage(values); 18 19 //values := reg.ReadString('ORACLE_HOME'); 20 values := values + '\NETWORK\ADMIN\tnsnames.ora'; 21 regValue := ParseTnsnames(values); 22 ShowMessage(regValue.Text); 23 cbb1.Items := regValue; 24 cbb1.Items.Delete(cbb1.Items.Count-1); 25 26 reg.CloseKey; 27 reg.Free; 28 regValue.Free; 29 end; 30 31 //從登錄檔中遞迴獲取oracle主路徑 32 function TForm1.GetPath(reg : Tregistry ; regPath : string): string; 33 var 34 haskey : TStringList; 35 i : Integer; 36 begin 37 haskey := TStringList.Create; 38 reg.CloseKey; 39 reg.OpenKeyReadOnly(regPath); //注意要關閉之前的操作才能開啟其他主鍵 40 Result := reg.ReadString('ORACLE_HOME'); 41 if reg.HasSubKeys and (Result = '') then //是否有子鍵 42 begin 43 reg.GetKeyNames(haskey); 44 for i := 0 to haskey.Count-1 do 45 begin 46 Result := GetPath(reg,regPath + '\' + haskey[i]); 47 if Result <> '' then 48 Break; 49 end; 50 end; 51 haskey.Free; 52 reg.CloseKey; 53 end;
--------------------------------------------------------------------------------------------------------------------
獲取oracle主路徑的改進版本,使用遞迴查詢ORACLE_HOME鍵
procedure TForm1.btn1Click(Sender: TObject);
var
  reg : Tregistry;
  regValue : TStrings;
  values : string;
  regStr : string;
  i : Integer;
begin
  regStr := 'SOFTWARE\ORACLE';
  reg := TRegistry.Create;
  regValue := TStrings.Create;

  reg.RootKey := HKEY_LOCAL_MACHINE;
 //reg.OpenKeyReadOnly('SOFTWARE\ORACLE\SYSMAN\OracleDBConsoleorcl');

  values := GetPath(reg,regStr);
 // ShowMessage(values);

  //values := reg.ReadString('ORACLE_HOME');
  values := values + '\NETWORK\ADMIN\tnsnames.ora';
  regValue := ParseTnsnames(values);
  ShowMessage(regValue.Text);
  cbb1.Items := regValue;
  cbb1.Items.Delete(cbb1.Items.Count-1);

  reg.CloseKey;
  reg.Free;
  regValue.Free;
end;

//從登錄檔中遞迴獲取oracle主路徑
function TForm1.GetPath(reg : Tregistry ; regPath : string): string;
var
  haskey : TStringList;
  i : Integer;
begin
  haskey := TStringList.Create;
  reg.CloseKey;
  reg.OpenKeyReadOnly(regPath);  //注意要關閉之前的操作才能開啟其他主鍵
  Result := reg.ReadString('ORACLE_HOME');
  if reg.HasSubKeys and (Result = '') then  //是否有子鍵
  begin
    reg.GetKeyNames(haskey);
    for i := 0 to haskey.Count-1 do
    begin
      Result := GetPath(reg,regPath + '\' + haskey[i]);
      if Result <> '' then
         Break;
    end;
  end;
  haskey.Free;
  reg.CloseKey;
end;
//獲取tnsnames.ora檔案的服務名
function TfmLogin.ParseTnsnames(sFileName: String): TStrings;
var
  output: string;
  fileLine: string;
  iGhCnt:integer;// 刮號數量,(加一, )減一;
  i, j: integer;
  sListSrc: TStringList;
  sListDec:TStringList;
  iLength: integer;
  lineChar: Char;
begin
   sListSrc:=TStringList.Create;
   sListDec:=TStringList.Create;
   try
   sListSrc.LoadFromFile(sFileName);
   except
     FreeAndNil(sListSrc);
     result:= sListDec;
     exit;
   end;
  iGhCnt:=0;
  for I := 0 to sListSrc.Count - 1 do
  begin
    fileLine := sListSrc[i];
    fileLine := trim(fileLine);
    iLength := length(fileLine);
    if (Length(fileLine) = 0) or (fileLine[1] = '#') then
      Continue;

    for j := 1 to iLength do
    begin
      lineChar := fileLine[j];
      if lineChar = '(' then
         inc(iGhCnt)
      else if (lineChar = ')') then
        dec(iGhCnt)
      else if (iGhCnt = 0) then
        output := output + lineChar;
    end;

  end;

    output:=StringReplace(output,'=',',',[rfReplaceAll]) ;

    if output='' then
    begin
     FreeAndNil(sListSrc);
     result:= sListDec;
     exit;
    end;

   FreeAndNil(sListSrc);
   sListDec.CommaText:=output;
   result:=sListDec;
end;