DataReaders только для пересылки.Вы не можете «повторно использовать» это.
Все, что вы делаете, это выделяете массив в зависимости от количества записей.Либо сначала выполните запрос COUNT, чтобы получить количество записей, либо перераспределите свой массив на лету в одном цикле.
OleDbCommand dbcom = new OleDbCommand("SELECT COUNT(*) as RowCount FROM [Sheet1$]", oconn);
dbreader = dbcom.ExecuteReader();
dbreader.Read();
rowcount = dbreader.GetOrdinal("RowCount");
dbcom.Close();
dbcom = new OleDbCommand("SELECT * FROM [Sheet1$]", oconn);
dbreader = dbcom.ExecuteReader();
... продолжите свой второй цикл
Есть еще что сказать о правильном освобождении ресурсов.Рекомендуется добавить параметр CommandBehavior.CloseConnection
в ExecuteReader, создать средство чтения данных внутри конструкции using()
и в конце ввести cmd.Dispose()
, чтобы обеспечить правильное высвобождение ресурсов подключения SQL.
.. хотя на самом деле, посколькуэто локальный файл, который вы используете, он может не иметь большого значения, но в целом вы должны это сделать.В противном случае очень легко обнаружить, что потерянный DataReader не освободил свое соединение.