L'utilisation de paramètres avec ADO Requête (mysql/MyConnector)
Aujourd'hui j'ai téléchargé et installé MyConnector si je peux utiliser Mysql avec ADO, tout installé, OK!, Je peux faire la connexion avec ODBC et de faire un lien à partir de mon delphi.
quand je construis ma Requête à runetime, j'obtiens un message d'erreur disant :
Projet Project1.exe ont soulevé l'exception de la classe EOleException avec le message suivant: "les Arguments sont de type incorrect, sont hors de la plage acceptable, ou sont en conflit les uns avec les autres". Le processus s'est arrêté. L'utilisation ou de l'Étape Exécuter pour continuer.
function TForm1.CreateSQL : TADOQuery;
begin
result := TADOQuery.create(self);
with Result do
begin
Connection := MainConnection;
CursorLocation := clUseServer;
CursorType := ctStatic;
CacheSize := 50;
AutoCalcFields := true;
ParamCheck := true;
Prepared := true;
end;
end;
procedure TForm1.login();
begin
with CreateSQL do
try
with SQL do
begin
add('SELECT ');
add(' * ');
add('FROM ');
add(' LisenswebUsers ');
add('WHERE ');
add(' UserName = :MyUsername '); //debugger exception here
add('AND ');
add(' UserPassword = :MyPassword '); //debugger exception here
with Parameters do
begin
ParamByName('MyUsername').value := txtLogin.text;
ParamByName('MyPassword').value := strmd5(txtPassword.text);
end;
Open;
if Recordcount <> 1 then
begin
lblLoggedinAs.Text := format('Du er logget inn som: %s (%s)',[FieldByName('Username').AsString,FieldByName('UserEmailaddress').AsString]);
MainPageControl.ActivePageIndex := 1;
end else
begin
txtPassword.Text := '';
txtPassword.SetFocus;
end;
end;
finally
free;
end;
end;
La chose la plus étrange est que cela fonctionne si je désactiver le débogage dans delphi.
J'ai ce problème aussi bien. La requête fonctionne mais le débogueur déclenche une exception lors de l'affectation de la requête paramétrée (ou lors de l'appel de
EndUpdate
. Cela se produit si oui ou non les paramètres ont été déclarés à l'avance avec AddParameter
. Définissant le champ DataType
ne résout pas le problème (char(8)
=> ftFixedChar
ou ftString
), (int(10) UN
=> ftLongWord
), etc. Sérieusement agaçant.
OriginalL'auteur Plastkort | 2010-09-29
Vous devez vous connecter pour publier un commentaire.
Je voudrais essayer d'ajouter SQL.BeginUpdate/SQL.EndUpdate autour du Ajoute, sinon le texte SQL sera analysé chaque fois que vous appelez "Ajouter".
C'est généralement une bonne idée, car ADOQuery.SQL est un TStringList qui a un événement OnChange qui définit la CommandText. SetCommandText du texte, puis retrouvez l'appel TADOCommand.AssignCommandText qui fait un travail d'analyse params, et la mise CommandObject.CommandText. Parfois, les pilotes de l'échec partiel des instructions SQL, mais ça semble OK.
J'ai eu un problème similaire il y a plusieurs années, c'est pourquoi j'ai appris beaucoup sur ce genre de choses!
BTW, le imbriquée
with
s sont vraiment laid (laissez le saint-guerre commencer)Je vais parfois utiliser
with
, mais ne serait jamais le nid trois niveaux! Si vous êtes, au moins, de réduire le champ d'application de SQL de sorte qu'il se termine avant avec des Paramètres.with
🙂sûr que je suis d'accord qu'avec la sont mauvais, mais surtout je m'assurer de ne pas obtenir les propriétés contradictoires ici. et aussi le faire pour plus de lisibilité et propre à la recherche de code. :)) malheureusement beginupdate et endupdate n'a pas fait aucune différence, sauf que maintenant, j'ai ajouté toutes les lignes de la première avant que j'ai obtenu l'erreur lors de l'appel de endupdate 🙁
il valait la peine d'essayer, comme je l'ai dit plus tôt, il n'a résoudre une certaine erreur que j'ai eu une fois, probablement avec Sysbase SQLAnywhere. Peut être un bug MySQL, essayez de reformater la requête, par exemple pour une seule ligne, supprimer attaque et de fuite des espaces etc.
peut-être qu'il peut être, je vais essayer sur mon deuxième ordinateur à la maison, le plus drôle, c'est que la requête fonctionne tant que je lance mon application en dehors de delphes, ou de désactiver le débogueur intégré :).. votre beginupdate et endupdate était une belle addon pour moi tho 🙂
OriginalL'auteur Gerry Coll
Essayez de définir explicitement le type de données :
OriginalL'auteur Edelcom
Dans mon cas, la définition des paramètres et de l'affectation de la chaîne de requête avant de l'affectation de la connexion corrigé le problème. La requête s'exécute avec succès dans les deux cas, mais la
TADOQuery
composante interne de la pose (et par la suite les hirondelles) leEOleException
noté dans l'OP si la connexion est donné avant que la requête paramétrée.Je suis ouvert à des explications pourquoi c'est le cas, rien dans la documentation semble indiquer un besoin de cet ordre des opérations.
L'exception est soulevée dans ADODB.pas dans
TADOCommand.AssignCommandText
icioù cette branche est la seule à suivre si le
TADOQuery
est attaché à une connexion en direct.InternalRefresh
effectue :Le problème semble être à l'OLE niveau, probablement parce que le pilote ODBC de MySQL ne prend pas en charge le retour de cette information (ou retourne des informations non valides). L'exception est levée derrière la
_Parameter
de l'interface lors de la configuration deà l'aide de ce qui semble être des valeurs non valides (
dwFlags
= 320 -> les bits définis ci-dessusDBPARAMFLAGSENUM
durée définie) retour d'GetParameterInfo
. La gestion des exceptions pour le contrôle de flux semble la seule option étant donné que l'interface ne fournit aucun mécanisme pour vérifier les valeurs avant de les mettre (et de déclencher des exceptions).Mise à jour :
Il s'avère qu'il y est un ouvert QC à ce sujet : http://qc.embarcadero.com/wc/qcmain.aspx?d=107267
qc.embarcadero.com
des liens plus. Si vous avez besoin d'accès à l'ancien QC données, regarde QCScraper.OriginalL'auteur J...
BeginUpdate/EndUpdate paire n'est pas adéquate. Utilisation AddParameter pour ajouter des paramètres explicitement avant l'attribution de la commande sql. Comme:
Il n'est pas simple. Après de nombreux tests, j'en viens à la conclusion que ce message d'erreur ('Arguments sont de type incorrect, sont hors de la plage acceptable, ou sont en conflit les uns avec les autres") ne correspond pas à la commande sql. Dans mon application, je peux simplement ignorer cette erreur et le sql peut être exécutée correctement.
OriginalL'auteur Sender