【发布时间】:2020-04-29 17:54:23
【问题描述】:
我制作了一个小网络应用程序,让用户能够将 .xlsx 文件上传到服务器的数据库表,但我遇到了 OLEDB 连接字符串:
System.InvalidOperationException: 'El proofedor 'Microsoft.ACE.OLEDB.12.0' no está registrado en elequipo local。'
由于应用程序将被上传到公司的服务器,因此安装 x32 驱动程序是不可行的,并且将项目更改为以 x32 版本运行也无济于事。我正在寻找一种更好的方法来实现这一点,并将 .xlsx 文件保留为用户输入。
protected void btnImportar_Click(object sender, EventArgs e)
{
//SUBE Y GUARDA ARCHIVO
string rutaArchivo = Server.MapPath(subeArchivo.FileName);
string excelPath = Server.MapPath("~/cargas/") + Path.GetFileName(subeArchivo.PostedFile.FileName)/* + "_" + DateTime.Now.ToString("yyyyMMdd")*/;
lblRutaArchivo.Text = rutaArchivo;
subeArchivo.SaveAs(excelPath);
string conStringExcel = string.Empty;
string extension = Path.GetExtension(subeArchivo.PostedFile.FileName);
switch (extension)
{
case ".xls": //Excel 97-03
conStringExcel = ConfigurationManager.ConnectionStrings["Excel03conStringExcel"].ConnectionString;
break;
case ".xlsx": //Excel 07 or higher
conStringExcel = ConfigurationManager.ConnectionStrings["Excel07+conStringExcel"].ConnectionString;
break;
}
conStringExcel = string.Format(conStringExcel, excelPath);
using (OleDbConnection connExcel = new OleDbConnection(conStringExcel))
{
connExcel.Open(); // ERROR SHOWS UP HERE
string hojaExcel = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["CAR_DCT"].ToString();
DataTable dtExcelData = new DataTable();
//TODAS LAS COLUMNAS COMO STRING
dtExcelData.Columns.AddRange(new DataColumn[7] {
new DataColumn("ID_USU_CAR", typeof(string)),
new DataColumn("RUT_DCT", typeof(string)),
new DataColumn("TIP_CON", typeof(string)),
new DataColumn("ID_CON", typeof(string)),
new DataColumn("INI_BEN", typeof(string)),
new DataColumn("FIN_BEN", typeof(string)),
new DataColumn("MON_CLP", typeof(string))
});
using (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [" + hojaExcel + "]", connExcel))
{
oda.Fill(dtExcelData);
}
connExcel.Close();
using (connSQL)
{
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connSQL))
{
//Set the database table name
sqlBulkCopy.DestinationTableName = "dbo.TH_AD.CAR_DCT_BEN_TMP";
//MAPEO COLUMNAS
//ID_USU_CARGA RUT_DV TIP_CON ID_CON INI_BEN FIN_BEN MON_CLP
sqlBulkCopy.ColumnMappings.Add("ID_USU_CAR", "ID_USU_CAR");
sqlBulkCopy.ColumnMappings.Add("RUT_DCT", "RUT_DCT");
sqlBulkCopy.ColumnMappings.Add("TIP_CON", "TIP_CON");
sqlBulkCopy.ColumnMappings.Add("ID_CON", "ID_CON");
sqlBulkCopy.ColumnMappings.Add("INI_BEN", "INI_BEN");
sqlBulkCopy.ColumnMappings.Add("FIN_BEN", "FIN_BEN");
sqlBulkCopy.ColumnMappings.Add("MON_CLP", "MON_CLP");
connSQL.Open();
sqlBulkCopy.WriteToServer(dtExcelData);
connSQL.Close();
}
}
}
}
【问题讨论】:
-
如果您使用 SQL 连接,您可以使用 SqlConnection 代替。它比 OleDb 更有效,但限制您使用 SQL。此外,您可能应该考虑使用 hojaExcel 的参数来避免 sql 注入。
标签: c# asp.net sql-server excel