2011-10-19 129 views
0

当我尝试这样做时出现SQL错误:','附近的语法不正确。错误

 public static int GetOrderId(decimal totalprice, int userid) 
    { 
     string s = "SELECT * from orders where OrderUserId = " + userid + " and OrderTotalPrice = " + totalprice; 
     cmd = new SqlCommand(s, con); 
     int temporderid = Convert.ToInt32(cmd.ExecuteScalar()); 

     return temporderid; 
    } 

到目前为止,我可以看到它,因为它返回OrderTotalPrice,格式不兼容。但我无法弄清楚如何以兼容的格式获得它。

+3

您应该使用参数化查询(但至少在这种情况下这两个值都至少保证数字) –

+1

什么SQL命令看起来像它得到的论据串联后?基本上你的命令执行前's'的值。您通常也不能使用带有SELECT *查询的ExecuteScalar。 ExecuteScalar需要返回一个值,而不是一行数据。 –

+0

所以改变为读者可以做的伎俩或? –

回答

3

它可能使用逗号格式化totalprice,如3,14,其中SQL Server需要一个点,如3.14。要解决这个问题

的一种方法是指定InvariantCulture的,它使用一个点:

var s = string.Format(
    CultureInfo.InvariantCulture, 
    "SELECT * from orders where OrderUserId = {0} and OrderTotalPrice = {0:0.0}", 
    42, 3.1415); 

这将对价格为3.1任何机器上。

顺便说一句,这是好得多传递变量参数:

var com = new SqlCommand(); 
com.CommandType = CommandType.Text; 
com.CommandText = "SELECT * from orders where OrderUserId = @userid " + 
    "and OrderTotalPrice = @totalprice"; 
com.Parameters.AddWithValue("@userid", 42); 
com.Parameters.AddWithValue("@totalprice", 3.1415); 
var temporderid = com.ExecuteScalar(); 

那么你不必担心格式,因为您发送数据库双,不是双格式化为一个字符串。

0

我想这是因为当您连接查询时,总价格转换为类似12,35的东西。

因此,我建议你使用参数化查询。例如。像这样:

var s = "SELECT * from orders " + 
    " where OrderUserId = @userid and OrderTotalPrice = @totalprice"; 
var cmd = new SqlCommand(s, con); 
cmd.Parameters.AddWithValue("userid", userid); 
cmd.Parameters.AddWithValue("totalprice", totalprice); 

int temporderid = Convert.ToInt32(cmd.ExecuteScalar()); 
相关问题