2014-04-24 17 views
3

저는 Delphi 5에서 Delphi XE2로 응용 프로그램을 변환하고 BDE를 사용하여 상황을 보았습니다. 그는 다음과 외래 키가있는 필드의 패스 널 (null)을 허용하지 않습니다 델파이 XE2에서Delphi XE2 : null 값이있는 필드를 전달하는 방법은 무엇입니까?

는 방법이 현재 델파이 5에서 작업 : BDE와 델파이 XE2에서 발생

ParamByName('id').datatype: = ftInteger; 

오류 : 에서

같은 오류와 함께 다음과 같은 방법으로 테스트 테이블 YY에서 외래 키 'XX'에 대한 기본 키 값 :

ParamByName('id').datatype: = ftInteger; 
ParamByName('id').value: = NULL; 

ParamByName('id').DataType: = ftstring; 
ParamByName('id').clear; 

ParamByName('id').DataType: = ftstring; 
ParamByName('id').Bound: = true; 

ParamByName('id').Value: = null; 

ParamByName('id').IsNull; 

어떻게 전달 null 값을 가진 필드?

UPDATE :

데이터베이스 :

CREATE TABLE TEST_1 (
    ID_1 INTEGER NOT NULL, 
    ID_TEST_2 INTEGER NULL, 
    DESC_1 VARCHAR(10) NULL, 
    PRIMARY KEY (ID_1) 
); 

CREATE TABLE TEST_2 (
    ID_2 INTEGER NOT NULL, 
    DESC_2 VARCHAR(10) NULL, 
    PRIMARY KEY (ID_2) 
); 

ALTER TABLE TEST_1 ADD FOREIGN KEY FK_TEST(ID_TEST_2) REFERENCES TEST_2(ID_2); 

델파이 XE2 :

Close; 
SQL.Clear; 
SQL.Add('insert into test_1 (id_1, id_test_2, desc_1) values (:id_1, :id_test_2, :desc_1)'); 
ParamByName('ID_1').AsInteger := 1; 
ParamByName('ID_TEST_2').DataType := ftInteger; 
ParamByName('ID_TEST_2').Clear; 
ParamByName('ID_TEST_2').Bound := True; 
ParamByName('DESC_1').AsString := 'DESCRIPTION TEST'; 
ExecSQL; 

결과 : 키 위반.

답변

8

NULL을 매개 변수 값으로 전달하려면 TParameter.Clear을 사용하십시오.

ParamByName('id').Clear; 

제쳐두고 : 당신은 정말로 지금까지 BDE를 제거해야했습니다. 현재 10 년 이상 사용이 중단되었으며 현대 버전의 Windows에서는 구성 및 사용이 어렵고 언제든지 예고없이 Delphi 배포에서 사라질 수 있습니다. (나는 개인적으로 아직이 일이 일어나지 않았다는 것에 놀랍니다.) 또한 현재 사용할 수있는 교차 플랫폼 대상을 지원하지 않습니다. 확실하게 10 년은 그것을 대체 할 수있을만큼 충분히 길다.

+0

네, 조만간 BDE를 바꿀 생각입니다. 오류가 계속 발생합니다. "XX"필드가 알 수없는 유형입니다. 하지만 오류는 BDE가 아니라 Delphi입니다. Null이 삽입되지 않았 으면 공백을 삽입하십시오. FreePascal에서와 동일한 논의가 있습니다. http://free-pascal-general.1045716.n5.nabble.com/How-to-clear-the-value-of-a-field-in-a-table-using- parameters-td5716247.html – user3565792

+0

이 게시물에서 Delphi XE4 및 Dbexpress와 동일한 오류가 발생했습니다. http://stackoverflow.com/questions/17042429/passing-null-value-into-parameterized-delphi-sql-server-query?rq= 1 – user3565792

+1

내가 게시 한 작품. NULL이나 문자열을 전달해야한다면 'if..else' 블록이 필요합니다.이 블록은 AsString을 사용하여 문자열을 할당하거나 NULL 인 경우 Clear를 사용합니다. (BDE가 아니더라도 항상 사용하고 있습니다. 오류가 델파이에있는 경우 ** 정확한 ** 오류 메시지를 게시하십시오. –

1

NULL을 전달할 때 Clear()을 호출 할 때도 Bound=True을 수동으로 설정해야하며 매개 변수를 처음 사용하는 경우는 보통 DataType도 수동으로 설정해야합니다. 나는 다음과 같은 코드를 사용하는 경향이있다.

Param := ParamByName('id'); 
if (shound assign a value) then 
begin 
    Param.AsInteger := ...; 
end else 
begin 
    Param.DataType := ftInteger; 
    Param.Clear; 
    Param.Bound := True; 
end; 
+0

내가 수행 한 테스트와 키 위반을 보여주는 주요 질문이 업데이트되었습니다. 오류가 발생합니다 – user3565792

+0

** 완전한 ** 오류 메시지 란 무엇입니까 위반 된 내용을 정확히 알려주 었음에 틀림 없음 A 키 위반 *은 여러 가지 이유로 인해 발생할 수 있습니다.추측해야만한다면 (추측해서는 안됩니다),'ID_1'가 기본 키이므로 각 행에'TEST_1'에'ID_1' 필드에 1의 값을 가진 행이 이미있는 것 같습니다. 고유 한 값을 가져야합니다. –

+0

만든 테이블에 데이터가 없습니다. ID_TEST_1 테이블에 첫 번째 레코드를 삽입 할 때 필드가 ID_TEST_2 EMPTY 및 NULL이 아니기 때문에 "키 위반"오류가 발생합니다. 비어 있음 = 키 위반. Null = 올바른 녹음입니다. – user3565792