我試圖通過ssms或C#將現有的Excel文件保存到我的SQL Server 2016數據庫中。如何通過ssms或c#在SQL Server 2016數據庫中保存Excel文件?
我想將我的Excel文件的每一行保存在C#對象中,然後將其保存到我的數據庫中,或者您有更好的想法嗎?
我還考慮將Excel文件保存爲*.csv
,並通過ssms將其導入到我的數據庫中。
您會推薦以下哪兩項建議,或者是否有其他解決方案?
如果您有任何問題,我會很高興回答他們。
我提前感謝您的所有答案和提示!
我試圖通過ssms或C#將現有的Excel文件保存到我的SQL Server 2016數據庫中。如何通過ssms或c#在SQL Server 2016數據庫中保存Excel文件?
我想將我的Excel文件的每一行保存在C#對象中,然後將其保存到我的數據庫中,或者您有更好的想法嗎?
我還考慮將Excel文件保存爲*.csv
,並通過ssms將其導入到我的數據庫中。
您會推薦以下哪兩項建議,或者是否有其他解決方案?
如果您有任何問題,我會很高興回答他們。
我提前感謝您的所有答案和提示!
對於您的問題,您可以在下面試圖接近:
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作業並按照需求進行調度。
非常感謝您的詳細解答!方法3對我來說似乎很有趣,我希望這將成爲我的問題的解決方案!再次,非常感謝您的努力! –
不客氣。在使用方法3時,確保在導入時使用數據轉換功能,否則將出現錯誤數據。請讓我知道,如果你需要任何幫助。 –
由於所有的,這取決於使用的,變化的頻率,誰去維護的解決方案等。
SSIS和CSV導入
它可以創建SSIS包MSSQL服務器或手動上部署時就可以自動導入您的數據。這將是最簡單/最快實施的。使用Visual Studio工具進行SSIS開發時的優點之一是可以直觀地表示映射,流。 缺點是,即使我看到了自動化列映射更新(C#自動SSIS包生成),無論何時需要添加,刪除,更改列,都需要手動更改。
BCP
MS控制檯實用工具,您可以使用格式文件來定義列和導入您的CSV。缺點是你沒有圖形用戶界面,儘管很多人會認爲這是一個優點,因爲對變化有更好的概述。
ORM
在對象關係映射解決方案,您將需要翻譯您的Excel文件到面向對象編程語言類,並保存爲對象到數據庫表。缺點是你需要有一些編程知識,但是會在更長的時間內得到回報,因爲你的解決方案可能直接從這些Excel表格的源代碼中獲取數據。
請在提問前閱讀[幫助]。至少有兩個原因可以解決這個問題。沒有努力來解決你的問題和要求建議。 – Steve
答案在很大程度上取決於電子表格的大小。你自己的測試運行決定哪個效果最好 – BugFinder