2017-08-21 63 views
0

我試圖通過ssms或C#將現有的Excel文件保存到我的SQL Server 2016數據庫中。如何通過ssms或c#在SQL Server 2016數據庫中保存Excel文件?

我想將我的Excel文件的每一行保存在C#對象中,然後將其保存到我的數據庫中,或者您有更好的想法嗎?

我還考慮將Excel文件保存爲*.csv,並通過ssms將其導入到我的數據庫中。

您會推薦以下哪兩項建議,或者是否有其他解決方案?

如果您有任何問題,我會很高興回答他們。

我提前感謝您的所有答案和提示!

+0

請在提問前閱讀[幫助]。至少有兩個原因可以解決這個問題。沒有努力來解決你的問題和要求建議。 – Steve

+0

答案在很大程度上取決於電子表格的大小。你自己的測試運行決定哪個效果最好 – BugFinder

回答

1

對於您的問題,您可以在下面試圖接近:

1)使用使用SqlBulkCopy:顧名思義確實從一個源批量插入到另一個,因此從Excel的所有行

SqlBulkCopy類工作表可以使用SqlBulkCopy類輕鬆讀取和插入。

protected void Upload(object sender, EventArgs e) 
{ 
    //Upload and save the file 
    string excelPath = Server.MapPath("~/Files/") + Path.GetFileName(FileUpload1.PostedFile.FileName); 
    FileUpload1.SaveAs(excelPath); 

    string conString = string.Empty; 
    string extension = Path.GetExtension(FileUpload1.PostedFile.FileName); 
    switch (extension) 
    { 
     case ".xls": //Excel 97-03 
      conString = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString; 
      break; 
     case ".xlsx": //Excel 07 or higher 
      conString = ConfigurationManager.ConnectionStrings["Excel07+ConString"].ConnectionString; 
      break; 

    } 
    conString = string.Format(conString, excelPath); 
    using (OleDbConnection excel_con = new OleDbConnection(conString)) 
    { 
     excel_con.Open(); 
     string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString(); 
     DataTable dtExcelData = new DataTable(); 

     //[OPTIONAL]: It is recommended as otherwise the data will be considered as String by default. 
     dtExcelData.Columns.AddRange(new DataColumn[3] { new DataColumn("Id", typeof(int)), 
       new DataColumn("Name", typeof(string)), 
       new DataColumn("Salary",typeof(decimal)) }); 

     using (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [" + sheet1 + "]", excel_con)) 
     { 
      oda.Fill(dtExcelData); 
     } 
     excel_con.Close(); 

     string consString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(consString)) 
     { 
      using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con)) 
      { 
       //Set the database table name 
       sqlBulkCopy.DestinationTableName = "dbo.tblPersons"; 

       //[OPTIONAL]: Map the Excel columns with that of the database table 
       sqlBulkCopy.ColumnMappings.Add("Id", "PersonId"); 
       sqlBulkCopy.ColumnMappings.Add("Name", "Name"); 
       sqlBulkCopy.ColumnMappings.Add("Salary", "Salary"); 
       con.Open(); 
       sqlBulkCopy.WriteToServer(dtExcelData); 
       con.Close(); 
      } 
     } 
    } 
} 

在這裏這段代碼添加了一個Excel表,其中包含三列,分別爲Id,Name和Salary。

2)使用DTS在SSMS:

可以使用SQL Server數據轉換服務(DTS)導入嚮導或SQL Server導入和導出嚮導Excel數據導入SQL Server表。在逐步完成嚮導並選擇Excel源表時,請記住附加有美元符號($)的Excel對象名稱表示工作表(例如Sheet1 $),並且沒有美元符號的普通對象名稱表示Excel命名範圍。

3)使用SSIS包:

您可以創建SSIS包導入Excel文件。爲此,您可以在Visual Studio或SQL Server Data工具中使用BIDS。

你可以給你的excel文件作爲excel源,並在目標給你的SQL服務器數據庫表。 執行必要的映射,你很好去。

現在,你必須有一個像什麼時候使用哪種方法的問題?

使用方法1,當您提供在用戶端導入excel文件的功能時,即根據應用需求,用戶可以上傳本地excel表格。對於這個用例,你應該注意的一件事是,用戶必須知道該模板。如果你已經編寫了用3列導入excel的代碼,並且用戶試圖導入4列,你將來會有一些錯誤。所以請確保您提供了一個用戶應該下載並填寫並上傳的模板。

使用方法2,無論何時只想加載數據一次,或者您可以說要執行初始加載。您可以使用這種方法,因爲它非常簡單,並且需要更少的時間來完成配置。

使用方法3,只要您有一些要求從某個共享位置及時導入Excel數據。例如,您正在將每月移動賬單導入某個供應商提供的數據庫。您可以爲此功能創建一個包,並執行SSIS配置並創建一個包。 創建包後,您可以創建一個SQL作業並按照需求進行調度。

+0

非常感謝您的詳細解答!方法3對我來說似乎很有趣,我希望這將成爲我的問題的解決方案!再次,非常感謝您的努力! –

+0

不客氣。在使用方法3時,確保在導入時使用數據轉換功能,否則將出現錯誤數據。請讓我知道,如果你需要任何幫助。 –

0

您可以在SQL Server中使用BulkInsert進口數據文件到數據庫表或視圖在用戶指定的格式

+0

謝謝!我會試一試! –

0

由於所有的,這取決於使用的,變化的頻率,誰去維護的解決方案等。

SSIS和CSV導入

它可以創建SSIS包MSSQL服務器或手動上部署時就可以自動導入您的數據。這將是最簡單/最快實施的。使用Visual Studio工具進行SSIS開發時的優點之一是可以直觀地表示映射,流。 缺點是,即使我看到了自動化列映射更新(C#自動SSIS包生成),無論何時需要添加,刪除,更改列,都需要手動更改。

BCP

MS控制檯實用工具,您可以使用格式文件來定義列和導入您的CSV。缺點是你沒有圖形用戶界面,儘管很多人會認爲這是一個優點,因爲對變化有更好的概述。

ORM

在對象關係映射解決方案,您將需要翻譯您的Excel文件到面向對象編程語言類,並保存爲對象到數據庫表。缺點是你需要有一些編程知識,但是會在更長的時間內得到回報,因爲你的解決方案可能直接從這些Excel表格的源代碼中獲取數據。

相關問題