C#에서 Oracle을 엑세스하기 위해서는 .NET에서 제공하는 System.Data.OracleClient.dll를 참조에 추가해야 한다.

우선, Oracle의 데이터를 사용하기 위해서는 Oracle의 데이터베이스에 연결을 해야한다.

 

OracleConnection 클래스

데이터베이스에 대한 열린 연결을 나타낸다. 이 클래스는 상속될 수 없다.

OracleConnection 개체는 범위에서 벗어나도 열려 있는 상태로 유지된다.

즉, 항상 Close 또는 Dispose를 호출하거나 Using문 내에서 OracleConnection 개체를 사용하여 닫아줘야 한다.

 

OracleCommand 클래스

데이터베이스에서 실행한 SQL문 또는 저장 프로시저를 나타낸다. 이 클래스는 상속될 수 없다.

 

항목 설명
ExecuteReader 행을 반환하는 명령을 실행한다.
ExecuteOracleNonQuery Connection에 대해 SQL문을 실행하고 영향 받는 행의 수를 반환한다.
ExecuteNonQuery SQL INSERT, DELETE, UPDATE 및 SET 문과 같은 명령을 실행한다.
ExrcuteScalar 데이터베이스에서 집계 값과 같은 단일 값을 .NET Framework 데이터 형식으로 검색한다.
ExecuteOracleScalar 데이터베이스에서 집계 값과 같은 단일 값을 Oracle 고유 데이터 형식으로 검색한다.

 

1) ExecuteReader를 이용한 데이터베이스의 데이터 읽기 예제

public void ReadData(string connectionString)
{
    string queryString = "SELECT EEMPNO, DEPTNO FROM TABLE";
    using (OracleConnection connection = new OracleConnection(connectionString))
    {
        OracleCommand command = new OracleCommand(queryString, connection);
        connection.Open();
        OracleDataReader reader = command.ExecuteReader();
        try
        {
            while (reader.Read())
            {
                Console.WriteLine(reader.GetInt32(0) + ',' + reader.GetInt32(1));
            }
        }
        finally {
            reader.Close();
        }
    }
}

 

2) ExecuteNonQuery를 이용한 쿼리 명령문 실행 예제

public void InsertRow(string connectionString)
{
    string queryString = "INSERT INTO DEPT(DEPTNO, DNAME,LOC) VALUES (50, 'THCHNOLOGY', 'DENVER')";
    using (OracleConnection connection = new OracleConnection(connectionString))
    {
        OracleCommand command = new OracleCommand(queryString);
        command.Connection = connection;
        try
        {
            connection.Open();
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

Unique Key를 생성하는 방법은 DBMS마다 차이가 있다.
MS-SQL은 IDENTITY를, MySQL은 auto_increment,

오라클에서는 Sequence를 사용하여 다음과 같이 유사하게 구현할 수 있다.

 

1. 자동증가컬럼을 사용하고자 하는 MYTABLE테이블을 생성한다.

CREATE TABLE MYTABLE(
	ID NUMBER, NAME VARCHAR2(20)
);

 

2. CREATE SEQUENCE 라는 문장을 사용하여 SEQ_ID라는 이름의 시퀀스를 만든다.

CREATE SEQUENCE SEQ_ID INCREMENT BY 1 START WITH 10000;

-- INCREMENT BY 1 : 증가값은 1
-- START WITH 10000 :  10000부터 증가

 

3.  테이블에 데이터 입력시에는 NEXTVAL이라는 슈도 컬럼(Pseudo-column)을 이용하여 시퀸스를 사용한다.

INSERT INTO MYTABLE VALUES( SEQ_ID.NEXTVAL, '홍길동');

-- CURRVAL : 현재 값을 반환 합니다. .
-- NEXTVAL : 현재 시퀀스값의 다음 값을 반환 합니다.

 

Sequence 구문

 

CREATE SEQUENCE sequence_name
       [START WITH n]
       [INCREMENT BY n]
       [MAXVALUE n | NOMAXVALUE]
       [MINVALUE n | NOMINVALUE]
       [CYCLE | NOCYCLE]

 

* START WITH
시퀀스의 시작 값을 지정합니다. n을 1로 지정하면 1부터 순차적으로 시퀀스번호가 증가 합니다.

* INCREMENT BY
시퀀스의 증가 값을 말합니다. n을 2로 하면 2씩 증가합니다.
START WITH를 1로 하고 INCREMENT BY를 2으로 하면 1, 3, 5,7,..
이렇게 시퀀스  번호가 증가하게 됩니다.

* MAXVALUE n | NOMAXVALUE
MAXVALUE는 시퀀스가 증가할수 있는 최대값을 말합니다.
NOMAXVALUE는 시퀀스의 값을 무한대로 지정합니다.

* MINVALUE n  | NOMINVALUE
MINVALUE는 시퀀스의 최소값을 지정 합니다.
기본값은 1이며, NOMINVALUE를 지정할 경우 최소값은 무한대가 됩니다

 

[사용규칙]

* NEXTVAL, CURRVAL을 사용할 수 있는 경우
   - subquery가 아닌 select문
   - insert문의 select절
   - insert문의 value절
   - update문의 set절

* NEXTVAL, CURRVAL을 사용할 수 없는 경우
   - view의 select절
   - distinct 키워드가 있는 select문
   - group by, having, order by절이 있는 select문
   - select, delete, update의 subquery
   - create table, alter table 명령의 default값

 

[수정]

ALTER SEQUENCE sequence_name
       [INCREMENT BY n]
       [MAXVALUE n | NOMAXVALUE]
       [MINVALUE n | NOMINVALUE]
       [CYCLE | NOCYCLE]

START WITH는 수정할수 없습니다.
START WITH 절이 없다는 점을 빼고는 CREATE SEQUENCE와 같습니다.

 

[삭제]

DROP SEQUENCE sequence_name

 


[출처] https://applejara.tistory.com/260

ERROR

ORA-12154: TNS:지정된 접속 식별자를 분석할 수 없음


해결방법

시스템변수에 환경변수 2개를 추가

(1) TNS_ADMIN: C:\app\client\사용자이름\product\12.2.0\client_1\Network\Admin

(2) ORACLE_HOME: C:\app\client\사용자이름\product\12.2.0\client_1

 

경로는 오라클이 깔려있는 각자 본인의 파일 경로를 사용

 

+ Recent posts