2016-07-05 63 views
0

只是一個簡單的快速問題,我使用的是Microsoft SQL Server 2014 Express,現在我有兩個函數來創建記錄並更新包含數值的記錄。SQL Server數字,可以創建,但不能更新使用C#

由於某些未知原因,我可以使用數字值小於0的數字(如50.50)創建記錄,但是,當試圖用數值更新此記錄時,它只是說我的語法小數點後錯誤。所以tl,博士(50.00工作,50.50或類似的東西,不)。

我現在的問題是:我做錯了什麼?

這裏是我的兩個功能:

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(); 
} 

,這裏是我的SQL該值

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

SQL參數也適用於UPDATE查詢(但使用Add而不是AddWithValue)。 – Plutonix

+5

您可能想閱讀[我們可以停止使用AddWithValue()了嗎?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ ) – juharr

+3

很簡單。當像在UPDATE中一樣將小數連接到字符串時,它將使用ToString方法轉換爲字符串。在您的語言環境中,ToString方法會生成一個字符序列,其中小數點由逗號表示。這對你的sql文本造成嚴重破壞。解決方案很簡單。在Add中使用參數 – Steve

回答

1

在你插入查詢使用查詢參數,除其他事情,照顧創建正確格式化你的十進制值。

在您更新查詢中,您使用字符串連接來爲查詢添加小數點。當然,您當前的文化將小數點的格式設置爲不是逗點而是逗號,從而導致語法錯誤的查詢。

,將導致一個字符串您的

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

分配如

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

而不是

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

使用參數化就像在插入和這個問題詢問 - 和許多潛在的其他人甚至沒有注意到 - 將會消失。

+0

使用參數更新現在對我來說非常合適,感謝您的幫助。 – Patrick

相關問題