在做大型網站或者系統的時候,經常會遇到個問題就是批量插入或者修改數據庫。如果遇到這個問題,還是一條條記錄來處理,這樣的效率太低了,所以要考慮批量插入或者修改
今天這邊不講SqlBulkCopy,只簡單講sql自定義表類型。因為目前的項目我用到了分表的方式,用存儲過程比較方便自動創建分表。現在把我目前寫的功能簡單做個記錄,也方便以后自己查閱
第一步,在數據庫里點擊 新建查詢 創建相應的sql
--======自定義表類型Demo====== --創建表 create table tab ( tabvalue varchar(10) ) go --創建自定義表類型 create type Type_tab as table ( Type_tabvalue varchar(10) ) go --創建 存儲過程 create procedure p_Tab ( @ptab Type_tab readonly ) as begin insert into tab select * from @ptab end --sql 測試表類型 type1 declare @tt Type_tab insert into @tt values('a') insert into @tt values('b') insert into @tt values('c') insert into tab select * from @tt select * from tab --sql 測試表類型 type2 declare @tt2 Type_tab insert into @tt2 values('a') insert into @tt2 values('b') insert into @tt2 values('c') execute p_Tab @tt2
第二步 asp.net 調用 存儲過程
using (SqlConnection conn =SqlHelper.Settings.GetSqlConnection(true)) { try { DataTable DtAdd = new DataTable(); DtAdd.Columns.Add("tabvalue"); DtAdd.Columns["tabvalue"].DataType = System.Type.GetType("System.String"); foreach (ModelEnt rl in List) { DataRow Dr = DtAdd.NewRow(); Dr["tabvalue"] = rl.tabvalue; DtAdd.Rows.Add(Dr); } //int Rt = SqlHelper.SqlHelper.SqlBulkCopy(DtAdd, TableName, conn); SqlCommand cmd = new SqlCommand("p_Tab", conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@ptab", SqlDbType.Structured).Value =DtAdd; if (conn.State == ConnectionState.Closed) { conn.Open(); } return cmd.ExecuteNonQuery(); } catch (Exception ex) { #if DEBUG throw ex; #else return -10000; #endif } finally { conn.Close(); }
ModelEnt 是tab表對應的實體類。list 是ModelEnt 的一個集合,這樣可以實現多個row,這樣就能一次插入多條記錄。
