C# 如何通过ssms或c在SQL Server 2016数据库中保存Excel文件?
我正在尝试通过ssms或C将现有Excel文件保存到SQL Server 2016数据库中 我想将Excel文件的每一行保存在C对象中,然后将其保存到我的数据库中,或者您有更好的想法吗 我还考虑将Excel文件保存为*.csv,并通过数据库中的ssms导入该文件 您会推荐这两个想法中的哪一个,或者有其他解决此问题的方法吗 如果你有任何问题,我很乐意回答C# 如何通过ssms或c在SQL Server 2016数据库中保存Excel文件?,c#,sql-server,excel,ssms,C#,Sql Server,Excel,Ssms,我正在尝试通过ssms或C将现有Excel文件保存到SQL Server 2016数据库中 我想将Excel文件的每一行保存在C对象中,然后将其保存到我的数据库中,或者您有更好的想法吗 我还考虑将Excel文件保存为*.csv,并通过数据库中的ssms导入该文件 您会推荐这两个想法中的哪一个,或者有其他解决此问题的方法吗 如果你有任何问题,我很乐意回答 我提前感谢您提供的所有答案和提示 您可以使用将数据文件导入到SQL Server中用户指定格式的数据库表或视图中总之,这取决于使用情况、更改频率
我提前感谢您提供的所有答案和提示 您可以使用将数据文件导入到SQL Server中用户指定格式的数据库表或视图中总之,这取决于使用情况、更改频率、谁将维护解决方案等 SSIS和CSV导入 可以创建SSIS包,在MSSQL服务器上部署或手动部署时,该包能够自动导入数据。这将是最简单/最快的实现方法。使用VisualStudio工具进行SSIS开发时的一个优点是,您可以直观地表示映射、流。 缺点是,尽管我见过自动列映射更新C自动生成SSIS包,但无论何时需要添加、删除或更改列,都需要手动更改 BCP MS控制台实用程序,可用于在格式化文件中定义列并导入CSV。缺点是并没有图形用户界面,尽管许多人认为这是一个优势,因为有更好的变化概述 奥姆
在对象关系映射解决方案中,您需要将Excel文件转换为面向对象编程语言类,并将其另存为数据库表中的对象。缺点是,您需要具备一些编程知识,但从长远来看会有所收获,因为您的解决方案可能会直接从excel工作表的源代码中获取数据。对于您的问题,您可以尝试以下方法: 1使用SQLBulkcopy: 顾名思义,SqlBulkCopy类执行从一个源到另一个源的大容量插入,因此可以使用SqlBulkCopy类轻松读取和插入Excel工作表中的所有行
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、姓名和薪水三列
2在SSM中使用DTS:
您可以使用SQL Server Data Transformation Services DTS导入向导或SQL Server导入和导出向导将Excel数据导入到SQL Server表中。当您单步执行向导并选择Excel源表时,请记住,附加美元符号$的Excel对象名称表示工作表,例如Sheet1$,没有美元符号的普通对象名称表示Excel命名范围
3使用SSIS包:
您可以创建SSIS包以导入excel文件。为此,您可以在VisualStudio或SQLServer数据工具中使用BIDS
您可以将excel文件作为excel源,并在目标中提供SQL server数据库表。
执行必要的映射,就可以开始了
现在,你一定有一个问题,比如什么时候使用哪种方法
使用方法1,每当您在用户端提供导入excel文件的功能时,即根据应用程序要求,用户可以上载本地excel工作表。对于这个用例,您应该注意的一件事是,用户必须知道模板。如果您编写了代码以导入包含3列的excel,而用户尝试导入包含4列的excel,则将来会出现一些错误。所以,请确保您提供了一个用户应该下载、填写并上传的模板
只要您只想加载一次数据,或者您可以说您想执行初始加载,就使用方法2。您可以使用这种方法,因为它最简单,配置所需的时间更少
使用方法3,只要您有一些需求,比如从某个共享位置及时导入excel数据。例如,您正在将每月移动账单导入某个供应商提供的数据库。您可以为此功能创建包,并执行SSIS配置和创建包。
创建包后,您可以创建一个SQL作业,并根据要求安排它。请在询问之前阅读。至少有两个原因可以解决这个问题。不努力解决您的问题,也不寻求建议。答案在很大程度上取决于电子表格的大小。。您自己的测试运行决定哪种最有效吗?谢谢!我要试试看!非常感谢您的详细回答!方法3对我来说似乎很有趣,我希望这能解决我的问题!再次感谢您的努力!不客气。在使用方法3时,请确保在导入时使用了数据转换功能,否则将产生错误的数据。请让我 如果你在这方面需要帮助,就要知道。