SQL: Приведение типов.

maximovega

Есть две таблички с одинаковыми характеристиками (каждая - всего лишь из двух столбцов: названий параметра и соответствующих численных значений). К ним делается запрос, использующий оператор CAST, и при работе с первой таблицей всё в порядке. При работе со второй выдаёт ошибку "Object cannot be cast from DBNull to other types" (NULL есть в обоих таблицах! а по нажатии OK ещё одну: "There is already an open Datareader associated, which must be closed first." (запрос идёт из C#). Не хватает защиты "от дурака"? И какой?

Dasar

> При работе со второй выдаёт ошибку "Object cannot be cast from DBNull to other types" (NULL есть в обоих таблицах!
это ошибка уже в шарпе возникает. необходимо явно заменять DBNull на null
> а по нажатии OK ещё одну: "There is already an open Datareader associated, which must be closed first." (запрос идёт из C#). Не хватает защиты "от дурака"? И какой?
все ресурсы необходимо оборачивать в using.
ps
вообще используется очень плохой подход для работы с базой.
с базой необходимо работать через linq (а не вручную генерить текстовые запросы) - тогда не будет всех этих проблем

maximovega

Проект не мой. Я лишь должна его использовать. Как уж написали... :(
А можно избавиться от ошибки? В одном случае ведь работает нормально... Неужели всё так сложно, и придется запрос, написанный на сервере, переносить в C#?
А что делать с этим самым using? :o

Dasar

> А можно избавиться от ошибки? В одном случае ведь работает нормально... Неужели всё так сложно, и придется запрос, написанный на сервере, переносить в C#?
можно. ничего никуда переносить не надо.
> А что делать с этим самым using? :o
код покажи

zorin29

оператор CAST не превращает NULL в что-то другое. Поэтому в твоем C# коде надо тоже проверять значение соответствующих полей на совпадение с System.DBNull.
Что же касается второй ошибки, то оберни использование DataReader-а в оператор using вот так:

using(SqlDataReader reader = sqlCommand.ExecuteReader
{
while(reader.Read
// bla-bla-bla
}

val63

Надо писать что-то типа
using (IDataReader reader = cmd.ExecuteReader
{
//логика чтения reader'а
}

Это гарантирует, что ридер закроется после выполнения логики его чтения.
Чтобы проверить значение на null, надо писать что-то типа того:
string myValue = null;
int index = 0; //номер колонки в выдаче запроса
if (!reader.IsDBNull(index
myValue = reader.GetString(index);
Оставить комментарий
Имя или ник:
Комментарий: