SqlDataReader показывает мне InvalidCastException (C # Windows Form) - PullRequest
1 голос
/ 19 сентября 2011
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 ]

2 голосов
/ 19 сентября 2011

Предполагая, что Price - это число с плавающей точкой, вы должны использовать GetFloat вместо:

price1 = r.GetFloat(0); // first column
1 голос
/ 19 сентября 2011

вы можете переписать свой код гораздо более безопасным способом, например так:

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 во время выполнения, и затем вы можете при необходимости привести его к этому типу, потому что, если ваше приведение к float было неудачным, я думаю, вы не получилиплавающий корректно из читателя.

SqlDataReader имеет и другие методы для извлечения данных, если вы уверены, что Price - это fload, вы можете использовать метод reader.GetSingle, например, если это int, вы можете использовать reader.GetInt и т. Д.

1 голос
/ 19 сентября 2011

Это означает, что ваш столбец «цена» не является значением с плавающей точкой - если вы разыгрываете так, тип должен быть точно вправо, вы можете попробовать более мягкий способ, преобразовав его в число с плавающей запятой значение:

price1 = Convert.ToSingle(r["Price"]);

Если столбец «цена» содержит другой тип данных (что весьма вероятно), вы должны вместо этого использовать собственный тип и сделать свою переменную этого типа, т. Е. Если это double make price1 a double вместо переменной:

price1 = reader.GetDouble(0);
...