Sélectionnez une requête pour get des données de SQL Server

J'essaie d'exécuter la requête SQL Select dans mon code C #. Mais je reçois toujours la sortie -1 sur

int result = command.ExecuteNonQuery(); 

Cependant, la même table si je l'utilise pour delete ou insert travaux …

ConnectSsortingng est également très bien.

Veuillez vérifier le code ci-dessous

 SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password="); conn.Open(); SqlCommand command = new SqlCommand("Select id from [table1] where name=@zip", conn); //command.Parameters.AddWithValue("@zip","india"); int result = command.ExecuteNonQuery(); // result gives the -1 output.. but on insert its 1 using (SqlDataReader reader = command.ExecuteReader()) { // iterate your results here Console.WriteLine(Ssortingng.Format("{0}",reader["id"])); } conn.Close(); 

La requête fonctionne correctement sur SQL Server, mais je ne comprends pas pourquoi seule la requête select ne fonctionne pas.

Toutes les autres requêtes fonctionnent.

SqlCommand.ExecuteNonQuery, méthode

Vous pouvez utiliser ExecuteNonQuery pour effectuer des opérations de catalogue (par exemple, interroger la structure d'une database ou créer des objects de database tels que des tables) ou modifier datatables dans une database sans utiliser DataSet en exécutant les instructions UPDATE, INSERT ou DELETE. Bien que ExecuteNonQuery ne renvoie aucune ligne, les parameters de sortie ou les valeurs de return mappés aux parameters sont remplis avec des données. Pour les instructions UPDATE, INSERT et DELETE, la valeur de return est le nombre de lignes affectées par la command. Lorsqu'un triggersur existe sur une table en cours d'insertion ou de mise à jour, la valeur de return inclut le nombre de lignes affectées par l'opération d'insertion ou de mise à jour et le nombre de lignes affectées par le ou les triggersurs. Pour tous les autres types d'instructions, la valeur de return est -1. Si une annulation se produit, la valeur de return est également -1.

SqlCommand.ExecuteScalar, méthode Exécute une instruction Transact-SQL par rapport à la connection et renvoie le nombre de lignes affectées.

Donc, pour get non. des instructions renvoyées par l'instruction SELECT, vous devez utiliser la méthode ExecuteScalar.

Référence: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx

Alors essayez ci-dessous le code:

 SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password="); conn.Open(); SqlCommand command = new SqlCommand("Select id from [table1] where name=@zip", conn); command.Parameters.AddWithValue("@zip","india"); // int result = command.ExecuteNonQuery(); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { Console.WriteLine(Ssortingng.Format("{0}",reader["id"])); } } conn.Close(); 

Selon MSDN

http://msdn.microsoft.com/ru-ru/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx

le résultat est le nombre de lignes affectées , et puisque votre requête est select aucune ligne n'est affectée (c'est-à-dire insérée, supprimée ou mise à jour) de toute façon.

Si vous souhaitez renvoyer une seule ligne de la requête, utilisez ExecuteScalar() au lieu de ExecuteNonQuery() :

  int result = (int) (command.ExecuteScalar()); 

Toutefois, si vous pensez que plusieurs lignes doivent être renvoyées, ExecuteReader() est la seule option:

  using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { int result = reader.GetInt32(0); ... } } 

vous pouvez utiliser ExecuteScalar() à la place de ExecuteNonQuery() pour get un résultat unique.

 Int32 result= (Int32) command.ExecuteScalar(); Console.WriteLine(Ssortingng.Format("{0}", result)); 

Il exécutera la requête et renvoie la première colonne de la première ligne de l'set de résultats renvoyé par la requête. Les colonnes ou les lignes supplémentaires sont ignorées.

Comme vous ne voulez qu'une ligne en return, supprimez cette utilisation de SqlDataReader de votre code

 using (SqlDataReader reader = command.ExecuteReader()) { // iterate your results here Console.WriteLine(Ssortingng.Format("{0}",reader["id"])); } 

car il exécutera à nouveau votre command et affectera les performances de votre page.

C'est par design.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx

Pour les instructions UPDATE, INSERT et DELETE, la valeur de return est le nombre de lignes affectées par la command. Lorsqu'un triggersur existe sur une table en cours d'insertion ou de mise à jour, la valeur de return inclut le nombre de lignes affectées par l'opération d'insertion ou de mise à jour et le nombre de lignes affectées par le ou les triggersurs. Pour tous les autres types d'instructions, la valeur de return est -1. Si une annulation se produit, la valeur de return est également -1.

vous devez append un paramètre également @zip

  SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password="); conn.Open(); SqlCommand command = new SqlCommand("Select id from [table1] where name=@zip", conn); // // Add new SqlParameter to the command. // command.Parameters.AddWithValue("@zip","india"); int result = (Int32) (command.ExecuteScalar()); using (SqlDataReader reader = command.ExecuteReader()) { // iterate your results here Console.WriteLine(Ssortingng.Format("{0}",reader["id"])); } conn.Close(); 

Vous devez utiliser ExecuteScalar() (qui returnne la première colonne de la première ligne) au lieu de ExecuteNonQuery() (qui renvoie le numéro de ligne affecté).

Vous devez vous référer aux différences entre executescalar et executenonquery pour plus de détails.

J'espère que cela aide!