将NULL值传递给参数化的delphi SQL Server查询

Ale*_*lex 5 sql-server delphi parameterized-query delphi-xe4

我试图将空值传递给TSQLDataset参数.查询具有以下形式:

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;
Run Code Online (Sandbox Code Playgroud)

参数B可以为空,但也是外键.如果用户在此字段中输入内容,则必须根据另一个表中的值验证B. 如果它是空白,那么我希望它被忽略.我正在传递'',但这显然会产生FK违规错误.

我试过了:

SQL_dataset.ParamByName('B').Value:=Null;
Run Code Online (Sandbox Code Playgroud)

..但后来我得到一个"dbexpress驱动程序不支持tdbxtypes.unknown数据类型"错误.

我也尝试过:

SQL_dataset.ParamByName('B').DataType:=ftVariant;
SQL_dataset.ParamByName('B').Value:=Null;
Run Code Online (Sandbox Code Playgroud)

..但后来得到"dbexpress驱动程序不支持tdbxtypes.variant数据类型"错误.

不知道我做错了什么,任何帮助将不胜感激.我目前正在根据字符串是否填充来绘制参数列表,这样做效果很好; 它只是有点笨重(在我的实际查询中),因为有很多参数需要验证.

我正在使用Delphi XE4和SQL Server 2012.

更新:

感谢所有的帮助,你的建议一直都是正确的,这是产生'dbexpress驱动'错误的其他因素.为了解决我的问题,我正在创建一个"灵活的"参数列表,这导致了异常:

Parameter_string:='';

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

Query_text:='MERGE ...'
            '...'
            'UPDATE SET A = :A, '+Parameter_string+' C = :C' ....
Run Code Online (Sandbox Code Playgroud)

...这个想法是,如果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;
Run Code Online (Sandbox Code Playgroud)

小智 2

如果我没记错的话,Delphi 中的 db-null 等效项是 Variants.Null