I'm using Delphi 7 and Firebird 1.5.
I have a query that I create at runtime where some of the values might be null. I can't work out how to get Firebird to accept explicit nulls for values that I need to leave as null. At this stage I'm building the SQL so that I don't include parameters that are null but this is tedious and error-prone.
var Qry: TSQLQuery;begin SetConnection(Query); // sets the TSQLConnection property to a live database connection Query.SQL.Text := 'INSERT INTO SomeTable (ThisColumn) VALUES (:ThisValue)'; Query.ParamByName('ThisValue').IsNull := true; // read only, true by default Query.ParamByName('ThisValue').Clear; // does not fix the problem Query.ParamByName('ThisValue').IsNull = true; // still true Query.ParamByName('ThisValue').Bound := true; // does not fix the problem Query.ExecSQL;
Currently an EDatabaseError "No value for parameter 'ThisValue'"' is raised in DB.pas so I suspect this is by design rather than a firebird problem.
Can I set parameters to NULL? If so, how?
(edit: sorry for not being explicit about trying .Clear before. I left it out in favour of mentioning IsNull. Have added declaration and more code)
Sorry, one more thing: there is no "NOT NULL" constraint on the table. I don't think it's getting that far, but thought I should say.
Complete console app that displays the problem at my end:
program InsertNull;{$APPTYPE CONSOLE}uses DB, SQLExpr, Variants, SysUtils;var SQLConnection1: TSQLConnection; Query: TSQLQuery;begin SQLConnection1 := TSQLConnection.Create(nil); with SQLConnection1 do begin Name := 'SQLConnection1'; DriverName := 'Interbase'; GetDriverFunc := 'getSQLDriverINTERBASE'; LibraryName := 'dbexpint.dll'; LoginPrompt := False; Params.clear; Params.Add('Database=D:\Database\ZMDDEV12\clinplus'); Params.Add('RoleName=RoleName'); //REDACTED Params.Add('User_Name='); //REDACTED Params.Add('Password='); Params.Add('ServerCharSet='); Params.Add('SQLDialect=1'); Params.Add('BlobSize=-1'); Params.Add('CommitRetain=False'); Params.Add('WaitOnLocks=True'); Params.Add('ErrorResourceFile='); Params.Add('LocaleCode=0000'); Params.Add('Interbase TransIsolation=ReadCommited'); Params.Add('Trim Char=False'); VendorLib := 'gds32.dll'; Connected := True; end; SQLConnection1.Connected; Query := TSQLQuery.Create(nil); Query.SQLConnection := SQLConnection1; Query.Sql.Text := 'INSERT INTO crs_edocument (EDOC_ID, LINKAGE_TYPE) VALUES (999327, :ThisValue)'; //Query.ParamByName('ThisValue').IsNull := true; // read only, true by default// Query.ParamByName('ThisValue').Value := NULL; Query.ParamByName('ThisValue').clear; // does not fix the problem Query.ParamByName('ThisValue').Bound := True; // does not fix the problem// Query.ParamByName('ThisValue').IsNull; // still true Query.ExecSQL;end.