標籤:
第一種方法:
Insert
部分資料還ok 批量資料效能問題。
第二種方法:
sqlbulkcopy 方法 主要思想 是在用戶端將資料緩衝到datatable裡面,然後用sqlbulkcopy 一次性將資料插入到資料庫表中
方法如下:
System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString); //指定目標資料庫的表名 bcp.DestinationTableName = "resulttable"; //建立資料來源表欄位和目標表中的列之間的映射 bcp.ColumnMappings.Add("sheetname", "sheetname"); bcp.ColumnMappings.Add("meters", "公裡標"); bcp.ColumnMappings.Add("twista", "twista"); //寫入資料庫表 dt 是資料來源DataTable bcp.WriteToServer(dt); //關閉SqlBulkCopy執行個體
bcp.Close();
如果主鍵衝突會復原插入操作,所以要麼保證無衝突要麼建暫存資料表!
第三種方法:
表值參數 tvps 需要先在sql上建立表值參數
--Create DataBasecreate database BulkTestDB;gouse BulkTestDB;go--Create TableCreate table BulkTestTable(Id int primary key,UserName nvarchar(32),Pwd varchar(16))go--Create Table ValuedCREATE TYPE BulkUdt AS TABLE (Id int, UserName nvarchar(32),
Pwd varchar(16))
public static void TableValuedToDB(DataTable dt){ SqlConnection sqlConn = new SqlConnection( ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString); const string TSqlStatement = "insert into BulkTestTable (Id,UserName,Pwd)" + " SELECT nc.Id, nc.UserName,nc.Pwd" + " FROM @NewBulkTestTvp AS nc"; SqlCommand cmd = new SqlCommand(TSqlStatement, sqlConn); SqlParameter catParam = cmd.Parameters.AddWithValue("@NewBulkTestTvp", dt); catParam.SqlDbType = SqlDbType.Structured; //表值參數的名字叫BulkUdt,在上面的建立測試環境的SQL中有。 catParam.TypeName = "dbo.BulkUdt"; try { sqlConn.Open(); if (dt != null && dt.Rows.Count != 0) { cmd.ExecuteNonQuery(); } } catch (Exception ex) { throw ex; } finally { sqlConn.Close(); }}
datatable序列化成json
調用jsonnet庫
jsondata = JsonConvert.SerializeObject(dt, new DataTableConverter());
批量插入資料到sqlserver