Próbuję przekazać wartość pustą do parametru TSQLDataset. Zapytanie ma postać:Przekazywanie wartości NULL do sparametryzowanego zapytania SQL delphi serwera
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;
Parametr B jest zerowalny, ale jest również kluczem obcym. Jeśli użytkownik wprowadzi coś w tym polu, to B musi zostać sprawdzone względem wartości z innej tabeli. Jeśli jest pusty, chcę go zignorować. Mijałem w "", ale to oczywiście powoduje błąd naruszenia FK.
Próbowałem:
SQL_dataset.ParamByName('B').Value:=Null;
..ale potem dostać „dbExpress sterownik nie obsługuje typ danych tdbxtypes.unknown” błąd.
Próbowałem również:
SQL_dataset.ParamByName('B').DataType:=ftVariant;
SQL_dataset.ParamByName('B').Value:=Null;
..ale potem dostał "dbExpress sterownik nie obsługuje typ danych tdbxtypes.variant" błąd.
Nie jestem pewien, co robię źle, każda pomoc będzie doceniona. Obecnie przygotowuję listę parametrów na podstawie tego, czy łańcuch jest wypełniany, czy nie, i to działa dobrze; jest to po prostu trochę niezgrabne (w moim prawdziwym zapytaniu), ponieważ istnieje kilka parametrów do sprawdzenia poprawności.
używam Delphi XE4 i serwera SQL 2012.
Aktualizacja:
Dzięki za wszelką pomoc, wasze sugestie były rację, to było coś innego, że produkowane dbexpress że „sterownik” błąd. I było stworzenie „elastyczne” listę parametrów, starając się ominąć mój problem, a to spowodowało wyjątek:
Parameter_string:='';
If B<>'' then Parameter_string:='B = :B,'
Query_text:='MERGE ...'
'...'
'UPDATE SET A = :A, '+Parameter_string+' C = :C' ....
... pomysł jest, że jeśli B jest puste to parametr nie będzie " na liście "w zapytaniu.
To nie działa, albo moja implementacja tego nie działa (nie jestem pewien dlaczego, oczywiście brakuje czegoś gdzieś).
Zresztą kod roboczych:
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;
Dzięki, to próbowałem, uzyskać ten sam błąd, jak wspomniano powyżej w komentarzu do @ pf1957. Czy mam coś jeszcze, co jest przyczyną tego błędu? – Alex
Dzięki za pomoc, zobacz aktualizację. – Alex