一、功能說明
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; } } } }
數據正常導入數據庫,但是存在數據問題,順序錯亂。

