Wie kann ich explizit einfügen von Nullen in eine parametized Abfrage?
Ich bin mit Delphi 7 und Firebird 1.5.
Ich habe eine Abfrage, die ich zur Laufzeit erstellen, wo einige der Werte kann null sein. Ich kann nicht herausfinden, wie man Firebird zu akzeptieren explizite null-Werte für Werte, die ich brauche zu verlassen, als null. In dieser Phase Baue ich den SQL so, dass ich nicht die Parameter enthalten, die null sind, aber das ist mühsam und fehleranfällig.
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;
Derzeit eine EDatabaseError "Kein Wert für parameter 'ThisValue'"' ausgelöst wird, in DB.pas also ich vermute, das ist von design als vielmehr einer firebird-problem.
Kann ich legen Sie die Parameter auf NULL? Wenn ja, wie?
(edit: sorry, für die nicht explizit versucht .Klar vor. Ich ließ es sich für die Erwähnung IsNull. Haben Hinzugefügt, Erklärung und mehr code)
Sorry, noch eine Sache: es gibt keine "not NULL" - constraint auf der Tabelle. Ich glaube nicht, dass es immer so weit, aber dachte, ich sollte sagen.
Komplette console-app, die zeigt das problem an meinem Ende:
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.
InformationsquelleAutor der Frage | 2011-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Grund des Fehlers ist 'dbx' nicht kennen den Datentyp des Parameters. Da wird es nie ein Wert zugewiesen, der Datentyp ist
ftUnknown
im execute-Zeit, daher der Fehler. Für die "ParamType", aber 'ptInput' wird standardmäßig angenommen, also kein problem.Sie definitiv nicht brauchen, um
Clear
die parameter, da es bereitsNULL
. Woher wissen wir es?IsNull
wieder wahr...Vom TParam.Clear-Methode:
Vom TParam.IsNull-Eigenschaft:
Sie definitiv nicht brauchen, um
Bound
die parameter, wie es ist völlig irrelevant. Wenn 'Gebunden' ist false, wird der Datensatz Versuch einen Standard-Wert aus der datasource für den parameter. Aber Ihre Datenmenge ist auch nicht mit einer Datenquelle verknüpft. Aus der Dokumentation:Wenn die Dokumentation nicht genug, finden Sie den code in
TCustomSQLDataSet.SetParamsFromCursor
im 'sqlexpr.pas'. Es ist der einzige Ort, wo die 'Gebunden' wird ein parameter bezeichnet, die in dbx-framework.InformationsquelleAutor der Antwort Sertac Akyuz
Verwenden
TParam.Clear
"Clear zuweisen einen NULL-Wert an einen parameter." (aus der Dokumentation)
InformationsquelleAutor der Antwort awmross
Sertac s Antwort ist korrekt, aber ich fand auch die Auswahl der Fahrer einen Unterschied macht.
Sich für das wohl anderer, hier ist eine verbesserte test-Programm, das zeigt, wie Sie einlegen könnte, die null-Werte mit einem parametrierten Abfrage mit Firebird 1.5.
InformationsquelleAutor der Antwort Sam
Sind Sie sicher, dass die Parameter angelegt, die nur die Einstellung der text der SQL?
versuchen
Sowieso, warum nicht den SQL-text:
wenn Sie wissen den Wert null...
InformationsquelleAutor der Antwort Despatcher
Haben eine Eigenschaft auf
TConnection Options
namens HandlingStringType/Konvertieren leere Zeichenfolgen zu null. Halten Sie es wahr-und anzunehmenQuery.ParamByName('ThisValue').AsString:=''
;Sie können es in
InformationsquelleAutor der Antwort Ricardo da Rocha Vitor