【问题标题】:InvalidCastException: Unable to cast object of type 'System.Decimal' to type 'System.String'InvalidCastException:无法将“System.Decimal”类型的对象转换为“System.String”类型
【发布时间】:2012-06-26 21:55:25
【问题描述】:

我正在尝试从表格中获取销售价格并将其放入文本框中。在我的桌子上,销售价格是一个十进制变量,当然文本框是字符串。当我运行它时,有一个异常在我的数据访问层中停止它。

这里有一些代码:

textSellPrice.Text = DAL.Util.getSellPrice(listItemsPricing.SelectedValue.ToString());


public static String getSellPrice(string item)
{
    string sql = "SELECT Price FROM Item it INNER JOIN Customers cu 
        ON it.SalesRep = Cu.SalesRep WHERE CustomerID='" 
        + HttpContext.Current.Session["SelectedCustomer"] +
        "' AND ProductID='" + item + "'";
    string dt = AdoUtil.GetDataColumn(sql);
    return dt;
}



    public static string GetDataColumn(string sqlQuery)
    {
        string result = String.Empty;
        try
        {
            SqlCommand cmd = new SqlCommand(sqlQuery, GetACESConn());

            if (cmd.Connection.State != ConnectionState.Open)
                cmd.Connection.Open();

            SqlDataReader reader = cmd.ExecuteReader();

            if (reader.HasRows)
                while (reader.Read())
                {
                    result = reader.GetString(0);
                }


            if (cmd.Connection.State != ConnectionState.Closed)
                cmd.Connection.Close();

            return result;
        }
        catch (Exception ex)
        {

            return result;
        }
    }

那么有什么完全明显的我遗漏的东西吗?
感谢您对此提供任何有用的见解,如果可以使用任何其他代码,我可以提供。谢谢

【问题讨论】:

标签: c# asp.net data-binding


【解决方案1】:

您正在选择一个价格,大概是小数。所以不要调用reader.GetString(0) - 调用reader.GetDecimal(0) 并将结果存储在decimal 变量中。如果您真的想将所有内容都转换为字符串,只需调用GetValue(0).ToString()

当你在那里时,解决这个问题:

string sql = "SELECT Price FROM Item it INNER JOIN Customers cu ON it.SalesRep = Cu.SalesRep WHERE CustomerID='" + HttpContext.Current.Session["SelectedCustomer"] +
    "' AND ProductID='" + item + "'";

这只是乞求SQL Injection Attack不要像这样将值直接放入 SQL 中。相反,使用参数化 SQL 并指定这些参数的值。示例见SqlCommand.Parameters

接下来,不要捕获Exception,并且在抛出异常时不要返回值,就好像什么都没发生一样......你将无缘无故地掩盖错误.

【讨论】:

  • 是的,我知道 sql 注入攻击威胁。当我像昨天一样在一天结束时遇到一个小故障时,我会采取任何措施来尝试解决它,一旦解决了,我就会再次使用参数。感谢您的帮助和关心
【解决方案2】:

CustomerId 在数据库中被声明为数字类型,但您正试图将其读取为字符串。如果您必须将结果作为字符串,您可以:

  • 将其读取为数字类型(例如,decimal)并在 C# 中转换为字符串,或者
  • 在 RDBMS 端更改您的 SQL 以将其转换为 varchar

附带说明,您不应将参数值烘焙到查询中以避免Bobby Tables;您需要改用parameterized queries

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2019-08-19
    • 2012-09-07
    • 1970-01-01
    • 2014-03-14
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多