과거에는 Oracle ODP.net 을 사용하려면 Instant Client 가 필요했었다.

Instant Client 는 C 로 빌드된것으로 아키텍쳐에 따라 구분해서 사용했는데

이번에 다른 프로젝트를 만들다보니 새 버전이 나왔더라..

완전히 .net 으로 코딩된 새버전!



일단 아래 처럼 흔하디 흔한 시작 문자열을 가지고 시작했는데


using Oracle.ManagedDataAccess.Client;

....

....

        public OracleConnector(CONNECT_INFO info)
        {
            string src = string.Format("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={3}))(CONNECT_DATA=(SERVICE_NAME={4})));User Id={1};Password={2};", info.IP, info.LoginID, info.LoginPWD, info.PORT, info.ServiceID);
            con = new OracleConnection();
            con.ConnectionString = src;
            con.Open();
        }



자꾸

Oracle.ManagedDataAccess.Client.OracleException (0x80004005): Oracle 통신: 서버에 접속하는 데 실패했거나 접속 문자열을 구문 분석하는 데 실패했습니다. ---> OracleInternal.Network.NetworkException (0x80004005): Oracle 통신: 서버에 접속하는 데 실패했거나 접속 문자열을 구문 분석하는 데 실패했습니다. ---> System.Security.Authentication.AuthenticationException: SSPI를 호출하지 못했습니다. 내부 예외를 참조하십시오. ---> System.ComponentModel.Win32Exception: 보안 패키지에 사용할 수 있는 인증서가 없습니다


에러가 나더라..

실제로 위와 같은 상황에서는 sqlplus 로 하면

ORA-12638: 신용 검색에 실패했습니다



주로 해당 PC 에 오라클이 기본 상태로 설치된 경우에 발생하는것 같다..


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

해결 방법 --->


1. 독립적인 환경 구성을 위해 TNS 관리자 경로를 자기 자신으로 설정한다

   app.config 또는 web.config 에 ManagedDataAccess 모듈을 nuget 으로 설치했다면 자동으로 생성됐을거임.. 아래처럼 경로만 추가로 써주면 된다

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <!--<dataSource alias="ExtOracle" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=eeee))) "/> -->
      </dataSources>
      <settings>
        <setting name="TNS_ADMIN" value="." />
      </settings>
    </version>
  </oracle.manageddataaccess.client>


2. sqlnet.ora 파일 생성


sqlnet.authentication_services=(none)
NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)

SSPI 관련 문제는 위에줄에 있는 내용으로 커버가 되며, 아래 내용으로 EzConnect 형태로 접속 문자열을 사용할 수 있음. 이미 오라클 설치중이라면 admin 폴더에 찾아가서 변경하면 된다

참고로 이 파일을 만든 후 파일 속성(Properties, Alt+F4)에 가서 "Overwrite if newer" 또는 "Copy Always" 를 선택해서 빌드된 경로로 복사되도록 한다

Posted by 김모작자

댓글을 달아 주세요

하루 종일 삽질하다가 알게 된 문제..

1)OracleCommand 에 파라미터를 전달할때 @ 또는 : 쓰는 문제

SQL 문에
"insert into OoopsTable (FileNo, storage_origin, isdeleted, filepath, filename, filesize, IsDirectory, stdFilehash, whenRegistered, FTSearchField, FTSearchField2)
                                            values(CDPSTRGFILESSEQ.nextval, :storage_origin, 'N', :filepath, :filename, :filesize, :isdirectory, :stdFilehash, sysdate, :FTSearchField, :FTSearchField2) ";

파라미터임을 표시할때 이렇게 :xxx 형태로 파라미터를 쓰게 된다. 과거 버전은 @ 를 쓰는것 같다

버전에 따라 @ 를 쓰거나 : 를 쓰는것 까진 이해할 수 있다.. 버전이 다르다니깐..

 

2) 파라미터를 분명히 넘겼는데 에러 날때

근데.. 보통 쿼리에 필요한 파라미터를
OracleParameter 를 만들어 추가하는데..  아래와 같이 할 것이다
OracleCommand cmd = new OracleCommand( my query );
...
cmd.Parameters.Add( new oracleParameter("파라미터 이름" ....));
cmd.Parameters.Add( new oracleParameter("파라미터 이름" ....));
cmd.Parameters.Add( new oracleParameter("파라미터 이름" ....));
cmd.Parameters.Add( new oracleParameter("파라미터 이름" ....));
....

근데 자꾸
ORA-01722 invalid number
bind 오류 등이 난다.

해결책 부터 얘기하자면

OracleCommand 만들때 BindByName 을 true 로 설정해서 원래 생각하던대로 넘기면 해결된다. 왜 이게 기본값이 false 인지 모르겠다.. 썩을..

BindByName 을 false 로 해두면 변수 이름은 무시되고 서수에 의해 맵핑된다, 그래서 파라미터 인자 와 추가된 파라미터가 다르면 계속 파라미터 오류가 생긴다..

 

Posted by 김모작자

댓글을 달아 주세요