2017-10-05 4 views
0

J'essaie de traiter une instruction UPDATE via mon code C#. J'utilise ce qui suit ...SqlCommand.ExecuteNonQuery() retourne toujours 0

using (SqlCommand cmd = new SqlCommand(query, sqlConn)) 
{ 
    cmd.Parameters.AddWithValue("@CUSTOMER", intCustomer); 
    cmd.Parameters.AddWithValue("@CONDITION", strCondition); 
    cmd.Parameters.AddWithValue("@BOOK", strBook); 
    cmd.Parameters.AddWithValue("@PAGE", strPage); 
    cmd.Parameters.AddWithValue("@ENDPAGE", strEndPage); 

    System.Diagnostics.Debug.WriteLine("Expanded query: " + 
     query.ExpandSqlQuery(cmd.Parameters)); 

    int affectedRows = cmd.ExecuteNonQuery(); 
    System.Diagnostics.Debug.WriteLine("Number of rows affected: " + affectedRows); 
} 

J'ai essayé de le faire avec et sans params juste pour le débogage et toujours obtenir une valeur de retour de 0 pour une raison quelconque.

J'ai fait une petite méthode d'extension qui élargit les params pour me montrer la requête réelle (sans variables) ...

public static string ExpandSqlQuery(this String input, SqlParameterCollection sqlParams) 
{ 
    string results = input; 

    foreach (SqlParameter p in sqlParams) 
     results = results.Replace(p.ParameterName, p.Value.ToString()); 

    return results; 
} 

... que j'appelle juste avant d'exécuter la requête pour voir ce qui être couru.

System.Diagnostics.Debug.WriteLine("Expanded query: " + 
    query.ExpandSqlQuery(cmd.Parameters)); 

Je prends alors la même requête qui a donné 0 lignes affectées dans C# et exécuter manuellement dans Microsoft SQL Server Management Studio de l'avoir me dire 1 ligne a été affectée!

La requête avec params est ...

UPDATE 
    BookList 
SET 
    Overdue=2 
WHERE 
    [email protected] 
    and Condition='@CONDITION' 
    and Book='@BOOK' 
    and Page='@PAGE' 
    and EndPage='@ENDPAGE' 
    and Overdue=1; 

UPDATE 
    BookInfo 
SET 
    Finished=0 
WHERE 
    [email protected] 
    and Condition='@CONDITION' 
    and Book='@BOOK'; 

La requête est étendue ...

UPDATE 
    BookList 
SET 
    Overdue=2 
WHERE 
    Customer=85 
    and Condition='old' 
    and Book='00103' 
    and Page='00304' 
    and EndPage='00304' 
    and Overdue=1; 

UPDATE 
    BookInfo 
SET 
    Finished=0 
WHERE 
    Customer=85 
    and Condition='old' 
    and Book='00103'; 

Toute idée comment je peux aller sur le débogage ce problème?

+3

peut vous envoyer votre requête de mise à jour – Niladri

+0

Vérifiez vos chaînes de connexion, assurez-vous que vous êtes connecté à la même base de données SQL? Je suggère seulement ceci parce que je l'ai fait avant ... –

+0

Êtes-vous capable d'exécuter SQL Server Profiler sur le serveur pour vérifier que la requête que vous voyez à partir de votre code C# est la même chose qui est en cours d'exécution sur le serveur ? –

Répondre

2

Vous ne devez pas mettre de guillemets autour de vos paramètres. Ainsi:

UPDATE 
    BookList 
SET 
    Overdue=2 
WHERE 
    [email protected] 
    and Condition='@CONDITION' 
    and Book='@BOOK' 
    and Page='@PAGE' 
    and EndPage='@ENDPAGE' 
    and Overdue=1; 

UPDATE 
    BookInfo 
SET 
    Finished=0 
WHERE 
    [email protected] 
    and Condition='@CONDITION' 
    and Book='@BOOK'; 

devrait plutôt être:

UPDATE 
    BookList 
SET 
    Overdue=2 
WHERE 
    [email protected] 
    and [email protected] 
    and [email protected] 
    and [email protected] 
    and [email protected] 
    and Overdue=1; 

UPDATE 
    BookInfo 
SET 
    Finished=0 
WHERE 
    [email protected] 
    and [email protected] 
    and [email protected]; 
+3

c'est pourquoi nous avons besoin de la requête – Niladri

+1

@Niladri touche. ;) mjwills C'est parfait et exactement ce qui causait les problèmes! Merci! –