를 한번 만들어 보았습니다.
Orange랑 , Toad 툴에서 가장 먼저 만나는 화면이 커낵션 선택 화면인데 거기서
콤보박스에 들어있는 TNS Name들을 어떻게 가지고 올까 궁금해서 한번 만들어 보았습니다.
타 사이트를 참고 해보니 닷넷으로 구현한 사람이 있더군요.
http://mydotnet.wordpress.com/2008/12/25/getting-oracle-tns-names-for-your-connect-to-database-form/
아래 함수는 Oracle9i 기준입니다.. ㅎㅎ 제가 9버젼 밖에 없어서..유유
Oracle10g 는 Registry에 오라클경로를 좀 다르게 가지고 가는가 보더군요.
9i
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
10g
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_Ora10gClient
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient10g_home1
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_client
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1
9i는 제 PC 레지스트리 직접 뒤져서 확인 했습니다.
어차피 레지스트리에서는 오라클 홈 절대 경로만 구하면 되기 때문에 어렵지 않게 업글은 될듯 싶네요.
콤보에서 선택된 TNS를 ConnectionString에 Data Source 필드의 값으로 쓰시면 합니다.
콤보 변경 시 마다 아이디 페스워드 변경하고 ConnectionString 재 조립해서 ADOConnection 쓰면 될 거같군요.
즐 프로그램 하세여~~!
void __fastcall TnsLoader( TComboBox *Target , TStatusPanel *OutSet )
{
AnsiString TnsNamePath;
TRegistry * myReg = new TRegistry( KEY_READ );
try
{
myReg->RootKey = HKEY_LOCAL_MACHINE;
myReg->OpenKey("SOFTWARE\\ORACLE",false);
TnsNamePath = myReg->ReadString("ORACLE_HOME");
}
__finally
{
delete myReg;
}
TnsNamePath = TnsNamePath.Trim();
if( TnsNamePath.Length() > 0 ) TnsNamePath += TNSNAMEPATH;
else return;
if( OutSet != 0x00 ) OutSet->Text = TnsNamePath+"에서 TNS 추출";
FILE * fp = fopen( TnsNamePath.c_str() , "r" );
char buff[1000];
char *ptr;
char tns_name[100];
int read_len = 0 ;
int i = 0 ;
if( fp == 0x00 ) return;
memset( buff , 0x00 , sizeof( buff ));
while( memset( buff , 0x00 , sizeof( buff )) , fgets( buff , 1000 , fp ) != 0x00 )
{
ptr = 0x00;
if((read_len = strlen( buff )) <= 0 ) continue;
for( i = 0 ; i < read_len ; i++ )
{
if( buff[i] != 0x20 )
{
ptr = &buff[i];
break;
}
}
if( ptr == 0x00 || *ptr < 0x30 ) continue;
if( *ptr == '#' || *ptr == '(' || *ptr == ')') continue;
for( int j = 1 ; j < read_len - i ; j++ )
{
if( *(ptr+j) == 0x20 || *(ptr+j) == '=' )
{
memset( tns_name , 0x00 , sizeof( tns_name ));
strncpy( tns_name , ptr , j );
Target->Items->Add( tns_name );
break;
}
}
}
fclose( fp );
}