Erreur de syntaxe SQL dans la string C #

J'exécute une requête à partir d'un formulaire Web pour mettre à jour les loggings. Puisque je suis en train d'apprendre à propos de C #, j'utilise une string de command par opposition à une procédure stockée.

Ma méthode de mise à jour est la suivante:

public void updateOne() { ssortingng commandText = "update INVOICE SET <Redacted> = @<Redacted>, Supplier = @Sup, SupplierName = @SupN, NetTotal = @Net, VATTotal = @VAT, InvoiceDate = @InvDt " <needed a line break here, which is why I split the ssortingng again> + "WHERE K_INVOICE = @K_INV"; using (SqlConnection dbConnection = new SqlConnection (conParams.connectionSsortingng)) { SqlCommand cmd = new SqlCommand(commandText, dbConnection); cmd.Parameters.Add("@K_INV", SqlDbType.Int); cmd.Parameters["@K_INV"].Value = @K_INV; cmd.Parameters.AddWithValue("@<Redacted>", @<Redacted>.ToSsortingng()); cmd.Parameters.AddWithValue("@Sup", @Sup.ToSsortingng()); cmd.Parameters.AddWithValue("@SupN", @SupN.ToSsortingng()); cmd.Parameters.AddWithValue("@Net", @Net.ToSsortingng()); cmd.Parameters.AddWithValue("VAT", @VAT.ToSsortingng()); cmd.Parameters.AddWithValue("@InvDt", @InvDt.ToSsortingng()); try { dbConnection.Open(); cmd.ExecuteNonQuery(); } catch (Exception e) { errorSsortingng = e.Message.ToSsortingng(); } } } 

Catch bloque sur une erreur SQL (Syntaxe incorrecte près de SET), et j'ai une idée que le problème se produit parce que je convertis les parameters en strings. Le premier paramètre est un Int, ce qui devrait être OK.

Si c'est le cas, à quoi dois-je convertir les parameters? Sinon, qu'est-ce qui ne va pas?

Je vous recommand de lire cet article de blog sur les dangers de .AddWithValue() :

  • Pouvons-nous arrêter d'utiliser AddWithValue déjà?

Au lieu de

 cmd.Parameters.AddWithValue("@Sup", @Sup.ToSsortingng()); 

Tu devrais utiliser

 cmd.Parameters.Add("@Sup", SqlDbType.VarChar, 50).Value = ...(provide value here)..; 

( Est-ce que votre variable en C # s'appelle vraiment @SupN ?? Assez inhabituel et déroutant …. )

Je recommand de toujours définir une longueur explicite pour tous les parameters de string que vous définissez

Essayez d'append un @ avant la string pour échapper aux lignes de rupture , par exemple:

 ssortingng commandText = @"update INVOICE SET [Redacted] = @Redacted, Supplier = @Sup, SupplierName = @SupN, NetTotal = @Net, VATTotal = @VAT, InvoiceDate = @InvDt " + "WHERE K_INVOICE = @K_INV"; 

Dans l'argument parameterName vous pouvez append le @ mais la valeur non, juste la variable, pour l'échantillon

 cmd.Parameters.AddWithValue("@Redacted", redacted.ToSsortingng()); 

Essayez d'exécuter cette requête dans la database avec des valeurs pour vérifier si tout est correct. Vous pouvez utiliser [brackets] dans le nom de la table et les noms de colonne si vous avez un mot réservé.