Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Проблема с sqlreader / 5 сообщений из 5, страница 1 из 1
22.01.2013, 17:43
    #38120115
VIT2708
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с sqlreader
Есть например ХР

select
Код: c#
1.
d.id as id

, d.name, t.info From table as d ....

Так вот проблема в том что reader вылетает на чтени столбца id

Код: c#
1.
if (!reader.IsDBNull(reader.GetOrdinal("id"))) { cdr.Id = (string)reader["id"]; }



cdr - это обьект куда считываются данные

Вот сама ошибка Недопустимая попытка чтения при отсутствии данных.

в sql management studio проверял запрос все работает а VS 2010 ругается

Спасибо
...
Рейтинг: 0 / 0
22.01.2013, 18:35
    #38120266
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с sqlreader
VIT2708,

метод Read() ты не забыл вызвать перед этим?

Не помешает также убедится, что SP возвращает только один результат. В этом случае на закладке Messages будет только одна надпись вида (n row(s) affected). Если их несколько, то а) убери "ненужные" с помощью SET NOCOUNT ON/OFF или б) передвинь SqlDataReader на нужный результат с помощью метода NextResult().

P.S. Код у тебя странный.

1) Ты читаешь значение id колонки, которое, по идее, является числом, но сохраняешь его как строку. Если это так, то зачем ты так делаешь?

2) Для чтения данных лучше использовать методы вида GetString(int), GetInt32(int) чтобы не делать приведений типа и явно деклалировать ожидания насчет типа данных колонки. Да, этим методам нужно передавать индекс колонки что удлиняет код, но никто же не мешает сохранить его в переменную до цикла. То есть вместо
Код: c#
1.
2.
3.
4.
5.
6.
7.
while (reader.Read())
{
	if (!reader.IsDBNull(reader.GetOrdinal("id")))
	{
		cdr.Id = reader.GetString(reader.GetOrdinal("id"));
	}
}


написать
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
int colId = reader.GetOrdinal("id");
while (reader.Read())
{
	if (!reader.IsDBNull(colId))
	{
		cdr.Id = reader.GetString(colId);
	}
}



Или можно написать extension метод, который принимает имя колонки и вызывает GetOrdinal() внутри себя.
...
Рейтинг: 0 / 0
22.01.2013, 18:47
    #38120292
VIT2708
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с sqlreader
bazile,

List<Класс> dList = new List<Класс>();

try
{
reader = command.ExecuteReader();
while (reader.Read())
{
Класс cdd = Функция в которой вылетает ошибка(); // внутри этой функции и вылетает ошибка которую я привел ранее, в sql management studio такой запрос возвращает 2 записи
dList.Add(cdd);
}
}
catch { return null; }
finally { CloseReader(); }
...
Рейтинг: 0 / 0
22.01.2013, 20:39
    #38120417
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с sqlreader
VIT2708, Read() ты вызываешь, а что насчет второго совета?

bazileНе помешает также убедится, что SP возвращает только один результат. В этом случае на закладке Messages будет только одна надпись вида (n row(s) affected).
...
Рейтинг: 0 / 0
23.01.2013, 10:55
    #38120895
VIT2708
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с sqlreader
bazileVIT2708, Read() ты вызываешь, а что насчет второго совета?

bazileНе помешает также убедится, что SP возвращает только один результат. В этом случае на закладке Messages будет только одна надпись вида (n row(s) affected).

я создал 2 тестовые строки в базе. И таких ридеров у меня много но только этот не работает. Хотя Messages пуст, странно.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Проблема с sqlreader / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]