SqlDataReader向我显示InvalidCastException(C#Windows窗体)

时间:2011-09-18 22:47:18

标签: c# sqldatareader .net

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#和任何编程语言的新手,请指导我!

3 个答案:

答案 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等等