TDP.NET 기본 사용

TDP.NET을 사용하여 애플리케이션 프로그램을 개발하는 과정을 순서대로 설명하고 연결속성, 데이터 타입, PSM 호출 방법 등을 설명합니다.

개발 과정

아래는 TDP.NET 을 사용하여 애플리케이션 프로그램을 개발하는 과정에 대한 설명입니다.

1. 네임스페이스 추가

기본이 되는 Tibero.DataAccess.Client 네임스페이스를 추가합니다.

using Tibero.DataAccess.Client;

2. 데이터베이스 연결

데이터베이스에 연결하기 위해서 접속 정보를 Connection string으로 직접 명시하여 TiberoConnection 객체를 생성한 뒤 Open() 메소드를 호출하여 데이터베이스에 접속합니다.

string connStr = "Data Source=((INSTANCE="
                  + "(HOST=localhost)(PORT=8629)(DB_NAME=dbsvr)));"
                  + "User Id=tibero;Password=tmax;"; 
TbieroConnection conn = new TiberoConnection(connStr); 
conn.Open();

또는 아래와 같이 TiberoConnectionStringBuilder를 통해 Connection string을 생성하여 Tibero Connection 객체를 생성할 수 있습니다.

TiberoConnectionStringBuilder builder = new TiberoConnectionStringBuilder(); 
builder.DataSource = "((INSTANCE=(HOST=localhost)(PORT=8629)(DB_NAME=dbsvr)))"; 
builder.UserID = "tibero";
builder.Password = "tmax";

TbieroConnection conn = new TiberoConnection(builder.ToString()); 
conn.Open();

Connection string의 Data Source에 Data Source Name을 명시하면, $TB_HOME/client/config/tbdsn.tbr파일에 명시된 DSN의 HOST, PORT, DB_NAME을 파싱하여 접속 정보로 사용합니다.

string connStr = "Data Source=tibero;User Id=tibero;Password=tmax;"; 
TbieroConnection conn = new TiberoConnection(connStr);
conn.Open();

3. TiberoCommand 객체 생성과 SQL문 수행

데이터베이스에 연결되면, TiberoCommand 객체를 생성한 뒤 ExecuteXXX() 메소드를 통해 SQL 커맨 드를 데이터베이스에 보냅니다.

conn.Open();
TiberoCommand cmd = new TiberoCommand("create table t (c1 varchar2(10), c2 number)",
   
                                      conn);
cmd.ExecuteNonQuery();

4. 질의문 수행과 TiberoDataReader 객체 받기

커맨드 객체를 생성하여 질의문을 수행하고 TiberoDataReader 객체를 받습니다.

TiberoCommand cmd = new TiberoCommand("select * from t"); 
cmd.Connection = conn;
cmd.CommandType = CommandType.Text; 
TiberoDataReader reader = cmd.ExecuteReader();

5. TiberoDataReader 객체 처리

TiberoDataReader 객체는 Read() 메소드를 이용하여 결과 집합의 각 로우에 순차적으로 접근할 수 있습니다. 더이상 읽을 로우가 없으면 Read() 메소드는 false를 반환합니다.

TiberoDataReader의 GetXXX() 메소드 호출을 통해 컬럼 값을 얻거나, 컬럼 배열에 접근하는 직관적인 방식으로 컬럼 값을 얻어 올 수 있습니다.

while (reader.Read())
{
   string c1 = reader.GetString(0); 
   int c2 = reader["c2"];
}

6. TiberoDataAdapter를 통한 질의문 수행

TiberoDataAapter를 통해서도 데이터베이스에 커맨드를 요청하고, Fill 메소드를 통해 DataSet 객체에 결과 집합을 담을 수 있습니다. 데이터베이스와의 연결이 닫혀있는 상태일지라도, Fill 메소드 내부에서 암시적으로 데이터베이스와 연결을 맺어 데이터를 조회해온 후 다시 연결을 해제하여 연결 상태를 닫힌 상태로 원상복구합니다.

TiberoCommand cmd = new TiberoCommand("select * from t", conn); 
DataSet ds = new DataSet();
TiberoDataAdapter da = new TiberoDataAdapter(cmd);

da.Fill(ds);
foreach (DataRow r in ds.Tables[0].Rows)
{
    Console.WriteLine(r[0] + "," + r[1]);
}

7. 데이터베이스 연결 해제

TiberoConnection 객체의 Close() 메소드를 호출하면 데이터베이스와의 연결이 해제됩니다.

conn.Close();

Close() 메소드를 호출하지 않으면 불필요한 커넥션이 남아서 성능 저하를 유발시킬 수 있으므로, 항상 Close() 메소드를 사용하여 연결을 해제해야 합니다.

8. 객체 소멸

명시적으로 Dispose() 메소드를 호출하면 TiberoDataReader, TiberoCommand, TiberoConnection 등의 객체가 사용한 리소스가 정리되며 소멸됩니다.

cmd.Dispose();
reader.Dispose(); 
conn.Dispose();


Connection Properties

아래는 데이터베이스에 연결할 때에 Connection String을 통해 설정할 수 있는 속성들입니다.

속성명

타입

설명

DB_NAME

String

서버에 존재하는 특정 데이터베이스의 이름입니다.

Data Source

String

데이터소스의 이름입니다.

INSTANCE

String

접속할 인스턴스 정보다.

Password

String

서버 접속을 위한 패스워드입니다.

User Id

String

서버 접속을 위한 사용자 이름입니다.

PORT

String

서버 리스너의 포트 번호입니다.

HOST

String

접속할 인스턴스의 호스트 및 IP 주소 정보 입니다.

Enlist

String

트랙잭션 범위 내에서 Connection open할 때 암시적으로 Sys tem.Transactions의 트랜잭션에 참여할지 여부를 지정합니다.

(기본값: True)

Pooling

String

Connection Pooling 기능을 사용할지 여부를 지정합니다. (기본값: True)

Min Pool Size

String

한 개의 Connection Pool 내에 존재해야 하는 커넥션의 최소 갯수 입니다. (기본값: 1)

Max Pool Size

String

한 개의 Connection Pool 내에 존재할 수 있는 커넥션의 최대 갯수 입니다. (기본값: 100)

Decr Pool Size

String

Connection Pool 내의 커넥션들의 단위 감소량입니다. (기본값: 1)

Incr Pool Size

String

Connection Pool 내의 커넥션들의 단위 증가량입니다. (기본값: 5)

Validate Connection

String

Connection Pool에서 커넥션을 가져올 때마다 데이터베이스 연결 유효성 검사를 할지 여부를 지정합니다.

True로 지정하면, 연결 유효성 검사에 따른 오버헤드가 생긴다는 것을 감안해야 합니다. (기본값: False)

Connection Timeout

String

Connection Pool에서 커넥션을 가져올 때 Max Pool Size 만큼의 커넥션들이 모두 Busy 상태일 경우 커넥션을 획득하기 위해 기다리는 최대 시간입니다. (단위: 초, 기본값: 15초)

Promotable Transaction

String

분산 트랜잭션으로의 승격 가능 여부를 지정합니다.

  • Promotable (기본값)

  • Local


데이터 타입

아래는 TDP.NET에서 제공하는 타입의 Value 속성과 .NET 프레임워크 데이터 타입의 대응 관계입니다. Tibero.DataAccess.Types 네임스페이스를 추가하면 TDP.NET 타입을 사용할 수 있습니다.

Tibero DB 데이터 타입

TDP.NET 타입

.NET 프레임워크 데이터 타입

BFILE

TiberoBFile

System.Byte[]

BINARY_DOUBLE

TiberoDecimal

System.Decimal

BINARY_FLOAT

TiberoDecimal

System.Decimal

BINARY_INTEGER

TiberoDecimal

System.Decimal

BLOB

TiberoBlob

System.Byte[]

BOOLEAN

TiberoBoolean

System.Boolean

CHAR

TiberoString

System.String

CLOB

TiberoClob

System.String

DATE

TiberoDate

System.DateTime

INTERVAL DAY TO SECOND

TiberoIntervalDS

System.TimeSpan

INTERVAL YEAR TO MONTH

TiberoIntervalYM

System.Int64

LONG

TiberoString

System.Byte[]

LONG RAW

TiberoBinary

System.Byte[]

NCHAR

TiberoString

System.String

NCLOB

TiberoClob

System.String

NUMBER

TiberoDecimal

System.Decimal

NVARCHAR2

TiberoString

System.String

REF

TiberoRef

System.String

REF CURSOR

TiberoRefCursor

-

ROWID

TiberoString

System.String

TIMESTAMP

TiberoTimeStamp

System.DateTime

TIMESTAMP WITH LOCAL TIME ZONE

TiberoTimeStampLTZ

System.DateTime

TIMESTAMP WITH TIME ZONE

TiberoTimeStampTZ

System.DateTime

VARCHAR2

TiberoString

System.String

XMLTYPE

TiberoXmlType

System.String


기본 예제

아래는 파라미터를 바인딩하여 DML을 수행하는 예제에 대한 설명입니다.

BindbyName 설정 후 파라미터 바인딩

TiberoCommand 객체의 BindbyName 값을 True로 설정하는 경우 지정한 파라미터의 이름에 따라 바인딩됩니다.

TiberoCommand cmd = new TiberoCommand("create table test " +
                                      "(c1 varchar2(20), c2 varchar2(20))", 
                                      conn);
cmd.ExecuteNonQuery();
cmd = new TiberoCommand("insert into test values (:col1, :col2)", conn); 
cmd.BindByName = true;

TiberoParameter param = new TiberoParameter(); 
param.ParameterName = "col2"; 
param.TiberoDbType = TiberoDbType.Varchar2; 
param.Direction = ParameterDirection.Input; 
param.Size = 20;
param.CollectionType = TiberoCollectionType.None; 
param.Value = "second column"; 
cmd.Parameters.Add(param);
cmd.Parameters.Add("col1", TiberoDbType.Varchar2).Value = "first column"; 
int affectedRowCnt = cmd.ExecuteNonQuery();

일반적인 파라미터 바인딩

TiberoCommand 객체에 BindbyName 설정을 별도로 하지 않으면 기본값은 False로 설정됩니다. 따라서 파라미터의 이름은 의미가 없고 파라미터를 추가하는 순서대로 바인딩 됨을 주의합니다.

TiberoCommand cmd = new TiberoCommand("create table test2 " +
                                      "(c1 date, c2 number, c3 number)", conn);
cmd.ExecuteNonQuery();
cmd = new TiberoCommand("insert into test2 values (:col1, :col2, :colNull)", conn);

DateTime dt = new DateTime(2020, 3, 23, 17, 50, 30); 
cmd.Parameters.Add("col1", TiberoDbType.Date, dt, ParameterDirection.Input);
cmd.Parameters.Add("col2", TiberoDbType.Decimal, 123.45m, ParameterDirection.Input);
cmd.Parameters.Add("col3", null);
int affectedRowCnt = cmd.ExecuteNonQuery();


psm 호출

아래는 ref 커서를 아웃 파라미터로 바인딩하여 Stored Procedure를 수행하여 테이블의 데이터를 조회해 오는 예제에 대한 설명입니다.

TiberoCommand cmd = new TiberoCommand("create table test3 " +
                                      "(c1 varchar(50), c2 number)", conn);
cmd.ExecuteNonQuery();
cmd = new TiberoCommand("insert into test3 values ('hello', 10)", conn); 
cmd.ExecuteNonQuery();
cmd = new TiberoCommand("create or replace procedure " +
                        "out_cursor(p1 out sys_refcursor)" + 
                        "as " +
                        "begin " +
                        "open p1 for 'select * from test3'; " + 
                        "end; ", conn);
cmd.ExecuteNonQuery();
cmd = new TiberoCommand(); 
cmd.Connection = conn; 
cmd.CommandText = "out_cursor";
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add("csr",TiberoDbType.RefCursor, ParameterDirection.Output);

TiberoDataAdapter oAdapter = new TiberoDataAdapter(cmd); 
DataSet ds = new DataSet();
oAdapter.Fill(ds);
foreach (DataRow r in ds.Tables[0].Rows)
{
   Console.WriteLine(r[0] + ", " + r[1]);
}

Last updated