VB.NET OleDbDataReader

я использую OleDbDataReader для чтения столбца из базы данных Access, и я хочу иметь возможность использовать тот же считыватель для повторного чтения столбца в той же функции, потому что я делаю некоторое сравнение между двумя базами данных и иногда идентичными записями в базы данных не в том же порядке, поэтому мне приходится перебирать базу данных, пока я не найду указанную запись, а затем сравним.

вопросы

есть ли функция для получения текущего индекса строки OleDbDataReader?

и как сбросить OleDbDataReader в первую строку?


person FPGA    schedule 01.08.2012    source источник


Ответы (3)


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

Есть еще несколько способов решить эту проблему:

  1. Если набор данных, которые вы сравниваете, имеет разумный размер и вы сравниваете одно поле, вы можете кэшировать данные из одной базы данных в ключевом объекте, таком как универсальный словарь. Затем, когда вы читаете данные из второй базы данных, вы можете получить детали из словаря на основе ключа и таким образом выполнить сравнение.

  2. Вы можете создавать автономные запросы для каждой записи в одной базе данных, чтобы увидеть, есть ли совпадение во второй базе данных, а не вложенные считыватели.

person competent_tech    schedule 01.08.2012
comment
попробуем и сообщим :) - person FPGA; 01.08.2012
comment
о части разумного размера. Каждая база данных содержит около 36043 записей. Это разумный размер? - person FPGA; 01.08.2012
comment
Я думаю, это зависит от того, сколько информации вам нужно хранить, и от целевого профиля машины, на которой будет работать приложение. Например, если каждая запись составляет 100 байт, то вы говорите примерно о 3 МБ данных, что разумно. Однако, если каждая запись составляет 10 000 байт, это больше, чем 300 МБ, что может быть разумным на выделенной машине с 8 ГБ памяти, но не так много на машине конечного пользователя с 1 ГБ. - person competent_tech; 01.08.2012
comment
хорошо, я пытаюсь внести изменения в базу данных1 на основе изменений, внесенных в базу данных2 с помощью Microsoft Access. изменения включают добавленные строки, удаленные строки и измененные данные для определенной строки, я сделал это с большим количеством циклов, но это очень медленно, поэтому я могу использовать для этого запросы и будет ли это быстрее? основная проблема с циклами в том, что строки не в том же порядке - person FPGA; 01.08.2012
comment
Я бы определенно попытался использовать запросы вместо циклов, если это возможно. В общем, сталкиваясь с проблемой такого рода, я пытаюсь подумать о том, как я могу разработать решение, чтобы уменьшить общий объем кода, выполняемого как в приложении, так и в базе данных. Например, вы можете обнаружить, что так же быстро выполнить сравнение первого уровня в SQL, а не извлекать запись из второй БД в память, а затем сравнивать ее там. - person competent_tech; 01.08.2012

Согласно MSDN, класс OleDbDataReader

Предоставляет способ чтения прямого потока строк данных из источника данных.

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

person Steven Doggart    schedule 01.08.2012
comment
Это то, что я уже сделал, но ищу другое решение, чем datagridview - person FPGA; 01.08.2012

Я решаю аналогичную проблему, и использование DataTable было самым простым способом решения проблемы с прямой операцией чтения данных.

            DataTable table = new DataTable("DataTable");
            for (int colNum = 0; colNum < reader.FieldCount; colNum++)
            {
                DataColumn col = new DataColumn();
                col.ColumnName = reader.GetName(colNum);
                table.Columns.Add(col);
            }//colNum
            while (reader.Read())
            {
                DataRow row = table.NewRow();
                for (int colNum = 0; colNum < reader.FieldCount; colNum++)
                {
                    string columnName = reader.GetName(colNum);
                    row[columnName] = reader.GetValue(colNum);
                }//for
                table.Rows.Add(row);
            }//while
            table.AcceptChanges();

Карлос А Мериг.

person Carlos A Merighe    schedule 06.05.2013
comment
Я думаю, вы могли бы просто заменить весь этот код на table.Load(reader); - person LarsTech; 06.05.2013