Метод заполнения OleDataAdapter, возвращающий пустые строки в таблицу данных
Вот мой код:
public static DataTable GetDataFromSpreadsheet(OleDbConnection conn)
{
DataTable dt = new DataTable();
OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", conn);
conn.Open();
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(dt);
conn.Close();
return dt;
}
Когда этот метод вызывается, я не получаю ошибку вообще! Когда я помещаю часы в таблицу данных (dt), я вижу, что она пуста. Нет заголовков строк, и строки пусты. Я знаю, что запрос в некоторой степени действителен, потому что Rows.Count на dt возвращает количество строк в листе, который я запрашиваю.
Что я мог делать неправильно?
Спасибо за помощь!
РЕДАКТИРОВАТЬ: Вот моя строка подключения
<add name="EXCEL" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;
Data Source={0};
Extended Properties='Excel 8.0;
HDR=Yes; IMEX=1;'" />
Я помещаю местоположение файла вместо {0}
3 ответа
Установить соединение
String strExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=Book1.xls;"
+ "Extended Properties='Excel 8.0;HDR=Yes'";
OleDbConnection connExcel = new OleDbConnection(strExcelConn);
OleDbCommand cmdExcel = new OleDbCommand();
cmdExcel.Connection = connExcel;
Доступ к листам
connExcel.Open();
DataTable dtExcelSchema;
dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
connExcel.Close();
DataSet ds = new DataSet();
string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
da.SelectCommand = cmdExcel;
da.Fill(ds);
connExcel.Close();
Перейдите по этой ссылке
https://www.connectionstrings.com/excel/
Попробуйте установить IMEX=1
или же HDR=YES
в вашей строке подключения
Список перегрузки метода DataAdapter.Fill следующий:
- Fill(DataSet)
- Заполнить (DataTable, IDataReader)
- Заполнить (DataTable[], IDataReader, Int32, Int32)
- Заполнить (DataSet, String, IDataReader, Int32, Int32)
Не существует метода с одним параметром DataTable.
В вашем случае вы можете использовать метод Fill(DataSet) и возвращать.Tables[0] или.Tables["TableName"];
Посмотрите следующий код:
public static DataTable GetDataFromSpreadsheet(OleDbConnection conn)
{
DataSet ds = new DataSet();
OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", conn);
conn.Open();
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(ds);
conn.Close();
return ds.Tables[0];
}