Я пытаюсь передать нулевое значение параметру 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;
Параметр 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».
Не уверен, что я делаю неправильно, любая помощь будет оценена по достоинству. В настоящее время я составляю список параметров в зависимости от того, заполнена строка или нет, и это работает хорошо; это просто немного неуклюже (в моем фактическом запросе), так как нужно проверить довольно много параметров.
Я использую 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' ....
... идея заключается в том, что если 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;