2

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

这是一些代码:

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

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

4

2 回答 2

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 注入攻击不要像这样将值直接放入 SQL 中。相反,使用参数化SQL 并指定这些参数的值。参见SqlCommand.Parameters示例。

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

于 2012-06-26T21:57:07.263 回答
3

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

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

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

于 2012-06-26T21:58:52.460 回答