Valeur de retour de OleDbCommand
sqlQuery = "SELECT [ID] from [users] WHERE CallerName=@CallerName";
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
cmd = new OleDbCommand(sqlQuery, conn);
cmd.CommandText = sqlQuery;
cmd.Parameters.Add("@CallerName", OleDbType.VarChar).Value = labelProblemDate.Text.Trim();
cmd.Parameters["@CallerName"].Value = name;
cmd.ExecuteNonQuery();
conn.Close();
M'a dit que c'est la façon de lire les données d'une requête de sélection à l'aide de Paramètres, mais ça ne fonctionne pas. Je pense que j'ai fait quelque chose de mal.
Je suis en utilisant des WinForms et Microsoft Access 2007
Quels messages d'erreur en êtes-vous? Aussi, vous semblez être confus avec votre
Vous voulez que tous les ID de ce nom, ou seulement un seul? Si ce dernier, il serait préférable de
@CallerName
paramètre. Qu'est-ce que la variable "nom" et aussi, ExecuteNonQuery
de ne pas effectuer une sélection.Vous voulez que tous les ID de ce nom, ou seulement un seul? Si ce dernier, il serait préférable de
SELECT TOP 1 ID FROM [users] WHERE CallerName=@CallerName
. Ensuite, utilisez ExecuteScalar
(lien à l'intérieur) afin de ne récupérer que l'on choisi d'identité (le cas échéant).
OriginalL'auteur Cocoa Dev | 2012-04-27
Vous devez vous connecter pour publier un commentaire.
Il semble que vous avez votre réponse, mais je tenais à préciser un peu les choses à partir de votre code d'exemple:
Tout d'abord, notez que la Requête SQL est à l'aide de Microsoft SQL syntaxe et que Microsoft Access préfère une syntaxe légèrement différente. Au lieu de l'emballage de votre colonne les noms entre crochets, utiliser le tilde marque:
Prochaine, dans votre Requête SQL, sachez que Microsoft Access n'accepte pas les paramètres nommés. Votre texte SQL ci-dessus en utilisant
@CallerName
va exécuter sans problème, mais tous les OleDb objet va voir, c'est ceci:Si, à un certain moment plus tard, vous décidez d'aller avec des Procédures Stockées au lieu de texte SQL, n'oubliez pas d'appeler Prepare() sur votre
OleDbCommand
après l'ajout de vos paramètres et avant l'exécution de la commande.Si vous avez de multiples paramètres, assurez-vous d'ajouter ces paramètres à votre
OleDbCommand
dans le même ordre que vous les avez appelés, dans votre texte SQL. OleDb ne se soucie pas ce que vous nom, mais vous pouvez également les utiliser pour vous-même, pour vous aider; il n'est PAS utilisé dans la requête.@CallerName
fera aucune tentative de faire correspondre avec n'importe quoi dans votre texte SQL.Prochaine, je voulais regarder votre utilisation de la
OleDbParameter
élément. Dans les deux lignes ci-dessous, vous ajoutez un (1) paramètre de votreOleDbCommand
avec la valeur labelProblemDate.Texte.Trim() et dans la très prochaine ligne vous sont re-affectation de la même valeur du paramètre à une variable (ce qui nous est inconnu) appeléname
. Il n'est pas bon pour vous de déclarer le paramètre avec une valeur puis re-affecter à autre chose.Vous pourriez avoir utilisé la modification de l'extrait de code ci-dessous et obtenu les mêmes résultats (n'oubliez pas d'ajouter le champ taille, comme indiqué ci-dessous et spécifié dans votre base de données):
De la même façon, votre
OleDbCommand
est créé avec votresqlQuery
paramètre, en précisant votre commande estCommandText
propriété est inutile:Enfin, comme d'autres l'ont dit, si vous voulez interroger vos données que votre instruction SQL suggèrent, vous devez lire les données, par opposition à l'appel de
ExecuteNonQuery()
(avis il est appelé Non de la Requête).Pour résumer, j'ai écrit ici:
Toujours mettre le Fermer dans un
finally
bloc dans le cas où votre programme génère une erreur pour une raison quelconque. Cela empêche votre application à partir de la plante et en laissant ouvert le fichier. Unusing
clause, j'ai trouvé, n'est pas nécessairement fermer une connexion, quand c'est fait (comme ils sont censés le faire).J'espère que cette aide. Je suis rafraîchir mes connaissances de
OleDb
pour le moment, et je voulais souligner un certain nombre de choses.Qu'est ce qu'un à l'aide de l'instruction est censé faire. Je ne suis pas sûr pourquoi l'Accès ne fonctionne pas. Juste deviner, je dirais que c'est parce que les bases de données d'Accès sont généralement locaux et sur le PC de l'utilisateur et le groupe d'Accès décidé il n'y a pas de raison de fermer leur base de données, tandis que le programme était en place et en cours d'exécution.
Parlez-vous le groupement de connexions? si vous faites c'est vraiment une bonne idée, puisque vous n'avez pas de frais généraux pour l'ouverture des connexions, et vous pouvez envisager la "fermé" connexions effectivement fermé (ASP proche pour vous une fois que le serveur est fermé). Je pense que ça marche comme ça avec enfin de la connexion.close() ainsi
Je ne suis pas sûr si l'Accès utilise le Regroupement de Connexion. Il est à seulement 1 base de données, et il ne peut avoir qu'une seule connexion à la fois.
OriginalL'auteur jp2code
ExecuteNonQuery ne retourne pas de données, seules les lignes affectées par votre commande
Vous avez besoin d'utiliser ExecuteReader avec un OleDbDataReader
OriginalL'auteur Steve
Si une requête renvoie une valeur, vous pouvez utiliser
ExecuteScalar
pour récupérer la valeur.ExecuteNonQuery
ne retourne pas une valeur à partir de votre base de données; c'est plutôt prévu pour une utilisation avecUPDATE
des déclarations et des autres, et il retourne le nombre de lignes affectées par l'instruction.Vous le savez sans doute, mais en général, les requêtes SELECT peut retourner plus d'une ligne (et plus d'une colonne), de sorte à "lire des données à partir d'une requête SELECT", vous utilisez
ExecuteReader
pour obtenir unDbDataReader
.OriginalL'auteur phoog
De Lire les Données et de les Charger dans la Table de données:
À Lire Scalor Données de la Valeur et de la Charger dans Variable:
J'espère que cela aide
OriginalL'auteur Syed