Notice»

Recent Post»

Recent Comment»

Recent Trackback»

Archive»

« 2024/12 »
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

 

'Oracle Call Interface'에 해당되는 글 1

  1. 2009.04.30 [Oracle] 오라클(Oracle) 설치,접속(클라이언트 없이 OCI사용하기)
 
OTL - 99%정리

오라클 설치시 주의사항

1. 오라클은 설치시 Login한 계정에 한글이 들어가면 설치화면 자체가 안뜬다.
2. 설치폴더에 한글패스가 있으면 안된다.
3. 꼭 C:에 깔자(사용중에도 엉뚱한 문제가 발생한다.)
Path에 한글이 필요한건 Oracle설치시 Java로 설치가 되는데 포함된게 10g까지도 구버젼이라 그런것 같다.
확실한건 위의 사항을 안지키면 된통 당할 수 있다.

참고
ODBC 설정에러.. 오라클 클라이언트가 문제야..

접속방법들..

오라클 접속방법에는 기본적으로 OCI(Oracle Call Interface)가 있다. ODBC,OLEDB,닷넷프로바이더를 사용해도 결국 OCI로 접속이 되므로 기본으로 설치되어 있어야 한다. 문제는 Oracle 10g이상은 Instant Client를 설치하면 되지만(참고1, 참고2), 9g이하는 CD1장분량의 오라클 클라이언트를 설치해야 된다는 거다.

그럼 XP만 깔아도 기본으로 설치되는 Microsoft의 Oracle관련 드라이버는 뭐냐? 이것 또한 오라클 클라이언트가 없으면 설정시 아래와 같은 친절한 메세지를 보여주신다.(XP SP2,3 테스트)


위의 라이브러리들이 아닌 OCI를 직접사용하면 관련 DLL만 배포하면 된다. 실제 SQLGateZeosLib(델파이 공개용 DB통합 라이브러리)를 사용해보면 오라클 클라이언트가 필요없음을 알 수 있다.

OCI말고도 방법은 몇개 더있다 PRO*C를 이용할 수도 있고.. 근데 PRO*C는 미리 설정해야하고 작업해야 되는게 너무 많더라. 귀찮다. (이것 또한 OCI를 사용하지 않을까 한다)

결론을 내려보면 오라클을 접속하기 위해선 기본적으로 Client나 Instant Client가 설치되어서 OCI를 이용해서 접속해야된다. 그럼 클라이언트 없이 OCI만으로 접속 할순 없나?
있다. OCI관련 DLL을 이용하면 된다.

참고
닷넷에서 오라클에 접근하는 7가지 방법

OCI 사용

OCI는 C라이브러리이므로 그냥 사용하긴 너무 번거롭다. Wrapper클래스를 이용하자.
Oracle C++ Call Interface (오라클제공)
libsqlora8(open-source)
OCILIB(open-source)
A Wrapper for the Oracle Call Interface - 99%가 사용했던 라이브러리
OTL (Oracle, ODBC and DB2-CLI Template Library)

CodeProject - (Database - Oracle)
CodeGuru - Oracle

오라클 클라이언트 없이 접속하기(OCI)

1. OCI를 이용해서 간단한 콘솔 프로그램을 만들고 사용하는 DLL을 추출했다.
Process Explorer v11.32 사용

아래목록을 보면 C:\oracle\ora92\bin에 있는(오라클 9.2.0.1) 30개의 파일을 사용하는걸 볼 수 있다. 그 파일을 추출해서 같은 폴더에 oci.dll과 같이 넣으면 다른 컴퓨터에선 접속이 잘되지만 자신의 컴에선 에러가 발생한다.
-> ora-12705: invalid or unknown NLS parameter value specified


2. DLL내부에서 오라클 설치된 폴더를 확인하는 설정파일이 있다.
위의 DLL들과 같은 폴더에 oracle.key를 보면 레지스트리값이 있고 그 값을 따라가면 Oracle이 설치시 관련 폴더를 입력해 놓은 레지스트리 값을 확인할 수 있다.
자세한 정보는 아래 참고를 확인하고 위 파일을 배포폴더에 같이 포함하면 클라이언트 없이 접속할 수 있다.

참고
프로그램배포시 Oracle Client없이 Oracle 핸들하기


3. OCI는 접속시 tnsnames.ora에 설정된 서버 정보를 참고하는데 클라이언트가 없을 경우는 TNS 문자열을 곧바로 넣어줘야한다.
OCI를 이용하는 방법은 아직 찾지 못했고 OTL을 이용하는 방법은 참고 사이트에서 확인하거나 따로 구성한 OTL정리 페이지를 확인하자.

참고
DB 작업을 보다 쉽게 해보자...(OTL 소개)


정리하면
오라클 접속시 기본 30개의 DLL파일이 필요하고 oracle.key라는 설정파일과 OCI접속을 위한 OCI.DLL까지 32개의 파일이 필요하다. 또한 접속시는 TNS 문자열을 수동으로 넣어주는 방식으로 접속해야한다. 주의사항은 Path에 '('같은 문자가 있을시 접속이 안될수도 있다. 갑자기 접속이 안될경우 확인해볼것.

오라클 클라이언트 없이 접속하기(Oracle Instant Client)

아래 내용은 자북사이트에 소개된 C#으로 오라클 클라이언트 없이 접속하기 방법이다.
링크

C#에서 오라클에 접속할 때
Oracle Client를 설치한 후 tnsnames.ora를 설정하고 닷네에서 오라클에 접속하였다.
인터넷을 검색하면 대부분의 코드가 이 방법이다.

Oracle Client를 설치하지 않고 tnsnames.ora 없이 접속하는 방법을 찾던중
몇칠의 고생끝에 Oracle Instant로 오라클 서버에 접속하는 방법을 찾았다.

------------------------------------------------------------------------

Oracle Client를 이용한 드라이브 설치
  오라클 클라이언트를 설치하면 자동으로 오라클 드라이브가 설치된다.
  오라클 클라이언트의 tnsnames.ora의 정보를 이용해서 접속

Oracle Instant Client이용한 드라이브 설치
      Instant Client Downloads for Microsoft Windows (32-bit)
      위치
         http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html
        버전에 따라 다운로드 해서 사용할 것

        포함된 파일들을 프로그램 exe가 있는 위치에 모두 복사할 것
        Visual Studio 프로젝트일 경우 Debug나 Release에 복사할 것
        tnsnames.ora의 정보를 프로그램에서 직접 입력

 
string szServerInfo = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.130.111.122)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=scott;Password=tiger;";
string sql = "select * from mytable";
OracleConnection conn = null;
try
{
    conn = new OracleConnection(szServerInfo);
    conn.Open();
    OracleCommand comm = new OracleCommand(sql, conn);
    OracleDataReader rs = comm.ExecuteReader();
    while (rs.Read())
    {
        MessageBox.Show(rs.GetString(1));
    }
    rs.Close();
}
catch (Exception e2)
{
    MessageBox.Show(e2.StackTrace);
}
finally{   
    conn.Close();
}


방화벽안에 오라클 서버 접속

오라클 기본 Port는 1521인데 이것은 단지 Listener의 역활만을 할 뿐이고 1521로 접속하면 랜덤 Port로 다시 연결이 이루어 진다. 그러므로 방화벽으로 1521포트만을 오픈한다고 해서 방화벽안에 서버를 접속할 수는 없다.(그림 참고 -> 링크의 그림이 잘 설명되어있음) 필자는 IPTIME의 공유기에서 DMZ를 설정했는데도 안됐다.(공유기 특성을 탄다는 페이지 확인)

아래에 1521만을 사용해서 오라클 서버에 접속할 수 있게 설정하는 방법을 소개한다.
8g는 아래 방법을 하면 에러가 나며 패치를 해야하는데 패치가 구하기 힘들다고 한다.

1. XP이상 PC의 방화벽 설정(오라클 서버가 깔린 PC)
XP이상의 경우 방화벽이 있는데 방화벽을 사용시 1521 Port만을 열면 당연히 같은 망에 있는 컴퓨터라도 접속 할수가 없다. 이때는 오라클에서 사용하는 프로그램을 방화벽의 예외에 추가하면 된다. 예외에서 프로그램 추가로 tnslsnr.exe, oracle.exe를 추가해주면 PC에서 방화벽을 사용해도 문제없이 접속이 될것이다.

2. Windows에 설치된 오라클서버 설정
USE_SHARED_SOCKET(TRUE)값을 레지스트리에 추가하거나 시스템 환경 변수에 추가해준다.
참고로 10g XE(eXpress Edition)에서는 두가지 방법다 실패했다. express버젼이라 그런지 그런기능을 막아놨나보다;;

1) 레지스트리에 값 추가
레지스트리 편집기에서 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0에 USE_SHARED_SOKET을 문자열로 추가하고 값을 TRUE로 넣어준다.
확장문자열로 넣으라는 설명을 봤는데 상관 없는것 같다. 10g XE에는 이값이 아예 없다.


2) 환경변수에 등록하기
내컴퓨터의 속성에서 고급-> 환경변수 -> 시스템 변수에서 새로만들기로 USE_SHARED_SOKET를 추가하고 값은 마찬가지로 TRUE를 넣어준다.

2.1 오라클 서버에 변경사항 적용하기 - 다시시작
환경변수는 윈도우를 리부팅해야하고 레지스트리에 등록 방법은 리부팅을 하거나 서비스에서 오라클 관련 서비스를 중지후 다시 시작하면 외부에서 1521만을 사용해서 오라클 서버에 접속할 수 있다.



참고
USE_SHARED_SOKET(Windows 환경)
방화벽 안에 있는 윈도우 2000 서버에 오라클 8.1.7 설치 및 접속하기
: