Member 13576953 Ответов: 1

Системы.исключение InvalidOperationException: 'недопустимая попытка чтения при отсутствии данных присутствует.'


Здравствуйте, я получаю сообщение об ошибке при публикации моего кода. Пожалуйста, помогите мне определить, в чем может быть проблема.

Ошибка находится в строке 77: Total = Total + sdr.GetDecimal(3);


использование системы;
использование System.Data;
используя системы.Данных.Поставщики sqlclient;
использование System.Linq;
использование System.Web.UI;

публичная частичная корзина классов : страница
{
охраняемых недействительными в(объект отправителя, EventArgs в электронной)
{
var skus = конвертировать.ToString(Session["DataTable"]).Split(',').Список();

Сессия["ItemsInCart"] = артикулы.Рассчитывать;

var multiSelect = новая команда SqlCommand();

строка cmdString1;

cmdString1 = "выберите производитель, артикул, Наименование, Цена от продуктов, где артикул =" + сессия["CartTable"];

соединение var =
новое соединение SqlConnection(
"Данные Source=Omisbi3.niunt.niu.edu;начальный каталог= 675_z1626585;идентификатор пользователя=OMIS675FA;пароль=Omis.675!");

Класс sqldatareader СДР;

десятичная сумма = 0;

//Создание таблицы

var DT = new DataTable("CartDisplay");

var column1 = новый столбец данных("SKU");

column1.DataType = тип.Метод Gettype (Системы".Типа int32");

var column2 = новый столбец данных("производство");

column2.DataType = тип.GetType("Система.Строка");

var column3 = новый столбец данных("имя");

column3.DataType = тип.GetType("Система.Строка");

var column4 = новый столбец данных("цена");

column4.DataType = тип.GetType("Система.Десятичный");

ДТ.колонны.Добавить(столбец 1);

ДТ.колонны.Добавить(столбец 2);

ДТ.колонны.Добавить(столбец 3);

ДТ.колонны.Добавить(колонка4);

for (var i = 0; i <= skus.Граф - 1; i++)

{
мультиселект.Свойства commandtext = "выбрать артикул, производитель, Название, Цена от продуктов, где артикул = @артикулы";
мультиселект.параметры.Четкий();
мультиселект.параметры.AddWithValue("@сеи", артикулы[я]);

множественный выбор.Соединение = соединение;

множественный выбор.Соединение.Открыть();

sdr = мультиселект.Метода executereader();

в то время как (sdr.Read())
sdr = мультиселект.Метода executereader();
{
Строкой 1 Объекта Datarow ;

Строкой 1 = ДТ.Невров();

Total = Total + sdr.GetDecimal(3);

Строка 1["SKU"] = sdr.GetInt32(0);

Row1["Manufacturer"] = sdr.GetString(1);

Row1["Name"] = sdr.GetString(2);

Row1["Price"] = sdr.GetDecimal(3);

DT.Rows.Add(строка 1);
}

множественный выбор.Соединение.Закрывать();

lblResults.Text = "ваша общая сумма составляет $" + Total;
}

Управления gridview1.Источник данных = ДТ;

Управления gridview1.Привязку();
}
}

Что я уже пробовал:

Я не знаю, что делать. Мне действительно нужна помощь как можно скорее. Спасибо.

1 Ответов

Рейтинг:
9

OriginalGriff

Посмотрите на свой код:

sdr = multiSelect.ExecuteReader();

while (sdr.Read())
sdr = multiSelect.ExecuteReader();
Почему вы вызываете ExecuteReader внутри цикла чтения?

Кроме того, взгляните на Оператор SQL IN[^]:
SELECT * FROM MyTable WHERE MyColumn IN (1, 3, 5, 7, 9)


Member 13576953

Я новичок в программировании. Как должен выглядеть код?

OriginalGriff

Ты ведь шутишь, правда?
Код, который у вас есть, похож на покупку нового автомобиля (вызов ExecuteReader), ожидание его доставки (вызов Read), чтобы вы могли управлять им, и сразу же вы хотите отправиться в любое путешествие (введите тело цикла), вы выбрасываете автомобиль и покупаете новый (вызов ExecuteReader). Затем вы пытаетесь управлять автомобилем, который вы только что купили, прежде чем он был доставлен!

Сядьте, посмотрите на код и подумайте о том, что он делает. Это довольно очевидно, и вы узнаете намного лучше, чем если бы я просто показал вам ваш собственный код с отсутствующей строкой...

Member 13576953

Огромное спасибо. Я все понял. Это была ошибка, которую я вставил дважды (один раз в неправильном месте).

OriginalGriff

Всегда пожалуйста!