web-dev-qa-db-fra.com

Sélectionnez la requête pour obtenir 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 j'utilise pour delete ou insert fonctionne ...

ConnectString va aussi bien.

S'il vous plaît 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(String.Format("{0}",reader["id"]));
}

conn.Close();

La requête fonctionne correctement sur SQL Server, mais je ne comprends pas pourquoi seule la requête sélectionnée ne fonctionne pas.

Toutes les autres requêtes fonctionnent.

11
user3226440

Méthode SqlCommand.ExecuteNonQuery

Vous pouvez utiliser ExecuteNonQuery pour effectuer des opérations de catalogue (par exemple, interroger la structure d'une base de données ou créer des objets de base de données tels que des tables) ou pour modifier les données d'une base de données sans utiliser de DataSet en exécutant les instructions UPDATE, INSERT ou DELETE. Bien que ExecuteNonQuery ne renvoie aucune ligne, tous les paramètres de sortie ou les valeurs renvoyées mappés aux paramètres sont renseignés avec des données. Pour les instructions UPDATE, INSERT et DELETE, la valeur renvoyée correspond au nombre de lignes affectées par la commande. Lorsqu'un déclencheur existe sur une table en cours d'insertion ou de mise à jour, la valeur renvoyée 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 déclencheurs. Pour tous les autres types d'instructions, la valeur de retour est -1. Si une annulation se produit, la valeur de retour est également -1.

SqlCommand.ExecuteScalar, méthode Exécute une instruction Transact-SQL sur la connexion et renvoie le nombre de lignes affectées.

Donc pour obtenir non. des instructions retourné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

Donc 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(String.Format("{0}",reader["id"]));
   }
}

conn.Close();
34
Dhwani

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 voulez renvoyer un ligne unique de la requête, utilisez ExecuteScalar() au lieu de ExecuteNonQuery():

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

Cependant, si vous vous attendez à ce que plusieurs lignes soit retourné, ExecuteReader() est la seule option possible:

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

      ...
    }
  }
8
Dmitry Bychenko

vous pouvez utiliser ExecuteScalar() à la place de ExecuteNonQuery() pour obtenir un seul résultat, utilisez-le comme ceci

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

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

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

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

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

4
Vikas Rana

vous devez ajouter un paramètre aussi @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(String.Format("{0}",reader["id"]));

      }
      conn.Close();
3

Vous devez utiliser ExecuteScalar() (qui renvoie la première colonne de la première ligne) au lieu de ExecuteNonQuery() (qui renvoie le nombre de lignes affectées).

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

J'espère que ça aide!

3
Mayank Modi

C'est par conception.

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 renvoyée correspond au nombre de lignes affectées par la commande. Lorsqu'un déclencheur existe sur une table en cours d'insertion ou de mise à jour, la valeur renvoyée inclut le nombre de lignes affectées à la fois par l'opération d'insertion ou de mise à jour et le nombre de lignes affectées par le ou les déclencheurs. Pour tous les autres types d'instructions, la valeur de retour est -1. Si une annulation se produit, la valeur de retour est également -1.

3
aliensurfer