2016-07-05 4 views
0

Juste une simple question rapide, j'utilise Microsoft SQL Server 2014 Express et maintenant j'ai deux fonctions pour créer un enregistrement et mettre à jour un enregistrement contenant une valeur numérique. Pour une raison inconnue, je peux créer l'enregistrement en utilisant une valeur numérique avec un nombre supérieur à 0 après le point décimal (comme 50.50), cependant, en essayant de mettre à jour cet enregistrement avec la valeur numérique, il dit juste que ma syntaxe est faux après le point décimal. Donc tl, dr (50,00 fonctionne, 50,50 ou quelque chose comme ça, ne fait pas).SQL Server Numeric, peut créer mais pas mettre à jour en utilisant C#

Ma question est maintenant: qu'est-ce que je fais mal?

Voici mes deux fonctions:

public static void UpdateProduct(int id, string name, decimal price) 
{ 
    try 
    { 
     string query = "UPDATE dbo.Products SET Name = '" + name + "' , Price = " + price + " WHERE ProductID = " + id; 

     SqlCommand command = new SqlCommand(query, connection); 
     command.ExecuteNonQuery(); 
    } 
    catch (SqlException e) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 

public static void AddProduct(string name, decimal price) 
{ 
    string query = "INSERT INTO dbo.Products (Name, Price) VALUES (@name, @price)"; 

    SqlCommand command = new SqlCommand(query, connection); 
    command.Parameters.AddWithValue("@name", name); 
    command.Parameters.AddWithValue("@price", price); 

    command.ExecuteNonQuery(); 
} 

Et voici mon SQL créer pour cette valeur

create Table Products 
(
    ProductID INT IDENTITY(1,1) PRIMARY key, 
    Name VARCHAR(255) NOT NULL, 
    Price NUMERIC(5,2) NOT NULL, 
    Active BIT DEFAULT 1 
); 
+5

Les paramètres SQL fonctionnent également pour les requêtes UPDATE (mais utilisent Add plutôt que AddWithValue). – Plutonix

+5

Vous pouvez lire [Pouvons-nous arrêter d'utiliser AddWithValue() déjà?] (Http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ – juharr

+3

C'est simple. Lorsque la décimale est concaténée à une chaîne comme vous le faites dans la commande UPDATE, elle est convertie en chaîne à l'aide de la méthode ToString. Dans votre environnement local, la méthode ToString produit une séquence de caractères où le point décimal est représenté par une virgule. Et cela fait des ravages avec votre texte sql. La solution est simple. Utilisez les paramètres comme dans – Steve

Répondre

1

Dans votre requête d'insertion vous utilisez des paramètres de la requête, qui, entre autres, prendre soin du formatage correct de votre valeur décimale.

Dans votre requête de mise à jour, vous utilisez la concaténation de chaîne pour ajouter des décimales à la requête. Très certainement, votre culture actuelle formate le point décimal non pas en point mais en virgule, ce qui entraîne une requête syntaxiquement incorrecte.

donc votre mission de

string query = "UPDATE dbo.Products SET Name = '" + name + "' , Price = " + price + " WHERE ProductID = " + id; 

entraînera une chaîne comme

UPDATE dbo.Products SET Name = 'somename' , Price = 50,5 WHERE ProductID = 3 

Au lieu de

UPDATE dbo.Products SET Name = 'somename' , Price = 50.5 WHERE ProductID = 3 

Utilisez paramétrées des requêtes comme dans l'insert et ce problème - et beaucoup d'autres potentiels que vous n'avez même pas encore remarqué - seront partis.

+0

L'utilisation de la mise à jour avec les paramètres a parfaitement fonctionné pour moi maintenant, merci pour votre aide. – Patrick