Asp.net 网页 (razor) 页将 Excel 数据导入 SQL Server 2014 表
本文关键字:导入 数据 SQL Server 2014 Excel 页将 网页 net razor Asp | 更新日期: 2023-09-27 18:32:53
背景:我在 2008R2 Web 服务器上有一个 asp.net 网页 (razor( 应用程序,该应用程序有一个带有 excel 上传按钮的页面,允许用户将 excel 数据发布到 SQL Server 2014 表中。为了使它在开发服务器上工作,我必须安装Microsoft Access Database Engine 2010,如这篇MikesDotNetting博客文章中所述。但是,有人鼓励我找到一种将数据导入生产服务器的方法,该方法不需要在服务器上安装 Access 数据库引擎Microsoft。我有一个 C# Windows 窗体应用程序可以执行相同的操作,但我不擅长将 Windows 窗体应用程序代码转换为我的 razor 网站。
我实际上没想到下面的这段代码会起作用,因为我将数据发布到 SQL Server 2014,并且根据 MS OleDB 已被弃用,并且自 SQL Server 2012 以来一直不受支持。
Q1 - 弃用是否意味着"使用风险自负",还是意味着它根本不应该在 2014 上工作?
下面的代码(发生在我之后...ISPOST(非常适合将excel文件上传到我的Web服务器,然后插入到SQL Server 2014表中。我只需要找到一种方法来使其工作,而无需将Microsoft Access 数据库引擎安装到生产服务器 2008 R2 IIS7。
问题 2 - 是否有一些 Nuget 包或其他解决方法可能会有所帮助?
问题 3 - 是否有将 OLE DB 连接字符串转换为 ODBC 的快速修复方法?
Q4 - 是否有一个命名空间/程序集可以添加到项目中,而不需要在服务器上安装 Access 数据库引擎?
法典:
try
{
// import code
var excel = Request.Files[0];
var file = Path.Combine(Server.MapPath("~/Upload_Folder/"), excel.FileName);
excel.SaveAs(file);
var excelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='"Excel 12.0 Xml;HDR=Yes;IMEX=1'"";
var sqlConnectionString = ConfigurationManager.ConnectionStrings["MYCONNECTIONSTRING"].ToString();
var excelData = new DataTable();
using (var myConnection = new OleDbConnection(string.Format(excelConnectionString, file)))
{
var myCommand = new OleDbCommand("SELECT * FROM [Sheet1$]", myConnection);
var myAdapter = new OleDbDataAdapter(myCommand);
myAdapter.Fill(excelData);
using (var destinationConnection = new SqlConnection(sqlConnectionString))
{
destinationConnection.Open();
using (var bulkCopy = new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName = "MYTABLE";
bulkCopy.ColumnMappings.Add("CODE", "code");
bulkCopy.ColumnMappings.Add("TITLE", "title");
bulkCopy.ColumnMappings.Add("LAST_NAME", "last_name");
bulkCopy.ColumnMappings.Add("FIRST_NAME", "first_name");
}
}
if (Directory.Exists(Path.GetDirectoryName(file)))
{
File.Delete(file);
}
}
}
catch (Exception ex)
{
throw ex;
}
经过近 50 次浏览后,我没有得到对这个问题的任何回应,这让我觉得这是一个有许多不同的解决方案的问题。但是,为了使它尽可能有用,我只想记录我自己的解决方案(带有链接(到提出的 4 个原始问题(见上面的评论 1-4(。--提姆