Sto tentando di passare un valore null a un parametro TSQLDataset. La query ha il seguente formato:Passaggio del valore NULL in query delphi server SQL parametrizzata
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;
Il parametro B è annullabile, ma è anche una chiave esterna. Se l'utente inserisce qualcosa in questo campo, allora B deve essere convalidato rispetto ai valori in un'altra tabella. Se è vuoto, voglio che venga ignorato. Stavo passando "", ma questo ovviamente produce un errore di violazione FK.
ho provato:
SQL_dataset.ParamByName('B').Value:=Null;
..ma tanto sono un "autista dbExpress non supporta il tipo di dati tdbxtypes.unknown" errore.
Ho anche provato:
SQL_dataset.ParamByName('B').DataType:=ftVariant;
SQL_dataset.ParamByName('B').Value:=Null;
..ma poi si "dbExpress driver non supporta il tipo di dati tdbxtypes.variant" errore.
Non so cosa sto facendo male, qualsiasi aiuto sarebbe apprezzato. Attualmente sto elaborando un elenco di parametri basato sul fatto che la stringa sia popolata o meno, e questo funziona bene; è solo un po 'goffo (nella mia domanda reale) poiché ci sono alcuni parametri da validare.
Sto usando Delphi XE4 e SQL Server 2012.
Aggiornamento:
Grazie per tutto l'aiuto, i vostri suggerimenti avevano ragione tutti insieme, era qualcos'altro che ha prodotto quel 'autista dbExpress' errore. Stavo creando una lista di parametri 'flessibile', nel tentativo di aggirare il problema, e questo ha causato l'eccezione:
Parameter_string:='';
If B<>'' then Parameter_string:='B = :B,'
Query_text:='MERGE ...'
'...'
'UPDATE SET A = :A, '+Parameter_string+' C = :C' ....
... L'idea è che se B è vuota, allora il parametro non sarà ' elencato 'nella query.
Questo non funziona, o la mia implementazione non funziona (non so perché, mi manca ovviamente un passaggio da qualche parte).
Comunque, il codice di lavoro:
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;
Grazie, ho provato questo, ottenere lo stesso errore come osservato in precedenza nel commento a @ pf1957. Mayve ho qualcos'altro che ha incastrato questo errore? – Alex
Grazie per l'aiuto, vedi aggiornamento. – Alex