【发布时间】:2016-02-02 20:52:10
【问题描述】:
背景:我有一个 2008R2 Web 服务器上的 asp.net 网页(剃刀)应用程序,该应用程序有一个带有 excel 上传按钮的页面,允许用户将 excel 数据发布到 SQL Server 2014 年表。为了让它在开发服务器上工作,我必须安装 Microsoft Access Database Engine 2010,如MikesDotNetting blog post. 中所述,但是,我被鼓励找到一种方法将数据导入到不需要的生产服务器在服务器上安装 Microsoft Access 数据库引擎。我有一个 C# Windows Forms 应用程序可以做同样的事情,但我不擅长将 Windows Forms 应用程序代码转换为我的 Razor 网站。
实际上我没想到下面的代码会起作用,因为我将数据发布到 SQL Server 2014 和 according to MS OleDB has been deprecated,并且自 SQL Server 2012 以来一直不受支持。
Q1 - 弃用只是意味着“使用风险自负”还是意味着它根本不应该在 2014 年工作?
下面的代码(发生在我的 if...ISPOST 之后)非常适合将 excel 文件上传到我的 Web 服务器,然后插入到 SQL Server 2014 表中。我只需要找到一种无需将 Microsoft Access 数据库引擎安装到生产服务器 2008 R2 IIS7 即可使其正常工作的方法。
Q2 - 是否有一些 Nuget 包或其他解决方法可能会有所帮助?
Q3 - 是否有一个快速的解决方法可以将该 OLE DB 连接字符串转换为 ODBC?
Q4 - 是否有一个命名空间/程序集我可以添加到不需要在服务器上安装访问数据库引擎的项目中?
代码:
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;
}
【问题讨论】:
-
Q1(已回答)。我发现另一个 S.O. post with a nice explanation 和一个 blog post from late 2011 有一些叙述暗示,虽然已弃用,但 OLE DB 将被支持另外 7 年(即到 2018 年)。
-
Q2(已回答)。有几个 Nuget 包选项可用于处理 Excel 文件ClosedXML、ExcelDataReader、EPPlus 等。但是,我决定只从我的 c# windows 窗体应用程序创建一个 dll(注意:我称它为控制台应用程序最初在 OP 中)。正如this SO post 中所述,这非常简单
-
第三季度(已回答)。我还没有这样做,但我发现这篇不错的博客文章演示了如何将您的 OLE DB 连接转换为 ODBC connections。
-
Q4 我试过这个(见上面第一条评论中的链接)。我首先从我的 Windows 窗体应用程序创建了一个 dll。要做到这一点... 1)将输出类型更改为类库,然后重建 c# win forms 应用程序。,2)将 dll 文件添加到 bin 文件夹,3)然后将 dll 复制到 web 应用程序 bin 文件夹, 4) 右键单击并添加引用, 5) 然后将代码从 win forms 应用程序复制到您的 web 应用程序中。我意识到它仍然需要一个连接字符串,因为该文件首先存储在 Web 服务器上。所以它没有用。
-
Q2 我还想提一下,这篇文章的第一段解释了我遇到的问题。 [在 ASP.NET 中读取 Excel 文件而不保存到磁盘](mikesdotnetting.com/article/277/…) 基本上,您需要使用像 EPPlus 这样的库来从 excel 流式传输数据,而无需将文件存储在 Web 服务器上。由于 Excel 文件不接触 Web 服务器,因此没有理由在服务器上安装那些 OLEDB 或 ODBC 连接字符串或安装 MS Access Db Engine 或其他驱动程序。
标签: c# asp.net sql-server excel razor