【问题标题】:Trying to use ExecuteScalar , and get " Specified cast is not valid " error尝试使用 ExecuteScalar 并得到“Specified cast is not valid”错误
【发布时间】:2013-03-12 17:33:17
【问题描述】:

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

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,我不知道为什么。有人可以帮我吗?

【问题讨论】:

  • 在这种情况下不要使用 ExecuteScalar() - 如果您有多个同名产品会发生什么...
  • 是的,我知道,但每个产品都有另一个名称(完全不同)

标签: c# sql winforms


【解决方案1】:

首先,您应该使用参数化 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 枚举以了解两者之间的映射关系。

【讨论】:

  • 我不敢相信,字段 ProdcutPrice 是 Nvarchar ,将其更改为 int ,一切正常,谢谢
  • @user2120874:但也请考虑其余的答案 - 否则您将面临 SQL 注入攻击和各种问题。
  • 好吧,我会把它用于我的其他项目,但这是一个学校项目,所以他们不会尝试 SQLI 我。感谢您的帮助
  • @user2120874 - “这是一个学校项目,所以他们不会尝试 SQLI 我” 你会感到惊讶。我会。 :)
  • @user2120874:如果您向老师展示您防止黑客接管项目中的数据库,您可能会获得更好的分数。如果我是一名教师,我会因为你的代码中包含 SQLi 而记下你的分数,因为当你毕业时,无论你最终为谁工作,SQLi 都会带来巨大的商业风险。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2022-09-27
  • 2023-02-15
相关资源
最近更新 更多