2016-02-02 64 views
0

背景:我有一個asp.net網頁(剃鬚刀)應用程序在一個2008R2 web服務器上,有一個頁面與excel上傳按鈕,允許用戶將Excel數據發佈到SQL Server 2014表。爲了使它在開發服務器上工作,我必須按照MikesDotNetting blog post.中所述安裝Microsoft Access數據庫引擎2010。但是,我一直在鼓勵我找到一種方法將數據導入到不需要安裝Microsoft的生產服務器在服務器上訪問數據庫引擎。我有一個C#Windows Forms應用程序可以做同樣的事情,但我不擅長將Windows Forms應用程序代碼轉換爲我的剃鬚刀網站。Asp.net網頁(剃鬚刀)頁面導入Excel數據到SQL Server 2014表

我沒想到居然下面這段代碼的工作,因爲我張貼數據到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; 
       } 
+0

Q1(已回覆)。我發現另一個[S.O.張貼一個很好的解釋](http://stackoverflow.com/questions/9208091/the-difference-between-deprecated-depreciated-and-obsolete)和[2011年底的博客文章](http://hal2020.com/2011/09/25/ole-db-and-sql-server-history-end-game-and-some-microsoft-dirt /),它有一些敘述暗示,但不贊成,OLE DB將會支持另外7年即到2018年)。 – TimK

+0

Q2(已回覆)。有幾個Nuget軟件包選項可用於處理Excel文件[ClosedXML](http://blog.bajajsumit.com/2014/02/uploading-excel-and-importing-data-in.html),[ExcelDataReader](https ://www.nuget.org/packages/ExcelDataReader/),[EPPlus](https://www.nuget.org/packages/EPPlus/)等。 但是,我決定從我創建一個dll c#windows窗體應用程序(注意:我最初稱它爲OP中的控制檯應用程序)。這是非常簡單的,如[本SO帖子]所述(http://stackoverflow.com/questions/11536140/convert-a-completed-project-to-a-dll) – TimK

+0

Q3(已回答)。我還沒有這樣做,但我發現這個不錯的博客文章演示瞭如何將您的OLE DB連接轉換爲[ODBC連接](https://www.simple-talk.com/sql/database-administration/getting-data- Excel的和使用-SQL服務器之間-Books - /)。 – TimK

回答

0

我沒有得到任何答覆這個問題,這讓我覺得它太一般了許多不同的解決方案的問題,經過近50次。儘管如此,爲了使它成爲一個有用的帖子,我只是想將我自己的解決方案(包含鏈接)記錄在提出的4個原始問題中(見上面的評論1-4)。 --Tim

相關問題