我试图从桌子上获得销售价格并将其放入文本框中。在我的桌子上,销售价格是一个十进制变量,当然文本框是字符串..当我运行它时,有一个例外是在我的数据访问层中停止它。
以下是一些代码:
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;
}
}
那么有什么东西是我遗失的吗? 感谢您对此有任何有用的见解,如果有任何其他代码可以使用,我可以提供它。谢谢
答案 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#中的字符串,或varchar
在旁注中,您不应将参数值烘焙到查询中以避免Bobby Tables;你需要改用parameterized queries。