반응형

강좌 시작 >

준비사항

먼저 그림과 같이 Sybase를 사용할 수 있는 Client-Program을 설치해야 합니다. Oracle을 접근하기 위해서는 Oracle-Client 프로그램을 설치하는 것과 마찬가지입니다. 음.. 준비사항이라고 적기는 했는데 이외에는 별다른 사항은 없네요. (머슥 ㅡㅡ;;)

SyBase 연결

SyBase에 연결하기 위해서는 세가지 정도의 방법이 있습니다.

  1. ODBC Data-Provider For .NET
  2. OLEDB Provider For .NET
  3. ASA Provider(From SyBase)

OLEDB는 .NET Framework 1을 설치하면 SQL Data-Provider For .NET과 같이 기본적으로 설치되는 드라이버입니다. 기존의 두 드라이버 이외에 .NET에는 ODBC 와 Oracle 버전이 추가로 제공되었는데, 이번에 .NET Framework 1.1이 나오면서 기본 드라이버로 추가되었습니다.

마지막으로 3번은 SyBase에서 제공하는 .NET용 Data-Provider인데, www.sybase.com에서 다운로드 받을 수 있습니다.

먼저 ODBC를 통해서 Sybase에 연결하는 방법을 알아보겠습니다. ODBC 설정을 위해서 그림과 같이 ODBC관리자를 열고,

해당 정보를 입력합니다.

연결 테스트를 통해 연결을 확인합니다.

확인 되었다면 CSharp을 통해서 연결해 보죠.

Code1. ODBC Connection

OdbcConnection Conn=null;
Conn=new OdbcConnection("DSN=arnold_connection");

기존의 Com에서 ODBC를 사용해서 연결했던 내용과 별 차이가 없네요. OLEDB를 통해서도 Connection을 연결하는 방법은

Code2. OLEDB Connection

OleDbConnection Conn=new OleDbConnection("Provider=ASAProv.70;Data Source= arnold;"+"UserID=arnold;Password=pwd;");

음. 별 차이가 없군요. ㅡㅡ;;; SyBase에서 제공하는 ASA를 통해서 접근하는 방식은 OLEDB를 접근하는 방식과 Connection-String은 동일합니다. 단지 OLEDB대신 ASA이라는 접두사가 붙습니다.

Provider별 성능을 비교한 문서가 없어서 정확히 말씀은 드리지 못하겠지만 일반적인 경우를 생각해 볼 때 SyBase를 통해 제공되는 provider를 사용하는 것을 권하고 싶네요.

Stored-Procedure 사용하기

저장 프로시저 사용의 경우 MSSQL이나 Oracle을 사용하는 경우와 별로 차이가 없습니다. 한가지 주의하실 점은 ODBC나 ASA Driver를 사용하는 경우에는 SP를 호출하는 부분의 Syntax가 조금 차이가 있다는 점이죠. SyBase에만 해당하는 특별한 사항은 아니고, ODBC를 통해서 접근하는 경우에 공통적인 사항입니다.

Code3. Call SP OdbcCommand Comm=new OdbcCommand("{call test_procedure(?,?)} ",Conn);
// Comm에 Parameter할당~

MSSql을 사용 시 Sp명만 적어주고, Parameter를 할당하는 것과는 조금 차이가 있습니다. ?를 사용해서 Parameter의 위치를 미리 지정하고 Parameter를 Command에 할당해서 사용하는 방식입니다.

문제는 지금부터 인데 다음과 같은 저장 프로시저가 있다고 생각해 보죠.

Code4. Stored-Procedure

create procedure test1(@code char(05),
                                      @out int out)
begin
     if @code=null then
         return (-1); 
     end if;

      select count(*) into @out from test;

      if @code='all' then
          select *
          from test;
     else
          select *
          from test
         where code=@code;
     end if;
     return(100);
end;

프로시저에서는 세 가지 값을 Client에게 리턴합니다.

  1. output-parameter
  2. return value
  3. select를 통한 결과

2)번의 경우는 프로시저가 정상적으로 실행되었는지를 확인하는 값입니다. 위의 프로시저를 호출하는 코드는 다음과 같습니다.

Code5. Call SP2

OdbcDataAdapter Adapter=new OdbcDataAdapter();
OdbcCommand Comm=new OdbcCommand("{?=call sp_test(?,?)} ",Conn);
Comm.CommandType=CommandType.StoredProcedure;
// Parameter Setting
Comm.Parameters.Add("return",OdbcType.Real,4);
Comm.Parameters["return"].Direction=ParameterDirection.ReturnValue;

Comm.Parameters.Add("@code",OdbcType.VarChar,5);
Comm.Parameters["@code"].Value=strCode;

Comm.Parameters.Add("@out",OdbcType.Real,4);
Comm.Parameters["@out"].Direction=ParameterDirection.Output;

음.. 문제가 발생하는 부분은 위와 같이 동시에 세 개를 리턴 받는 경우입니다. 다음은 테스트 한 결과입니다.(테스트 시나리오 별로 각 각의 프로시저 작성)

  1. output parameter만 받는 경우: 정상적으로 리턴.
  2. return value만을 받는 경우: 정상적으로 리턴.
  3. output + return value를 받는 경우: 정상적으로 리턴
  4. select 만을 받는 경우: 정상적으로 리턴
  5. output + select: select만 리턴됨.
  6. return + select : select만 리턴됨
  7. output + select + return : select 만 리턴됨

즉, 요약해 보면 select와 output/return값은 동시에 출력되지 않는다는 결과입니다. 동일한 프로시저를 MSSQL에서 작성해서 테스트 해보면 세 개의 값이 정상적으로 리턴 되는 것을 확인하였습니다.

특정 Provider의 문제인가 싶어서 앞에서 열거한 Provider별로 모두 테스트를 해보았지만, 결과는 동일 (ㅡㅡ);;. SyBase에 문의해 본 결과 ASA 7.0 Engine 의 경우에는 아직 .NET에서 certified되지 않은 상태라고 하네요. 지용군님을 비롯한 주위분들 얘기를 들어보면 Provider에 따라서 위의 기능이 제공되지 않을 수도 있다고 하는군요. 물론 DB자체에서는 실행이 되겠지만 DB에서 실행되는 것과 특정 Provider를 통해 제공되는 기능이 꼭 같다고 볼 수는 없다는 것이죠.

이러한 문제 때문에 조금 우회한 방식으로 처리를 하게 되었습니다.

Return과 Output Parameter를 사용하는 대신 Select 구문으로 대치해서 DataSet에 담는 방식으로 처리를 했습니다. 즉, Output Parameter나 Return 구문은 Select 구문으로 치환해서 결과적으로 DataSet에는 3개의 테이블이 들어가 있는 것이죠.

.NET에서 Sybase 접근방식에 대해서 간단히 알아보았습니다. 그럼 ㅃㅃ2

+ Recent posts