Tôi đang cố truyền giá trị null vào tham số TSQLDataset. Truy vấn có dạng:Truyền giá trị NULL vào truy vấn máy chủ SQL delphi được tham số hóa
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;
Tham số B là vô hiệu, nhưng cũng là khóa ngoài. Nếu người dùng nhập nội dung nào đó vào trường này, thì B phải được xác thực đối với các giá trị trong bảng khác. Nếu nó trống thì tôi muốn nó bị bỏ qua. Tôi đã đi qua '', nhưng điều này rõ ràng là tạo ra một lỗi vi phạm FK.
tôi đã cố gắng:
SQL_dataset.ParamByName('B').Value:=Null;
..nhưng sau đó tôi nhận được một "tài xế dbExpress không hỗ trợ kiểu dữ liệu tdbxtypes.unknown" lỗi.
Tôi cũng đã cố gắng:
SQL_dataset.ParamByName('B').DataType:=ftVariant;
SQL_dataset.ParamByName('B').Value:=Null;
..nhưng sau đó có "tài xế dbExpress không hỗ trợ kiểu dữ liệu tdbxtypes.variant" lỗi.
Không chắc chắn những gì tôi đang làm sai, mọi trợ giúp sẽ được đánh giá cao. Tôi hiện đang vẽ một danh sách tham số dựa trên việc chuỗi có được điền hay không, và điều này hoạt động tốt; nó chỉ là một chút clunky (trong truy vấn thực tế của tôi) vì có khá một vài tham số để xác nhận.
Tôi đang sử dụng Delphi XE4 và SQL Server 2012.
Cập nhật:
Cảm ơn tất cả sự giúp đỡ, góp ý của bạn đã đúng tất cả cùng, nó là cái gì khác mà sản xuất đó là tài xế dbExpress ' lỗi. Tôi đã tạo danh sách tham số 'linh hoạt' trong nỗ lực giải quyết vấn đề của mình và điều này gây ra ngoại lệ:
Parameter_string:='';
If B<>'' then Parameter_string:='B = :B,'
Query_text:='MERGE ...'
'...'
'UPDATE SET A = :A, '+Parameter_string+' C = :C' ....
... ý tưởng là nếu B là trống thì thông số sẽ không ' được liệt kê 'trong truy vấn.
Điều này không hiệu quả hoặc việc triển khai của tôi không hoạt động (không chắc chắn lý do tại sao, tôi rõ ràng là thiếu một bước nào đó).
Dù sao, mã làm việc:
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;
Cảm ơn, tôi cố gắng này, nhận được cùng một lỗi như đã nêu ở trên trong bình luận cho @ pf1957. Mayve tôi có cái gì khác đó là casung lỗi này? – Alex
Cảm ơn sự giúp đỡ, xem cập nhật. – Alex