2013-02-10 99 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)";