9

我正在尝试通过使用产品名称来获取产品价格。以下是我正在使用的功能。

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;
}

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

4

1 回答 1

12

首先,您应该使用参数化 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
        }
    }
}

接下来,我们不知道ProductPrice字段的类型。可能是您收到了long退货,也可能是decimal. 找出最简单的方法就是使用:

object tmp = cmd.ExecuteScalar();

...然后查看调试器。还要查看数据库中字段的类型——这应该能真正告诉你会发生什么。查看SqlDbType两者之间映射的枚举。

于 2013-03-22T18:35:49.457 回答