批量高效向sqlserver中插入資料
阿新 • • 發佈:2019-01-27
原文:http://blog.csdn.net/tjvictor/article/details/4360030
表值引數是SQL Server 2008新特性,簡稱TVPs
程式碼如下:
資料庫建立:
--Create DataBase create database BulkTestDB; go use BulkTestDB; go --Create Table Create table BulkTestTable( Id int primary key, UserName nvarchar(32), Pwd varchar(16)) go --Create Table Valued CREATE 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(); } } public static DataTable GetTableSchema() //建立對應格式的DataTable { DataTable dt = new DataTable(); dt.Columns.AddRange(new DataColumn[]{ new DataColumn("Id",typeof(int)), new DataColumn("UserName",typeof(string)), new DataColumn("Pwd",typeof(string))}); return dt; } static void Main(string[] args) { Stopwatch sw = new Stopwatch(); for (int multiply = 0; multiply < 10; multiply++) { DataTable dt = TableValued.GetTableSchema(); for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++) { DataRow r = dt.NewRow(); r[0] = count; r[1] = string.Format("User-{0}", count * multiply); r[2] = string.Format("Pwd-{0}", count * multiply); dt.Rows.Add(r); } sw.Start(); TableValued.TableValuedToDB(dt); sw.Stop(); Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds)); } Console.ReadLine(); }
注意: