Comment insérer explicitement des nulls dans une requête paramétrée?
Je suis l'aide de Delphi 7 et Firebird 1.5.
J'ai une question que j'ai créer au moment de l'exécution, où les valeurs peuvent être null. Je ne peux pas travailler sur la façon d'obtenir Firebird pour accepter explicite des valeurs null pour les valeurs que je dois les laisser comme null. À ce stade, je suis en train de construire le SQL de sorte que je ne comprend pas les paramètres qui sont nuls mais c'est fastidieux et source d'erreurs.
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;
Actuellement un EDatabaseError "Pas de valeur pour le paramètre "Cettevaleur'"', est soulevée dans le DB.pas donc je suppose que c'est voulu par la conception plutôt qu'une firebird problème.
Puis-je définir des paramètres à NULL? Si oui, comment?
(edit: désolé de ne pas être plus explicite à propos de l'essai .Clair avant. Je l'ai laissée en faveur de mentionner IsNull. Ont ajouté de déclaration et de plus de code)
Désolé, encore une chose: il n'y a pas de "not NULL" contrainte sur la table. Je ne pense pas que c'est arriver aussi loin, mais pensé que je devrais dire.
Console complète application qui affiche le problème à ma fin:
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.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
La raison de l'erreur est " dbx " ne sait pas le type de données du paramètre. Depuis il n'est jamais affecté une valeur, c'est le type de données est
ftUnknown
au moment de l'exécution, d'où l'erreur. Même pour la "ParamType", mais "ptInput' est pris en charge par défaut, donc pas de problème avec ça.Vous certainement n'avez pas besoin de
Clear
le paramètre car il est déjàNULL
. Comment savons-nous?IsNull
est de retour vrai...De TParam.Méthode Claire:
De TParam.Propriété IsNull:
Vous certainement n'avez pas besoin de
Bound
le paramètre tel qu'il est complètement hors de propos. Lorsque "Liées" est faux, le jeu de données sera tentative pour fournir une valeur par défaut à partir de sa source de données pour le paramètre. Mais votre jeu de données n'est même pas lié à une source de données. À partir de la la documentation:Si la documentation n'est pas assez, reportez-vous au code de la
TCustomSQLDataSet.SetParamsFromCursor
dans 'sqlexpr.pas'. C'est le seul endroit où le "Liées" d'un paramètre est appelé dans dbx cadre.Utilisation
TParam.Clair
"Clair pour attribuer une valeur NULL en paramètre." (à partir de la documentation)
Sertac la réponse est correcte, mais j'ai aussi trouvé le choix de pilote fait une différence.
Pour le bénéfice des autres, voici un meilleur programme de test qui montre comment vous pouvez insérer les valeurs null avec une requête paramétrée avec Firebird 1.5.
Êtes-vous sûr que les paramètres ont été créés simplement en paramètre le texte du SQL?
essayer
De toute façon, pourquoi ne pas rendre le texte SQL:
si vous connaissez la valeur va être nul...
Ont une propriété sur
TConnection Options
nommé HandlingStringType/Convertir des chaînes vides à null. De les conserver vraies, et supposonsQuery.ParamByName('ThisValue').AsString:=''
;Vous pouvez y accéder en