線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1108
推到 Plurk!
推到 Facebook!

在程式中,動態連到不同的 oracle database

 
lacoste
一般會員


發表:8
回覆:1
積分:1
註冊:2002-05-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-09 18:09:13 IP:61.222.xxx.xxx 未訂閱
因為想在程式中...動態連到不同的 oracle database 所以就寫個小程式來捉 tnsnames.ora 裡的 tns name 資料 程式寫的不怎麼漂亮...請多多指教  
 
procedure TfrmNewStationType.FormShow(Sender: TObject);
var tstrTNS,tstrTNS_Name:tstringlist;
    i,j,iPos,iSLIndex:integer;
    Reg:TRegistry;
    sOracleHome,FileToFind,sTNS: string;
begin       // 找 ORACLE HOME 的路徑
   Reg := Tregistry.Create;
   try
      reg.RootKey := HKEY_LOCAL_MACHINE;
      if reg.OpenKeyReadOnly('\SOFTWARE\ORACLE\HOME0') then begin
         sOracleHome:=reg.ReadString('ORACLE_HOME');
         reg.CloseKey;
      end;
   finally
      reg.Free;
   end;
   // 然後再找 TNSNAMES.ORA
   if trim(sOracleHome) <> '' then begin
      FileToFind:=FileSearch('tnsnames.ora',sOracleHome '\network\admin\');
      if FileToFind <> '' then begin
         comboTNS.Clear;
         try
            tstrTNS:=tstringlist.Create;
            tstrTNS_Name :=tstringlist.Create;
            tstrTNS.LoadFromFile(FileToFind);// 將 TNSNAMES.ORA LOAD 到 TSTRINGLIST
            
            // 這迴圈是要將 註解提示符號 # 後的資料清掉,以及空的 ROW 清掉 - BEGIN
            for i:=tstrTNS.Count-1 downto 0 do begin 
               iPos:=pos('#',tstrTNS.Strings[i]);
               if iPos <> 0 then begin
                  tstrTNS.strings[i] :=  trim(copy(tstrTNS.strings[i],1,iPos-1));
               end;
               if trim(tstrTNS.strings[i]) = '' then begin
                  tstrTNS.Delete(i);
               end;
            end;
            // 這迴圈是要將 註解提示符號 # 後的資料清掉,以及空的 ROW 清掉 - END
 
            // 將 tstrTNS 的資料移到 sTNS - BEGIN
            sTNS:='';
            for i:=0 to tstrTNS.Count-1 do begin
                sTNS:=sTNS trim(tstrTNS.strings[i]);
            end;
            tstrTNS.Clear;
            // 將 tstrTNS 的資料移到 sTNS - END
      
            // 這迴圈的目的是捉 TNS NAME - BEGIN
            iSLIndex:=0;
            tstrTNS.Add('');
            for i:=0 to length(sTNS) do begin
                case sTNS[i] of
                  '=': ;
                  '(': begin
                          tstrTNS.Add('(');
                          tstrTNS.Add('');
                          iSLIndex:=iSLIndex 2;
                       end;
   
                  ')': begin
                          j:= tstrTNS.count-1;
                          while true do begin
                            if tstrTNS.Strings[j] = '(' then begin
                               tstrTNS.Delete(j);
                               iSLIndex:=j-1;
                               break;
                            end else begin
                               tstrTNS.Delete(j);
                            end;
                            dec(j);
                          end;
                          if tstrTNS.count = 1 then begin
                             //將TNS NAME 另存在 tstrTNS_Name
                             tstrTNS_Name.Add(trim(tstrTNS.Strings[0])); 
                             tstrTNS.Strings[0] := '';
                          end;
                       end;
                else
                    tstrTNS.Strings[iSLIndex]:=tstrTNS.Strings[iSLIndex] sTNS[i];
                end;
            end;
            // 這迴圈的目的是捉 TNS NAME - END
                            comboTNS.Items.Assign(tstrTNS_Name);
         finally
            tstrTNS_Name.Free;
            tstrTNS.Free;
         end;
      end;
   end;
end;
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-09 18:20:37 IP:218.32.xxx.xxx 未訂閱
不一定非搞 tnsnames.ora file 不可. 如 tnsname :
HORA8 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.15.1.1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = HORA8)
    )
  )
其實 connect string 可以直接給後面的 description string 如 : (DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST =192.15.1.1)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = HORA8))) 資料庫種類繁多, 記得先說用啥資料庫喔
系統時間:2024-06-23 11:04:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!