Отсутствует строка данных 1с

Обновлено: 02.07.2024

Пишу код и нужно извлечь значение поля из mssql, но выдаёт ошибку: System.IndexOutOfRangeException: "В позиции 0 строка отсутствует."
По тому же принципу код на другой форме работает(второй скрин)
Подскажите, пожалуйста, в чём проблема. Заранее спасибо

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

В позиции 1 строка отсутствует
Здравтвуйте у меня есть табличка DGV которую я заполняю данными из DT и есть одно полу куда.

Ошибка "В позиции -1 строка отсутствует."
При выборе из выпадающего списка любого значения получаю ошибку: System.IndexOutOfRangeException.

В позиции "№" строка отсутствует
Добавил в свое приложение локальную БД. Загрузил таблицу в источник данных. При попытке.

Определить содержится ли в строке А строка Б, если да, то вывести номер позиции
Даны строки a и b. Определить содержится ли в строке А строка Б, если да, то вывести номер позиции.

Ann562002, берите отладчик в руки и смотрите почему "В позиции 0 строка отсутствует." Умение пользоваться им есть решение 99% проблем. берите отладчик в руки и смотрите почему "В позиции 0 строка отсутствует." запрос возвращает только строку с кодом и sda.Fill(dt);возвращает 0, но не могу понять, почему
1-2 фотки - не работает
3-4 - работает(другая форма) Берите профилировщик базы данных и смотрите какой запрос прилетает на исполнения в базу. Умение пользоваться им есть решение 99% проблем с базой. any в обоих случаях(вообще зависит от учётной записи, в которую зашли). Изменение в БД вносит, но ошибка сохраняется. По тому же принципу код на другой форме работает(второй скрин)

И что? Принцип один, а запрос и результаты разные.

Нет результатов - нет и строки. Помоему очевидно.

и как доказательство:

Прям на скрине написано 'any' и 'an'. А вроде бы выше сказано что должно быть 'any' и 'any' Прям на скрине написано 'any' и 'an'. А вроде бы выше сказано что должно быть 'any' и 'any' потому что пароль меняется, но после появляется такая ошибка Докажите. Ваши скрины не информативны. Побольше locals данных как минимум. Ну и коллекцию

Зачем использовать адаптеры там, где они и нафиг не нужны ?
Все делается просто до безобразия:
1. ридером извлекается запись по логину и паролю.
2. Если есть, то простым command.executenonquery вносится изменение пароля.

Все запросы, естественно, параметрические

Никаких адаптеров, тэйблов и трехуровневых юзингов.
Весь код - десяток строк, не более.

На скринах закладка "Видимые". В нормальной английской версии это называется "Locals" (вроде бы).
Но не суть.

Вы говорите - "данные есть в результате". Я хочу увидеть их. dt.Rows покажите.

И очень неинформативные скрины. На одном скрине есть запрос и мы видим и данные для поиска и то что Fill вернул 1.
А там где 0 не видно ни запроса, ничего. Поэтому я и говорю что данных не хватает и нет уверенности в том что у вас нормальный запрос и результаты.

Ну и про простой запрос тоже сказали. Это просто проверка доступа, делать адаптеры просто бессмыслено. Вы туда пишете изменения?

1. ридером извлекается запись по логину и паролю.
2. Если есть, то простым command.executenonquery вносится изменение пароля. Ошибка, по сути, та же самая, только данные есть и тот же запрос выполняется в БД, да и if на наличие данных возвращает true Ошибка, по сути, та же самая, только данные есть и тот же запрос выполняется в БД, да и if на наличие данных возвращает true

Вот опять. Что вы тут "втираете"? На скрине написано - логин и пароль "an". И тут же в других скринах в БД ДРУГИЕ логины.
И где скрин тестового вида запроса который вы отправляете? Вы вот сами его возьмите и выполните в БД. Не ТО что вы хотите вызвать, а то что Фактически код выполняет. Command (cmd) объект смотрите, там вроде бы текстовый вид должен быть виден. Но блин, если красным написано textbox2="an" то что вы про "any" доказываете

Добавлено через 40 секунд

Данных НЕТ. Об этом и ошибка. То что у вас в БД данные есть - ничего не значит. В ридере данных НЕТ.

Функция этой формы в смене пароля. Раньше я говорила, что пароль меняет, но выдаёт ошибку уже после изменения пароля.

Если бы это было так, то if (reader.HasRows) возвращало бы false

если красным написано textbox2="an" то что вы про "any" доказываете

Сейчас стало понятнее что вообще происходит.

NULL – отсутствующие значения.
Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено.

NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа.

NULL значения появляются в запросе в следующих ситуациях:
а) Внешнее соединение, при котором не было найдено соответствующей записи в другой таблице (при левом – во второй, при правом – в первой, при полном – в обоих)
б) Обращение к реквизитам элементов для группы и наоборот.
в) NULL в списке полей выборки (ВЫБРАТЬ)
г) Обращение к реквизитам для битой ссылки

ЕСТЬ NULL используется в операторе ВЫБРАТЬ (как бы проверя, что значение это есть пустое ( Значение ЕСТЬ NULL )):
Код 1C v 8.х
еще пример:
Код 1C v 8.х

Функция ЕСТЬNULL (значение, РезультатЕслиNULL) возвращает значение своего первого параметра, в случае если он не равен NULL, и значение второго параметра в противном случае
Является свернутым ВЫБОР…КОНЕЦ, но ЕСТЬNULL предпочтительнее.
Код 1C v 8.х
еще пример:
Код 1C v 8.х
В данном примере получаются все элементы справочника номенклатуры, после чего, для каждой номенклатуры из регистра накопления получаются текущие остатки. Т.к. для номенклатуры, по которой отсутствуют остатки, виртуальная таблица остатков не запись вернет, то в результате соединения в поле "УчетНоменклатурыОстатки.КоличествоОстаток" будут значения NULL для номенклатуры, по которой не было остатков. Для того чтобы вместо значения NULL в результате запроса присутствовало значение 0, мы использовали функцию ЕСТЬNULL(), которая осуществит желаемую замену.

ЕСТЬNULL отличается от ВЫБОР по следующим причинам:
а) При ЕСТЬNULL лучше читается запрос (проще)
б) При ЕСТЬNULL, если проверяется сложное выражение, то работает быстрее, поскольку вычисляется один раз
в) При ЕСТЬNULL выражение замены приводится к типу проверяемого выражения, если оно имеет тип Строка (длина) или Число (разрядность).

Нельзя проверять значения на NULL обычным равенством, потому что в SQL действует трехзначная логика – Истина, Ложь, NULL, и результатом такого сравнения будет UNKNOWN, что в 1С 8.0 аналогично ЛОЖЬ.
NULL <> 0, поэтому при левых внешних соединениях спр. Номенклатура с таблицами остатков, цен, Контрагентов со взаиморасчетами при отсутствии таких записей там будет NULL, который не равен 0. Лучшее решение – ЕСТЬNULL

Читайте также: