一、环境
工具:VS2019
项目类型:C# Windows 窗体应用(.NET Framework)
框架:.NET Framework 4
控件:窗体、按钮(Button)
功能简述:点击按钮,选择想要导入数据库的表格,接着将表格内容导入到数据库
界面:仅用一个按钮测试功能即可
二、详细步骤
(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)运行
运行前数据库:
运行后数据库:
三、附言
部分类,函数的说明链接:
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