2013-06-11 1 views
5

null 값을 TSQLDataset 매개 변수에 전달하려고합니다. 쿼리 형식은 다음과 같습니다.매개 변수가있는 delphi SQL 서버 쿼리에 NULL 값을 전달합니다.

Query_text:='MERGE INTO [Table] 
      USING (VALUES (:A,:B)) AS Source (Source_A, Source_B) 
      .... 
      WHEN MATCHED THEN 
      UPDATE SET A = :A 
      WHEN NOT MATCHED THEN 
      INSERT(A, B) VALUES (:A,:B); 

SQL_dataset.CommandType:=ctQuery; 
SQL_dataset.CommandText:=Query_text; 

SQL_dataset.ParamByName('A').AsString:='A'; 
SQL_dataset.ParamByName('B').AsString:={ COULD BE NULL, OR A STRING };  

SQL_dataset.ExecSQL; 

매개 변수 B는 null이지만, 외래 키이기도합니다. 사용자가이 필드에 내용을 입력하면 B는 다른 테이블의 값에 대해 유효성을 검사해야합니다. 비어 있으면 무시해야합니다. 나는 ''을 통과하고 있었지만, 분명히 FK 위반 오류가 발생합니다.

SQL_dataset.ParamByName('B').Value:=Null; 

을 ..하지만 그때 오류 "의 dbExpress 드라이버가 tdbxtypes.unknown 데이터 형식을 지원하지 않습니다"얻을 :

나는 시도했다.

나는 또한 시도 :

SQL_dataset.ParamByName('B').DataType:=ftVariant; 
SQL_dataset.ParamByName('B').Value:=Null; 

이 ..하지만 다음 오류 "의 dbExpress 드라이버가 tdbxtypes.variant 데이터 형식을 지원하지 않습니다"있어요.

내가 잘못하고있는 것이 확실하지 않은 경우 어떤 도움을 주시면 감사하겠습니다. 현재 문자열이 채워 졌는지 여부에 따라 매개 변수 목록을 그리는 중입니다. 유효성을 검사 할 매개 변수가 꽤 있기 때문에 (내 실제 쿼리에서) 조금 어색하다. 델파이 XE4와 SQL 서버를 사용하고

2012

업데이트 : 모든 도움

감사합니다, 당신의 제안은 그 '의 dbExpress 드라이버'를 생산 뭔가 다른했다 옳았했다 오류. 나는 내 문제를 해결하기 위해 노력에 '유연한'매개 변수의 목록을 작성하고,이 예외 발생 :

Parameter_string:=''; 

If B<>'' then Parameter_string:='B = :B,' 

Query_text:='MERGE ...' 
      '...' 
      'UPDATE SET A = :A, '+Parameter_string+' C = :C' .... 

을 ... B가 비어있는 경우 다음 매개 변수가되지 않을 것 인 생각 ' 목록에 '표시됩니다.

이 기능이 작동하지 않거나 내 구현이 작동하지 않습니다. 이유는 분명하지 않습니다. 분명히 어딘가에 단계가 없습니다.

어쨌든, 작업 코드 :

Query_text:='MERGE ...' 
      '...' 
      'UPDATE SET A = :A, B = :B, C = :C' .... 

SQL_dataset.CommandType:=ctQuery; 
SQL_dataset.CommandText:=Query_text; 

If B<>'' then 
begin 
    SQL_dataset.ParamByName('B').AsString:='B'; 
end 
else 
begin 
    SQL_dataset.ParamByName('B').DataType:=ftString; 
    SQL_dataset.ParamByName('B').Value:=Null; 
end; 

답변

1

내가 올바르게 기억, 델파이에서 DB-널 상응하는 Variants.Null

입니다
0

일반적인 접근 한 번 쿼리 당과 적절한를 지정 매개 변수를 사용하는 것 데이터 형식. 값을 NULL에 할당 할 수 있습니다. 에 대해 어떻게

var 
Query_text:String; 
begin 
    Query_text:='Declare @A varchar(100) ' // or e.g. integer 
     +#13#10'Declare @B varchar(100)' 
     +#13#10'Select @A=:A' 
     +#13#10'Select @B=:B' 
     +#13#10'Update Adressen Set [email protected],[email protected] where [email protected]'; 
    SQL_dataset.CommandType := ctQuery; 
    SQL_dataset.CommandText := Query_text; 
    SQL_dataset.Params.ParseSQL(SQL_dataset.CommandText,true); 
    Showmessage(IntToStr(SQL_dataset.Params.Count)); 
    SQL_dataset.ParamByName('B').DataType := ftString; 
    SQL_dataset.ParamByName('B').Value := 'MyText'; 
    SQL_dataset.ParamByName('A').DataType := ftString; // or e.g. ftInteger 
    SQL_dataset.ParamByName('A').Value := NULL; 
    SQL_dataset.ExecSQL; 
end; 
+0

감사합니다, 나는이 시도는, 같은 오류가 발생합니다. 나는이 오류가 발생했다는 것을 알고 싶습니다. – Alex

+0

도움을 주셔서 감사합니다. 업데이트를 참조하십시오. – Alex

2

: @의 pf1957 의견에 위에서 언급 한 바와 같이

SQL_dataset.ParamByName('B').Clear;

+0

다른 곳에서 그 제안을 읽었지만 "dbExpress 드라이버가 TDBXTypes.UNKNOWN 데이터 형식을 지원하지 않습니다. 공급 업체 오류 메시지 :"시도 할 때 오류가 발생했습니다. 내가 뭔가 잘못하고 있는거야? – Alex

+0

이상한 ...현재 FIB +에서 FireDAC으로 마이그레이션 중이며 두 연결에서이를 테스트했으며 Clear 또는 Value : = null 할당을 사용할 수 있습니다. 그리고 각 데이터 세트에서 작동 할 것으로 기대됩니다. 적어도이 문제는 결코 만난적이 없지만 dbExpress는 사용하지 않았습니다. – pf1957

+0

다시 한번 감사드립니다. 위의 업데이트를 참조하십시오. – Alex