SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString);
sqlConn.Open();
SqlCommand sqlComm = new SqlCommand("SELECT Price FROM Pricing WHERE FoodID = 1", sqlConn);
SqlDataReader r = sqlComm.ExecuteReader();
while (r.Read())
{
price1 = (float)r["Price"];
}
r.Close();
sqlConn.Close();
InvalidCastException错误我得到指向“price1 =(float)r [”Price“];”我是c#和任何编程语言的新手,请指导我!
答案 0 :(得分:2)
假设价格是浮点数,您应该使用GetFloat代替:
price1 = r.GetFloat(0); // first column
答案 1 :(得分:1)
这意味着您的“价格”列不是浮动值 - 如果您像这样投射,类型必须完全正确,您可以通过将其转换为更宽松的方式来尝试浮动值:
price1 = Convert.ToSingle(r["Price"]);
如果“price”列包含不同的数据类型(非常可能),则应使用原生类型,并使您的变量类型化,即如果其double
生成price1
改为double
变量:
price1 = reader.GetDouble(0);
答案 2 :(得分:1)
你可以用更安全的方式重写代码,如下所示:
using(var sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
{
sqlConn.Open();
SqlCommand sqlComm = new SqlCommand("SELECT Price FROM Pricing WHERE FoodID = 1", sqlConn);
using(var reader = sqlComm.ExecuteReader())
{
while (reader.Read())
{
var price1 = reader["Price"];
}
}
}
所以你确定无论发生什么事情,读者和连接都将被关闭并为你处理。如果您调试此代码,您将看到在运行时将在price1变量中存储哪种对象,然后您可以在需要时转换为该类型,因为如果您的转换为浮动失败,我认为您没有得到从读者那里正确漂浮。
SqlDataReader还有其他检索数据的方法,如果你确定Price是一个fload,你可以使用reader.GetSingle
方法,如果它是一个int,你可以使用reader.GetInt
等等