C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[957] Oracle Client 설치된 PC에서 TNS Name 목록 가지고 오는 함수
제리압빠. [kamizen] 10713 읽음    2010-03-05 16:09
를 한번 만들어 보았습니다.

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 );
}


+ -

관련 글 리스트
957 Oracle Client 설치된 PC에서 TNS Name 목록 가지고 오는 함수 제리압빠. 10713 2010/03/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.