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;
复制代码

 

posted on   癫狂编程  阅读(221)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2019-08-27 oracle数据库死锁原因及分析

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示