Почему OdbcCommand.ExecuteScalar () выдает исключение AccessViolationException?

У меня есть блок кода, предназначенный для извлечения текстовых описаний из таблицы базы данных и сохранения их в текстовый файл. Это выглядит так (C# .NET):

        OdbcCommand getItemsCommand = new OdbcCommand("SELECT ID FROM ITEMS", databaseConnection);
        OdbcDataReader getItemsReader = getItemsCommand.ExecuteReader();
        OdbcCommand getDescriptionCommand = new OdbcCommand("SELECT ITEMDESCRIPTION FROM ITEMS WHERE ID = ?", databaseConnection);
        getDescriptionCommand.Prepare();
        while (getItemsReader.Read())
        {
            long id = getItemsReader.GetInt64(0);
            String outputPath = "c:\\text\\" + id + ".txt";
            if (!File.Exists(outputPath))
            {
                getDescriptionCommand.Parameters.Clear();
                getDescriptionCommand.Parameters.AddWithValue("id", id);
                String description = (String)getDescriptionCommand.ExecuteScalar();
                StreamWriter outputWriter = new StreamWriter(outputPath);
                outputWriter.Write(description);
                outputWriter.Close();
            }
        }
        getItemsReader.Close();

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

                String description = (String)getDescriptionCommand.ExecuteScalar();

Текст исключения: «Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена».

Программа обычно генерирует исключение в одних и тех же строках таблицы, но это не выглядит на 100% согласованным. Иногда данные, которые вызывали исключение в прошлом, внезапно срабатывают.

Некоторые люди, несомненно, задаются вопросом, почему я не просто ВЫБРАЛ ИДЕНТИФИКАТОР, ОПИСАНИЕ ИЗДЕЛИЯ ИЗ ПУНКТОВ в getItemsCommand и пропустил второй запрос. Собственно, изначально я так и поступил, и я столкнулся с той же ошибкой с getItemsCommand.GetString (). Я боялся, что, возможно, набор данных занимал слишком много памяти и, возможно, это было причиной ошибки. Поэтому я решил попробовать этот метод, чтобы посмотреть, поможет ли он. Это не так. Кто-нибудь знает, почему это может происходить?

Кстати, ID - это INT, а ITEMDESCRIPTION - это столбец VARCHAR (32000). Если это имеет значение, база данных - это Borland Interbase 6.0 (черт возьми!)

Обновлено: Я указал неправильную строку при описании того, где было выброшено исключение !! АРГХ !! Исправлено сейчас. Кроме того, я пробовал то, что предлагалось до сих пор, но они не помогли. Однако я обнаружил, что эту ошибку вызывали только очень старые записи в базе данных, что странно. Если я изменю запрос на извлечение только записей, вставленных за последние 5 лет, проблем не будет. Кто-то предположил, что это может быть проблема с преобразованием кодировки или что-то в этом роде?

Обновлять: Решил. Проблема оказалась в драйвере ODBC для нашей не очень надежной программы для работы с базами данных. Обходной путь с другими драйверами устранил проблему.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
3 861
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Здесь выстрел в темноте ...

Попробуйте запустить программу чтения, сохраните результат (возможно, в массиве или списке) и убедитесь, что программа чтения закрыта перед выполнением или подготовкой следующей команды. Вы даже можете пойти на крайние меры и поместить свою конструкцию getItemsCommand в блок using, чтобы вы знали, что у него нет открытых ресурсов, прежде чем выполнять следующую команду ...

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

Dave Markle 25.10.2008 22:29
Ответ принят как подходящий

Это может быть ошибка используемого вами драйвера ODBC. Какой это драйвер? Какая у вас строка подключения?

Это драйвер ODBC Easysoft Interbase. Он настроен как системный DSN с именем «BVDATA2». Строка подключения в .NET - это просто «DSN = BVDATA2».

Joshua Carmody 23.10.2008 21:16

Действительно, похоже, что это ошибка драйвера ODBC.

Joshua Carmody 11.12.2008 01:11

Другие вопросы по теме