2013-02-10 84 views
0

我使用這個字符串來更新數據庫,並在這種情況下,它工作正常。它更新Znesek_nakupa在最後一排:C#更新數據庫

string sqlUpd = "UPDATE Racun SET Znesek_nakupa='10' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)"; 

但是,當我試圖插入變量,而不是僅有10它給我的錯誤:

Error converting data type varchar to numeric.

代碼示例:

double totalPrice = 1.1; 
string sqlUpd = "UPDATE Racun SET Znesek_nakupa='totalPrice' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)"; 

我怎樣才能做到這一點?

回答

3

此問題少用SQL做的,更多的是與使用字符串和變量在C#。

爲了插入在C#中的字符串變量的值,你不能只把字符串中的變量的名稱。該字符串不「知道」它包含一個變量。這裏有一對夫婦,將工作,而不是方法:

double totalPrice = 1.1; 

// string concatenation 
string sqlUpd = 
    "UPDATE Racun SET Znesek_nakupa='" + 
    totalPrice + 
    "' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)"; 

// with string.Format 
string sqlUpd = string.Format(
    "UPDATE Racun SET Znesek_nakupa='{0}' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)", 
    totalPrice); 

然而,就在一個SQL查詢像這樣的嵌入變量的值的方法沒有考慮最佳實踐因爲它的風險SQL注入攻擊。通常你會想要使用parameterised SQL queries

參數化查詢的版本是這樣的(從上面鏈接到頁面起重爲例):

SqlConnection conn = new SqlConnection(_connectionString); 
conn.Open(); 
string s = "UPDATE Racun SET Znesek_nakupa='@totalPrice' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun"; 
SqlCommand cmd = new SqlCommand(s); 
cmd.Parameters.Add("@totalPrice", totalPrice); 
SqlDataReader reader = cmd.ExecuteReader(); 
+0

我已經嘗試兩個您的建議,不過,同樣的錯誤:在這條線出現/ 錯誤:cmdUpd.ExecuteNonQuery();.所以當我恨不得也執行... – Clem 2013-02-10 11:23:42

+0

好吧,我tryed所有,機器人還是同樣的錯誤! :/ – Clem 2013-02-10 11:36:37

0

好吧,我知道了。 當我嘗試保存在數據庫變量totalPrice談到錯誤,因爲C#已經用逗號作爲分隔符。在數據庫中,我必須發送點。所以我簡單地用點替換逗號,現在它工作得很完美。

所以代碼看起來現在這個樣子:

string sqlUpd = "UPDATE Racun SET Znesek_nakupa='" + Convert.ToString(totalPrice).Replace(',', '.') + "' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)";