C# SqlBulkCopy类批量导入 测试
一、功能说明
1、可以选择,只导入部分列,或者导入全部列。
2、导入速度的确比一般sql要快。
3、不用写sql语句
---------------------------------------------------------
4、导入数据库 须 将字段对应关系做好配置,否则很有可能导入数据库的数据,字段顺序问题出错。
----------------------------------------------------------------------------------------
二、C#导入代码
/// <summary> /// /// </summary> /// <param name="connectionString">目标连接字符</param> /// <param name="TableName">目标表</param> /// <param name="dt">源数据</param> private void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dt) { using (SqlConnection conn = new SqlConnection(connectionString)) { using (SqlBulkCopy sqlbulkcopy =new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction)) { try { sqlbulkcopy.DestinationTableName = TableName; for (int i = 0; i < dt.Columns.Count; i++) { sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); } sqlbulkcopy.WriteToServer(dt); } catch (System.Exception ex) { throw ex; } } } }
三、测试
3.1 数据库建表
CREATE TABLE temp ( test1 varchar(30), test2 varchar(30), test3 varchar(30), test4 varchar(30), test5 varchar(30), test6 varchar(30) )
3.2 C# 代码,测试 DataTabe比数据库表少一个字段,执行插入数据库也少做一个对应关系。
private void button1_Click(object sender, EventArgs e) { SqlBulkCopyByDatatable(dt); } private void Form1_Load(object sender, EventArgs e) { /* * 这里 test1 字段不添加字段,待会看执行Copy 会出错 */ dt = new DataTable(); dt.Columns.Add("test2", System.Type.GetType("System.String")); dt.Columns.Add("test3", System.Type.GetType("System.String")); dt.Columns.Add("test4", System.Type.GetType("System.String")); dt.Columns.Add("test5", System.Type.GetType("System.String")); dt.Columns.Add("test6", System.Type.GetType("System.String")); //添加行数据 for (int i = 0; i < 100; i++) { DataRow dr = dt.NewRow(); dr["test2"] = "test2"; dr["test3"] = "test3"; dr["test4"] = "test4"; dr["test5"] = "test5"; dr["test6"] = "test6"; dt.Rows.Add(dr); } this.dataGridView1.DataSource = dt; } /// <summary> /// /// </summary> /// <param name="connectionString">目标连接字符</param> /// <param name="TableName">目标表</param> /// <param name="dt">源数据</param> private void SqlBulkCopyByDatatable(DataTable dt) { using (SqlConnection conn = new SqlConnection("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;")) { using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;", SqlBulkCopyOptions.UseInternalTransaction)) { try { sqlbulkcopy.DestinationTableName = "temp"; for (int i = 0; i < dt.Columns.Count; i++) { sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); } sqlbulkcopy.WriteToServer(dt); } catch (System.Exception ex) { throw ex; } } } }
执行结果无异常。
3.3 数据库表中 的“test1” 列 DataTable 没有,DataTable 中“test7” 数据库没有,对应关系 只关联双方共有的列。
private void button1_Click(object sender, EventArgs e) { SqlBulkCopyByDatatable(dt); } private void Form1_Load(object sender, EventArgs e) { /* * 这里 test1 字段不添加字段,待会看执行Copy 会出错 * 新增 test7 列 ,数据库中没有 ‘test7’ 这一列 */ dt = new DataTable(); dt.Columns.Add("test2", System.Type.GetType("System.String")); dt.Columns.Add("test3", System.Type.GetType("System.String")); dt.Columns.Add("test4", System.Type.GetType("System.String")); dt.Columns.Add("test5", System.Type.GetType("System.String")); dt.Columns.Add("test6", System.Type.GetType("System.String")); dt.Columns.Add("test7", System.Type.GetType("System.String")); //添加行数据 for (int i = 0; i < 100; i++) { DataRow dr = dt.NewRow(); dr["test2"] = "test2"; dr["test3"] = "test3"; dr["test4"] = "test4"; dr["test5"] = "test5"; dr["test6"] = "test6"; dr["test7"] = "test7"; dt.Rows.Add(dr); } this.dataGridView1.DataSource = dt; } /// <summary> /// /// </summary> /// <param name="connectionString">目标连接字符</param> /// <param name="TableName">目标表</param> /// <param name="dt">源数据</param> private void SqlBulkCopyByDatatable(DataTable dt) { using (SqlConnection conn = new SqlConnection("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;")) { using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;", SqlBulkCopyOptions.UseInternalTransaction)) { try { /* * 字段对应关系绑定,只绑定双方共有的。 */ sqlbulkcopy.DestinationTableName = "temp"; sqlbulkcopy.ColumnMappings.Add("test2", "test2"); sqlbulkcopy.ColumnMappings.Add("test3", "test3"); sqlbulkcopy.ColumnMappings.Add("test4", "test4"); sqlbulkcopy.ColumnMappings.Add("test5", "test5"); sqlbulkcopy.ColumnMappings.Add("test6", "test6"); //for (int i = 0; i < dt.Columns.Count; i++) //{ // sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); //} sqlbulkcopy.WriteToServer(dt); } catch (System.Exception ex) { throw ex; } } } }
sql数据库插入数据 正常,C#代码没有报错:
3.4 打乱Datatable 列的顺序,不添加字段对应关系,数据库中导入数据错位。
private void button1_Click(object sender, EventArgs e) { SqlBulkCopyByDatatable(dt); } private void Form1_Load(object sender, EventArgs e) { /* * 这里 test1 字段不添加字段,待会看执行Copy 会出错 * 新增 test7 列 ,数据库中没有 ‘test7’ 这一列 * 打乱 每一列的对应关系 */ dt = new DataTable(); dt.Columns.Add("test5", System.Type.GetType("System.String")); dt.Columns.Add("test6", System.Type.GetType("System.String")); dt.Columns.Add("test7", System.Type.GetType("System.String")); dt.Columns.Add("test2", System.Type.GetType("System.String")); dt.Columns.Add("test3", System.Type.GetType("System.String")); dt.Columns.Add("test4", System.Type.GetType("System.String")); //添加行数据 for (int i = 0; i < 100; i++) { DataRow dr = dt.NewRow(); dr["test5"] = "test5"; dr["test6"] = "test6"; dr["test7"] = "test7"; dr["test2"] = "test2"; dr["test3"] = "test3"; dr["test4"] = "test4"; dt.Rows.Add(dr); } this.dataGridView1.DataSource = dt; } /// <summary> /// /// </summary> /// <param name="connectionString">目标连接字符</param> /// <param name="TableName">目标表</param> /// <param name="dt">源数据</param> private void SqlBulkCopyByDatatable(DataTable dt) { using (SqlConnection conn = new SqlConnection("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;")) { using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy("data source=10.8.88.23;uid=sa;pwd=3434356@ert;database=SDIW;", SqlBulkCopyOptions.UseInternalTransaction)) { try { /* * 字段对应关系绑定,只绑定双方共有的。 */ sqlbulkcopy.DestinationTableName = "temp"; //sqlbulkcopy.ColumnMappings.Add("test2", "test2"); //sqlbulkcopy.ColumnMappings.Add("test3", "test3"); //sqlbulkcopy.ColumnMappings.Add("test4", "test4"); //sqlbulkcopy.ColumnMappings.Add("test5", "test5"); //sqlbulkcopy.ColumnMappings.Add("test6", "test6"); //for (int i = 0; i < dt.Columns.Count; i++) //{ // sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); //} sqlbulkcopy.WriteToServer(dt); } catch (System.Exception ex) { throw ex; } } } }
数据正常导入数据库,但是存在数据问题,顺序错乱。