C# - Requête SELECT nombre de lignes affectées est toujours -1
J'ai ce code et il renvoie toujours -1.J'ai trois tables (une photo est des plus suggestives ):
Je veux voir si la ligne est déjà dans le ReservationDetails table, et si ce n'est pas à l'insérer.
try
{
SqlConnection conn = new SqlConnection...
SqlCommand slct = new SqlCommand("SELECT * FROM ReservationDetails WHERE rID=@rID AND RNumber=@RNumber", conn);
slct.Parameters.AddWithValue("@rID", (int)comboBox1.SelectedValue);
slct.Parameters.AddWithValue("@RNumber", dataGridView1.SelectedRows[0].Cells[0].Value);
int noRows;//counts if we already have the entry in the table
conn.Open();
noRows = slct.ExecuteNonQuery();
conn.Close();
MessageBox.Show("The result of select="+noRows);
if (noRows ==0) //we can insert the new row
- pourquoi êtes-vous à l'aide de
ExecuteNonQuery
pour unSELECT
déclaration? - que dois-je utiliser alors? P. S. ce n'est pas un gros projet donc personne ne va insérer quoi que ce soit 🙂
Vous devez vous connecter pour publier un commentaire.
Vous devriez
1) Changer votre TSQL à
(mieux encore, utiliser
IF EXISTS
...)2) et de l'utilisation
ExecuteScalar()
:Aussi: vous aurez besoin d'utiliser une transaction (ou de certains autres atomique technique), ou quelqu'un qui pourrait insérer une ligne entre vous de tester et d'essayer de l'insérer...
Tout ce que dit, il serait préférable de créer une procédure stockée qui compte tenu de vos paramètres, atomiquement tests et des insertions dans la table, le retour
1
en cas de succès, ou0
si la ligne existe déjà.Avez-vous lu la documentation de
SqlCommand.ExecuteNonQuery
?Et votre requête SELECT.
Il est préférable de le faire en une seule requête, de sorte que vous n'avez pas besoin de serveur de demande à deux reprises.
Créer une procédure de ce genre et l'appeler à partir du code.
Comme par Microsoft:
You can use the ExecuteNonQuery to perform catalog operations (for example, querying the structure of a database or creating database objects such as tables), or to change the data in a database without using a DataSet by executing UPDATE, INSERT, or DELETE statements.
Ce dont vous avez besoin, au lieu de la méthode ExecuteNonQuery est ExecuteScalar et de mettre le nombre dans votre requête select.
c'est à dire
Aussi, essayez de faire usage de l'instruction à l'aide de C#, de sorte que vous n'avez pas besoin de s'inquiéter à propos de la fermeture de la connexion manuellement, même si les choses ne.
c'est à dire
voir:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx
@nickNatra
Lorsque vous utilisez
Il va vous renvoyer des valeurs. Qui peut être utilisé soit par
Mais
est utilisé uniquement lorsque vous utilisez
Oui, Si vous ne voulez savoir combien d'enregistrements dans votre requête.
Vous pouvez effectuer
où vous ne recevrez qu'une seule valeur de ie. Nombre de Lignes.
D'où cet satisfaire votre exigence.
Cheers!!