【问题标题】:Incorrect syntax near ','. error',' 附近的语法不正确。错误
【发布时间】:2011-10-19 12:08:17
【问题描述】:

当我尝试执行此操作时遇到 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,格式不兼容。但我不知道如何以兼容的格式获取它。

【问题讨论】:

  • 您应该使用参数化查询(尽管至少在这种情况下,这两个值至少是保证数字)
  • SQL 命令与参数连接后是什么样子的?基本上是执行命令之前s 的值。您通常也不能将 ExecuteScalar 与 SELECT * 查询一起使用。 ExecuteScalar 期望返回单个值而不是一行数据。
  • 所以改为阅读器可以解决问题吗?
  • 刚刚改成:string s = "SELECT * from orders where OrderUserId = " + userid + " and OrderTotalPrice = " + totalprice; cmd = new SqlCommand(s, con);阅读器 = cmd.ExecuteReader(); int temporderid = (int)reader.GetSqlInt32(0);返回时间顺序;但仍然得到同样的错误,因为格式化
  • 几点建议 1) 使用存储过程,您可以获得性能和安全性等奖励。 2) 如果您只想返回 1 个值,请执行 SELECT TOP 1 * 而不是 select *。我不确定您的错误是否是因为您选择了多条记录但试图将它们放入一个只能包含 1 个值的 int 变量中。

标签: asp.net sql syntax connection


【解决方案1】:

它可能是用逗号格式化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();

那么您不必担心格式,因为您向数据库发送双精度,而不是格式化为字符串的双精度。

【讨论】:

    【解决方案2】:

    我猜这是因为当您连接查询时,totalprice 会转换为 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多