一、环境

工具:VS2019

项目类型:C# Windows 窗体应用(.NET Framework)

框架:.NET Framework 4

控件:窗体、按钮(Button)

功能简述:点击按钮,选择想要导入数据库的表格,接着将表格内容导入到数据库

界面:仅用一个按钮测试功能即可

sql server 导入 decimail sql server2019导入数据_c#

二、详细步骤

(1)添加using 引用集

using System.Data.OleDb;
using System.IO;

(2)双击按钮,编写按钮动作

private void button5_Click(object sender, EventArgs e)
{
    string SheetName = "Sheet1";  //选择要导入的工作簿的名称,必须真实存在 

    string connString = "server=CAM-01\\SQLDEMO;database=GroupInfo;Trusted_Connection=SSPI"; //预备Windows身份验证连接数据库

    string strExcel = string.Format("select * from [{0}$]", SheetName);   //"SheetName"会替代"{0}" 变成:select * from [Sheet1$]

    System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();   //选择Excel表格
    if (fd.ShowDialog() == DialogResult.OK)   //如果表格已经选择
    {
        string excelFile = fd.FileName;
        string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 12.0;";
        OleDbConnection conn = new OleDbConnection(strConn);  //连接表格
        conn.Open();     //打开表格数据源

        DataSet ds = new DataSet();   //创建数据集对象
        OleDbDataAdapter myCommand = null;
        myCommand = new OleDbDataAdapter(strExcel, strConn);
        myCommand.Fill(ds, SheetName);    //OleDbDataAdapter通过Fill将数据从数据源加载到 DataSet 数据集

        //如果数据库中目标表不存在则创建(excel文件的第一行为列标题,从第二行开始是数据记录) 
        string strSql = string.Format("if not exists(select * from sysobjects where name = '{0}') create table {0}(", SheetName);   //以sheetName为数据库中的表名     
        foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
        {
            strSql += string.Format("[{0}] varchar(255),", c.ColumnName);   //表格的列
        }  //最终变成: if not exists(select * from sysobjects where name = 'Sheet1') create table Sheet1([编号] varchar(255),[姓名] varchar(255),[ID] varchar(255),[部门] varchar(255),[等级] varchar(255),[F6] varchar(255),
        strSql = strSql.Trim(',') + ")"; //if not exists(select * from sysobjects where name = 'Sheet1') create table Sheet1([编号] varchar(255),[姓名] varchar(255),[ID] varchar(255),[部门] varchar(255),[等级] varchar(255),[F6] varchar(255))
        using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connString))
        {
            sqlconn.Open();
            System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();  //CreateCommand创建SqlCommand对象,用于执行一些SQL语句
            command.CommandText = strSql;
            command.ExecuteNonQuery();   //执行数据库语句,即执行 strSql :如果数据库中目标表不存在则创建
            sqlconn.Close();
        }

        //excel文件中列的顺序必须和数据表的列顺序一致,因为数据导入时,是从excel文件的第二行数据开始,不管数据表的结构是什么样的,反正就是第一列的数据会插入到数据表的第一列字段中,第二列的数据插入到数据表的第二列字段中,以此类推,它本身不会去判断要插入的数据是对应数据表中哪一个字段的     
        using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connString))  //SqlBulkCopy:批量插入数据
        {
            bcp.BatchSize = 1;   //每次传输的行数        
            bcp.NotifyAfter = 1;   //进度提示的行数        
            bcp.DestinationTableName = SheetName;   //目标表        
            bcp.WriteToServer(ds.Tables[0]);
        }
    }

}

(3)运行

sql server 导入 decimail sql server2019导入数据_sql_02

运行前数据库:

sql server 导入 decimail sql server2019导入数据_System_03

 运行后数据库:

sql server 导入 decimail sql server2019导入数据_c#_04

三、附言

部分类,函数的说明链接:

OleDbConnection:OleDbConnection 类 (System.Data.OleDb) | Microsoft Docs

DataSet:DataSet 类 (System.Data) | Microsoft Docs

OleDbDataAdapter:OleDbDataAdapter 类 (System.Data.OleDb) | Microsoft Docs

SqlConnection:SqlConnection 类 (System.Data.SqlClient) | Microsoft Docs

SqlCommand:SqlCommand 类 (System.Data.SqlClient) | Microsoft Docs

ExecuteNonQuery: SqlCommand.ExecuteNonQuery 方法 (System.Data.SqlClient) | Microsoft Docs

SqlBulkCopy:SqlBulkCopy 类 (System.Data.SqlClient) | Microsoft Docs