Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OleDbDataReader в цикле с изменение условия SQL 
:(
    Опции темы
troika
  Дата 12.4.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



В общем есть один DataGridView, который содержит столбец с кодом исполнителя. Есть таблица, в котрой этот код исполнителя явлется ключевым полем, и в которой хранится ФИО этого самого исполнителя. Нужно чтобы в одном из столбцов DataGridView отображалось ФИО исполнителя в зависимости от кода исполнителя в этой строке. Сделал я это так: (Имя моего DataGridView - mainGrid.)

        private void PodstanovkaFIOIsp()
        {
            int number = mainGrid.RowCount;
            OleDbCommand Fetch_FIO = new OleDbCommand();
            Fetch_FIO.Connection = Connection;
            Fetch_FIO.CommandText = "SELECT FIO From Sotrudniki Where ID_sotrudnika = ?";
            for (int i = 0; i < number; i++)
            {
                Connection.Open();
                Fetch_FIO.Parameters.Add("ID", OleDbType.Integer, 10, "ID_sotrudnika").Value = mainGrid.Rows[i].Cells[Codispolnitel.Index].Value;
                OleDbDataReader reader = Fetch_FIO.ExecuteReader();
                while (reader.Read())
                {
                    mainGrid.Rows[i].Cells[FIOIsp.Index].Value = reader[0].ToString();
                }
                Connection.Close();
            }
        }

В результате дает исключение "COM object that has been separated from its underlying RCW cannot be used." в строке OleDbDataReader reader = Fetch_FIO.ExecuteReader(); Причем выдает его при втором заходе в цикл. При первом заходе в цикл все ОК.
Помогите пожалуйста как сделать правильно.
P.S. Строка соединения Connection уже есть, с этим все нормально
PM MAIL   Вверх
KelTron
Дата 13.4.2009, 05:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



1) в каждой новой итерации ты заново открываешь и закрываешь подключение - вынеси строку Connection.Open(); до цикла, а
Connection.Close(); после цикла
2) в каждой новой итерации ты добавляешь новые параметры к команде, но не очищаешь старые - 

перед строкой:
Fetch_FIO.Parameters.Add("ID", OleDbType.Integer, 10, "ID_sotrudnika").Value = mainGrid.Rows[i].Cells[Codispolnitel.Index].Value;

добавь строку:
Fetch_FIO.Parameters.Clear();

3) Из того, что ты написал, я понял, что ключи - уникальны => проще использовать не ExecuteReader а ExecuteScalar

Получится что то вроде этого:

Код

 private void PodstanovkaFIOIsp()
        {
            int number = mainGrid.RowCount;
            OleDbCommand Fetch_FIO = new OleDbCommand();
            Fetch_FIO.Connection = Connection;
            Fetch_FIO.CommandText = "SELECT FIO From Sotrudniki Where ID_sotrudnika = ?";
            Connection.Open();
            for (int i = 0; i < number; i++)
            {
                Fetch_FIO.Parameters.Clear();
                Fetch_FIO.Parameters.Add("ID", OleDbType.Integer, 10, "ID_sotrudnika").Value = mainGrid.Rows[i].Cells[Codispolnitel.Index].Value;
 
                mainGrid.Rows[i].Cells[FIOIsp.Index].Value = (string)Fetch_FIO.ExecuteScalar();
            }
            Connection.Close();
        }



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
troika
Дата 13.4.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



Цитата(KelTron @ 13.4.2009,  05:26)
1) в каждой новой итерации ты заново открываешь и закрываешь подключение - вынеси строку Connection.Open(); до цикла, а
Connection.Close(); после цикла
2) в каждой новой итерации ты добавляешь новые параметры к команде, но не очищаешь старые - 

перед строкой:
Fetch_FIO.Parameters.Add("ID", OleDbType.Integer, 10, "ID_sotrudnika").Value = mainGrid.Rows[i].Cells[Codispolnitel.Index].Value;

добавь строку:
Fetch_FIO.Parameters.Clear();

3) Из того, что ты написал, я понял, что ключи - уникальны => проще использовать не ExecuteReader а ExecuteScalar

Получится что то вроде этого:

Код

 private void PodstanovkaFIOIsp()
        {
            int number = mainGrid.RowCount;
            OleDbCommand Fetch_FIO = new OleDbCommand();
            Fetch_FIO.Connection = Connection;
            Fetch_FIO.CommandText = "SELECT FIO From Sotrudniki Where ID_sotrudnika = ?";
            Connection.Open();
            for (int i = 0; i < number; i++)
            {
                Fetch_FIO.Parameters.Clear();
                Fetch_FIO.Parameters.Add("ID", OleDbType.Integer, 10, "ID_sotrudnika").Value = mainGrid.Rows[i].Cells[Codispolnitel.Index].Value;
 
                mainGrid.Rows[i].Cells[FIOIsp.Index].Value = (string)Fetch_FIO.ExecuteScalar();
            }
            Connection.Close();
        }

Интересно получается. Выходит во всем виноват .ExecuteReader(); 
Если делать по 1 пункту, то выдает исключение "There is already an open DataReader associated with this Command which must be closed first." Если при этом еще учесть 2 пункт и добавить еще Fetch_FIO.Parameters.Clear()  то это тоже ничего не меняет.

А вот с .ExecuteScalar(); все просто замечательно в любых комбинациях.  Подключение можно открывать и закрывать хоть при каждой итерации, хоть для всего цикла (что более разумно), хоть с Fetch_FIO.Parameters.Clear(), хоть без него все работает отлично.

Спасибо большое за помощь!

P.S. Правда есть еще один вопрос про VS 2005 + Access, но для него я решил что сейчас создам отдельную тему
PM MAIL   Вверх
KelTron
Дата 15.4.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Цитата(troika @  13.4.2009,  10:55 Найти цитируемый пост)
"There is already an open DataReader associated with this Command which must be closed first."


Это я не углядел, всё правильно, датаридер также нужно закрывать после использования тогда всё будет норм.
Код

//...
OleDbDataReader reader = Fetch_FIO.ExecuteReader();
                while (reader.Read())
                {
                    mainGrid.Rows[i].Cells[FIOIsp.Index].Value = reader[0].ToString();
                }
reader.Close();
//...


Цитата(troika @  13.4.2009,  10:55 Найти цитируемый пост)
Спасибо большое за помощь!

Your welcome! ..)



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.