2017-05-30 1 views
-1

J'ai essayé de renvoyer une ligne en exécutant suivant requête SQL dans C#:C# SQL Ajouter un paramètre

SqlCommand cmd = new SqlCommand(); 
string selectquery = "SELECT TOP (1) [ZVNr] ZVNR_TABLE WHERE [ZVNr] = @zvnr order by [ZVNr] DESC"; 
cmd.Parameters.AddWithValue("@zvnr", "20170530-01"); 
cmd.CommandText = selectquery; 
cmd.CommandType = CommandType.Text; 
cmd.Connection = sqlConnection; 

try 
{ 
    sqlConnection.Open(); 
    int recordsAffected = cmd.ExecuteNonQuery(); 
    if(recordsAffected != -1) 
    { 
     return 0; 
    } 
    else 
    {     
     return 1; 
    } 

Et le "ZVNR_TABLE" ressemble à ceci:

ZVNR | varchar (50) 

20170530-01 

Le résultat est toujours - > recordsAffected = -1

Bien que j'exécute la même requête SQL dans Microsoft SQL Server Management Studio, cela fonctionne.

+1

Vous utilisez une déclaration 'select' dans votre code et utiliser' cmd. ExecuteNonQuery' qui est pour 'INSERT' et ainsi de suite. – jAC

Répondre

0

Vous utilisez une instruction SELECT dans votre code avec cmd.ExecuteNonQuery qui est utilisé pour les instructions INSERT ou UPDATE.
Vous devez utiliser un SQLDataReader (plus d'une ligne et colonne (!)) Ou scalaire (1 ligne/1col = un "élément").

MSDN Example pour SQLDataReader:

//SELECT col1, col2, ..., coln FROM tbl; 
SqlDataReader reader = command.ExecuteReader(); 

if (reader.HasRows) 
{ 
    while (reader.Read()) 
    { 
      Console.WriteLine("{0}\t{1}", reader.GetInt32(0), 
       reader.GetString(1)); 
    } 
} 
else 
{ 
    Console.WriteLine("No rows found."); 
} 
reader.Close(); 

MSDN Example pour ExecuteScalar:

//SELECT COUNT(*) FROM region; or any other single value SELECT statement 
int count = (int)cmd.ExecuteScalar(); //cast the type as needed 

Si vous voulez que le nombre touché après avoir modifié des éléments dans votre base de données, vous pouvez l'obtenir en utilisant cmd.ExecuteNonQuery, lequel renvoie count:

MSDN Example pour ExecuteNonQuery:

//INSERT INTO tbl (...) VALUES (...) or any other non-query statement 
int rowsAffected = (Int32)cmd.ExecuteNonQuery(); 

Pour les instructions UPDATE, INSERT et DELETE, la valeur de retour est le nombre de lignes affectées par la commande.

+1

Exécuter scalaire renvoie la colonne demandée et non les lignes affectées. int affectedCount = (Int32) cmd.ExecuteScalar(); ZVNr de l'exemple est une chaîne de sorte que votre requête sera définitivement une erreur. – TheProvost

0

ExecuteNonQuery() est utilisé pour les instructions INSERT ou UPDATE et renvoie le nombre de lignes affectées. Si vous voulez retourner un seul champ d'une ligne, vous devez utiliser ExecuteScalar()

using (SqlConnection connection = new SqlConnection(connectionstring)) 
{ 
    string query = "SELECT TOP (1) [ZVNr] ZVNR_TABLE WHERE [ZVNr] = @zvnr order by [ZVNr] DESC"; 
    using (SqlCommand cmd = new SqlCommand(query, connection)) 
    { 
     cmd.Parameters.AddWithValue("@zvnr", "20170530-01"); 
     connection.Open(); 
     object result = cmd.ExecuteScalar();    
    } 
} 
1

Parce que vous sélectionnez les données du datatable pas d'insérer ou de mettre à jour les dossiers qui est pourquoi recordsAffected est toujours -1

0

Les réponses données ci-dessus sont ok, mais si vous voulez juste pour voir si elle existe, vous pouvez faire un compte au lieu

using (SqlConnection connection = new SqlConnection(connectionstring)) 
{ 
    string query = "SELECT Count([ZVNr]) ZVNR_TABLE WHERE [ZVNr] = @zvnr order by [ZVNr] DESC"; 
    using (SqlCommand cmd = new SqlCommand(query, connection)) 
    { 
     cmd.Parameters.AddWithValue("@zvnr", "20170530-01"); 
     try 
     { 
      connection.Open(); 
      int result = (int)cmd.ExecuteScalar(); 
     } 
    } 
} 
+1

pas besoin de compter ici, une vérification 'null' fonctionne aussi – fubo

+0

Un nombre assure que vous retournerez toujours un int. Enregistre la validation supplémentaire de vérification si son null. Cela aurait aussi un sens plus logique puisque vous vérifiez si elle existe, vous vérifiez l'occurrence. – TheProvost