2010-06-13 2 views
2

Oracle 11g와 C#을 연결하고 있습니다. 필자는 Oracle Data Adapter를 사용하여 DataTable을 채 웁니다.Oracle 시퀀스를 기본 키로 사용하여 데이터 바인딩 된 형식으로 새 행 추가

OracleDataAdapter da; 
DataTable dt = new DataTable(); 

da = new OracleDataAdapter("SELECT * FROM Author", con); 
da.Fill(dt); 

데이터 테이블의 다양한 행에 데이터 바인딩 된 텍스트 상자가 거의 없습니다.

txtAuthorID.DataBindings.Add("Text", dt, "AUTHORID"); 
txtFirstName.DataBindings.Add("Text", dt, "FIRSTNAME"); 
txtLastName.DataBindings.Add("Text", dt, "LASTNAME"); 
txtAddress.DataBindings.Add("Text", dt, "ADDRESS"); 
txtTelephone.DataBindings.Add("Text", dt, "TELEPHONE"); 
txtEmailAddress.DataBindings.Add("Text", dt, "EMAIL"); 

또한 DataTable의 내용을 보여주는 텍스트 상자 아래에 DataGridView가 있습니다.

dgvAuthor.DataSource = dt; 

나는 새 행을 추가 할 때 지금 내가 할 수있는 모든 후 BM이

로의 Form_Load에 정의 그리고 저장시 버튼을 클릭

bm.AddNew(); 

정보가 입력되고 유효성이 확인됩니다.

this.BindingContext[dt].EndCurrentEdit(); 

try 
{ 
da.Update(dt); 
} 
catch (Exception ex) 
{ 
MessageBox.Show(ex.Message); 
} 

그러나 문제는 내가 SQL Plus를 사용하여 데이터베이스에 행을 입력 할 때 기본 키에 my_pk_sequence.nextval을 사용하는 경우입니다. 하지만이 메서드에서 새 행을 추가 할 때 어떻게 지정합니까?

ORA-01400: cannot insert NULL into ("SYSMAN".AUTHOR.AUTHORID")이 주된 키에 대해 아무 것도 지정되지 않았기 때문에이 예외가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까? 고맙습니다 :

답변

2

하나의 해결책은 삽입시 자동으로 값을 생성하는 트리거를 만드는 것입니다. 이 같은
뭔가 :

CREATE OR REPLACE TRIGGER trigger_name 
    BEFORE INSERT ON SYSMAN.AUTHOR.AUTHORID 
    REFERENCING 
     OLD AS OLD 
     NEW AS NEW 
    FOR EACH ROW  
    BEGIN 
     SELECT my_sequence.NEXTVAL 
     INTO :NEW.AUTHORID 
     FROM DUAL; 
    END; 

편집 : 여기

DUAL 테이블에 위키 백과에서 인용은 다음과 같습니다

듀얼 테이블에 기본적으로 존재하는 특별한 하나의 행 테이블 모든 Oracle 데이터베이스 설치.

때문에, 여기 당신이 그것에 대해 배울 수있는 자원은 Oracle Dual Table

  • 오라클 문서 자료 : 012 3,516,
  • +0

    신난다 :) 질문 하나, 듀얼 무엇인가? :) –