Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过ssms或c在SQL Server 2016数据库中保存Excel文件?_C#_Sql Server_Excel_Ssms - Fatal编程技术网

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

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中用户指定格式的数据库表或视图中总之,这取决于使用情况、更改频率

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

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

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

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

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


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

您可以使用将数据文件导入到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时,请确保在导入时使用了数据转换功能,否则将产生错误的数据。请让我 如果你在这方面需要帮助,就要知道。