如何通过SSMS或c#在SQL Server 2016数据库中保存Excel文件?



我正在尝试通过ssms或C#将现有的Excel文件保存到我的SQL Server 2016数据库中。

我想将 Excel 文件的每一行保存在 C# 对象中,然后将其保存到我的数据库中,或者您有更好的想法吗?

我还考虑将 Excel 文件另存为*.csv,并通过数据库中的 ssms 导入此文件。

您会推荐这两个想法中的哪一个,或者还有其他方法可以解决此问题吗?

如果您有任何问题,我很乐意回答。

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

对于您的问题,您可以尝试以下方法:

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( 在 SSMS 中使用 DTS:

可以使用 SQL ServerData Transformation Services (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 列的 excel,则将来会遇到一些错误。因此,请确保您提供用户应下载并填写并上传的模板。

使用方法 2,只要您只想加载一次数据,或者您可以说您想要执行初始加载。您可以使用此方法,因为它非常简单,并且需要更少的时间来执行配置。

使用方法 3,只要您有一些要求,例如从某个共享位置及时导入 Excel 数据。例如,您正在将每月移动账单导入某些供应商提供的数据库。可以为此功能创建包,并执行 SSIS 配置并创建包。 创建包后,可以创建 SQL 作业并根据要求对其进行计划。

可以使用大容量插入将数据文件导入到 SQL Server 中以用户指定的格式导入数据库表或视图中

总而言之,这取决于使用情况、更改频率、谁来维护解决方案等。

SSIS 和 CSV 导入

可以创建SSIS包,该包能够在部署在MSSQL服务器上或手动部署时自动导入数据。这将是最简单/最快的实现。使用Visual Studio工具进行SSIS开发时,其中一个优点是可以直观地表示映射,流。 缺点,即使我看到了自动列映射更新(C# 自动 SSIS 包生成(,但每当需要添加、删除、更改列时,都需要手动更改。

BCP

MS控制台实用程序,可用于定义格式化文件中的列并导入CSV。 缺点是没有图形用户界面,尽管许多人会争辩说这是一个优势,因为有更好的更改概述。

奥姆

在对象关系映射解决方案中,您需要将 Excel 文件转换为面向对象的编程语言类,并作为对象保存到数据库表中。缺点是您需要具备一些编程知识,但从长远来看会得到回报,因为您的解决方案可能会直接从这些 excel 工作表的源中获取数据。

最新更新