InvalidCastException:无法将类型为“System.Decimal”的对象强制转换为“System.String”类型

时间:2012-06-26 21:55:26

标签: c# asp.net data-binding

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

以下是一些代码:

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

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

2 个答案:

答案 0 :(得分:7)

您选择的价格可能是小数。因此,请勿致电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,并且在抛出异常时不返回值,好像什么也没发生过......你将屏蔽错误没理由。

答案 1 :(得分:3)

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

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

在旁注中,您不应将参数值烘焙到查询中以避免Bobby Tables;你需要改用parameterized queries