尝试使用ExecuteScalar,并获得"指定的强制转换无效"错误

Shm*_*hen 7 c# sql winforms

我试图通过使用产品名称来获得产品价格.以下是我正在使用的功能.

public int GetProductPrice(string ProductName)
{
    cnn.Open();
    SqlCommand cmd = new SqlCommand("SELECT ProductPrice FROM Products WHERE ProductName ='" + ProductName + "'", cnn);
    int price = (int)cmd.ExecuteScalar();
    return price;
}
Run Code Online (Sandbox Code Playgroud)

现在我不断收到这个错误Specified cast is not valid,我不知道为什么.有人能帮我吗 ?

Jon*_*eet 11

首先,您应该使用参数化SQL而不是将参数直接放入SQL中.此外,您应该使用using语句来关闭命令 - 和连接 - 完成后.哦,SqlConnection为每个操作创建一个新的.所以类似于:

public int GetProductPrice(string productName)
{
    // Quite possibly extract the connection creation into a separate method
    // to call here.
    using (var conn = new SqlConnection(...))
    {
        conn.Open();
        using (var command = new SqlCommand(
            "SELECT ProductPrice FROM Products WHERE ProductName = @ProductName",
            conn))
        {
            command.AddParameter("@ProductName", SqlDbType.VarChar)
                   .Value = productName;
            object price = command.ExecuteScalar();
            // And you'd do the casting here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我们不知道该ProductPrice字段的类型.可能是你得到了long回归,或者也许是回归decimal.最简单的方法是使用:

object tmp = cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)

...然后查看调试器.还要看一下数据库中字段的类型 - 这应该真正告诉你期待什么.看看SqlDbType两者之间映射的枚举.

  • @ user2120874:如果您向老师展示防止黑客接管项目中的数据库,您可能会获得更好的分数.如果我是一名教师,我会在你的代码中标记你的SQLI,因为当你毕业时,对于你最终为之工作的人来说,SQLi是一个巨大的商业风险. (2认同)