您的位置:首页 > 数据库 > Oracle

Delphi 从tnsnames.ora文件中获取Oracle服务名

2013-04-08 11:39 429 查看
//从注册表中读出tnsnames.ora路径并调用解析函数
procedure TfmLogin.GetServer;
var
reg : Tregistry;
regValue : TStrings;
values : string;
begin
reg := TRegistry.Create;
regValue := TStrings.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKeyReadOnly('SOFTWARE\ORACLE\SYSMAN\OracleDBConsoleorcl');
//reg.GetValueNames(regValue);
values := reg.ReadString('ORACLE_HOME');
values := values + '\NETWORK\ADMIN\tnsnames.ora';
regValue := ParseTnsnames(values);
//ShowMessage(regValue.Text);
cbbDataSoure.Items := regValue;
cbbDataSoure.Items.Delete(cbbDataSoure.Items.Count-1);
finally
reg.CloseKey;
reg.Free;
regValue.Free;
end

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;




参考:http://www.itpub.net/thread-1145748-1-1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: