C# SqlBulkCopy类批量导入 测试

时间:2023-03-09 22:39:19
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 = ; 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 = ; i < ; 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 = ; 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;
}
}
}
}

执行结果无异常。

C# SqlBulkCopy类批量导入 测试

 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 = ; i < ; 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#代码没有报错:

C# SqlBulkCopy类批量导入 测试

 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 = ; i < ; 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;
}
}
}
}

数据正常导入数据库,但是存在数据问题,顺序错乱。

C# SqlBulkCopy类批量导入 测试