Как мне явно вставить нули в параметризованный запрос?

Я использую Delphi 7 и Firebird 1.5.

У меня есть запрос, который я создаю во время выполнения, где некоторые из значения могут быть нулевыми. Я не могу понять, как заставить Firebird принимать явные нули для значений, которые мне нужно оставить равными нулю. На этом этапе я создаю SQL, чтобы не включать параметры, которые имеют значение NULL, но это утомительно и чревато ошибками.

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;

В настоящее время в базе данных возникает ошибка EDatabaseError «Нет значения для параметра ThisValue» ». pas, поэтому я подозреваю, что это сделано намеренно, а не проблема firebird.

Могу ли я установить для параметров значение NULL? Если да, то как?

(edit: извините за то, что не дал явного указания на попытку .Clear раньше. Я оставил это в пользу упоминания IsNull. Добавил объявление и другой код)

Извините, еще кое-что: есть нет ограничения "NOT NULL" для таблицы. Не думаю, что дело заходит так далеко, но подумал, что должен сказать.

Полное консольное приложение, которое отображает проблему на моей стороне:

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.
15
задан 15 June 2011 в 03:35
поделиться