2011-11-23 2 views
0

ODBC를 통해 다양한 데이터베이스 (SQL, Access, Oracle)에 데이터를 쓰려고하는 기존 코드를 업데이트하려고하지만 Oracle 및 SQL에 몇 가지 문제가 있습니다. 제안을 찾고 있습니다.오라클 트리거 키 열이있는 ODBC

트리거 (기본 튜토리얼 온라인 지원)를 사용하여 Oracle 데이터베이스를 설정했습니다.

CREATE TABLE TABLE1 (
    RECORDID NUMBER  NOT NULL PRIMARY KEY, 
    ID  VARCHAR(40) NULL, 
    COUNT NUMBER  NULL 

); 
GO 

CREATE SEQUENCE TABLE1_SEQ 
GO 

CREATE or REPLACE TRIGGER TABLE1_TRG 
BEFORE INSERT ON TABLE1 
FOR EACH ROW 
    WHEN (new.RECORDID IS NULL) 
    BEGIN 
     SELECT TABLE1_SEQ.nextval 
     INTO :new.RECORDID 
     FROM dual; 
    end; 
GO 

그런 다음 SELECT * FROM TABLE1을 사용하여 DataTable을 채 웁니다. 첫 번째 문제는이 DataTable이 RecordId 열이 자동 생성되었음을 알지 못한다는 것입니다. 내 테이블에 데이터가있는 경우 내가 에 데이터가 일단

유형 '더블'으로 DataColumn에의 자동 증가를 변경할 수 없습니다

오류를 얻을 수 있기 때문에 나는 그것을 변경할 수 없습니다.

계속 진행하면 이것을 무시하고 곧바로 붙잡 힙니다. 새 DataRow를 만들고 삽입하려고하면 열이 null이 아니어야 함 (NoNullAllowedException)이 발생하기 때문에 RecordID를 DBNull.Value로 설정할 수 없습니다. 그러나 나는 값을 직접 생성 할 수 없다. 왜냐하면 내가 정말로 사용해야하는 값을 알지 못하고 다음으로 사용 가능한 값을 사용하여 트리거를 망치고 싶지 않기 때문이다.

ODBC를 사용하지 않고 데이터를 삽입하는 방법에 대한 제안 사항은 무엇입니까?

+0

WHEN 절에 'new'앞에 콜론이 없어야합니까? –

답변

3

첫 번째 문제가 Oracle 데이터베이스와 관련이없는 것 같습니다. Oracle에는 "Auto Increment"열과 같은 것이 없습니다. Oracle 데이터베이스에서 메시지가오고 있습니까?

오라클을 사용하면 기본 키에 삽입 할 때 더미 값을 제공 할 수 있어야하고 트리거가이를 덮어 씁니다.

키에 대한 외래 키 참조가없는 한, 제공된 값은 Oracle에서이 값을 갱신하지 못하게합니다 (트리거가 삽입에만 사용되기 때문에).

+0

아니요, Oracle은 AutoIncrement를 지원하지 않지만 "필자는이 필드를 채울 필요가 없습니다. 오라클이 대신 할 것입니다"라는 의미의 equipelant가 필요합니다. 따라서 DataTable에서 Exception을 발생시키지 않습니다. 당신 말이 맞아요, 더미 값을 제공 할 수 있지만 일반적으로 어떤 더미 값이 유효한지 모르겠군요 ... -1? 0? ... 나는 단지 매우 구체적인 테스트 데이터베이스에서 방아쇠가 무엇을하는지 압니다. String 또는 Guid를 생성하는 트리거 인 경우에는 무엇을 사용해야합니까? : S – Ian

+0

AllowDBNull 설정은 자필로 적합하기보다는 분명 더 유용한 방법이었습니다. – Ian

관련 문제