Механизм базы данных Microsoft Office Access не может найти объект
Я пытаюсь скопировать данные из Excel на сервер SQL, но сталкивается со следующей ошибкой.
Механизм базы данных Microsoft Office Access не смог найти объект "sheet1$". Убедитесь, что объект существует, и что вы правильно написали его имя и путь.
Мой код:
protected void importdatafromexcel(string filepath)
{
string sqltable = "PFDummyExcel";
string exceldataquery = "select EmployeeId,EmployeeName,Amount from [Sheet1$]";
string excelconnectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=Excel 12.0;Persist Security Info=False";
string sqlconnectionstring = System.Configuration.ConfigurationManager.ConnectionStrings["HRGold"].ConnectionString;
SqlConnection con = new SqlConnection(sqlconnectionstring);
OleDbConnection oledb = new OleDbConnection(excelconnectionstring);
OleDbCommand oledbcmd = new OleDbCommand(exceldataquery, oledb);
oledb.Open();
OleDbDataReader dr = oledbcmd.ExecuteReader();
SqlBulkCopy bulkcopy = new SqlBulkCopy(sqlconnectionstring);
bulkcopy.DestinationTableName = sqltable;
while (dr.Read())
{
bulkcopy.WriteToServer(dr);
}
oledb.Close();
}
Пожалуйста, скажите мне, как я решаю это..
2 ответа
Эта ошибка возникает из-за того, что вы пытаетесь получить доступ к листу (имя которого sheet1) в файле Excel. По умолчанию имя первого листа - "sheet1", но пользователь должен либо переименовать это имя, либо удалить этот лист.
Чтобы решить эту проблему, в первую очередь вы должны получить все имена листов из файла Excel, затем вам нужно передать это имя листа в приведенном выше коде для импорта данных.
string filePath = "your file path";
string excelconnectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=Excel 12.0;Persist Security Info=False";
OleDbConnection Connection = new OleDbConnection(excelconnectionstring);
DataTable activityDataTable = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if(activityDataTable != null)
{
//validate worksheet name.
var itemsOfWorksheet = new List<SelectListItem>();
string worksheetName;
for (int cnt = 0; cnt < activityDataTable.Rows.Count; cnt++)
{
worksheetName = activityDataTable.Rows[cnt]["TABLE_NAME"].ToString();
if (worksheetName.Contains('\''))
{
worksheetName = worksheetName.Replace('\'', ' ').Trim();
}
if (worksheetName.Trim().EndsWith("$"))
itemsOfWorksheet.Add(new SelectListItem { Text = worksheetName.TrimEnd('$'), Value = worksheetName });
}
}
// itemsOfWorksheet : all worksheet name is added in this
так что вы можете использовать itemsOfWorksheet[0] в качестве имени листа вместо "sheet1"
У меня была похожая проблема, я разобрался с
- Сохранение файла excel из fileuploader во временную папку внутри папки сайта.
- Используя путь к этому файлу в моей строке подключения
Все остальное было таким же, и теперь ошибка: ядро базы данных Microsoft Office Access не может найти объект 'sheet1$'.