C#:30行数据插入到数据库中的效率测试-一行行执行、构造SQL一次执行、SqlBulkCopy
2010-11-11 11:08
1256 查看
做这个测试的起因是看到这样一个帖子:
GridView中有30條記錄:
產品編號 產品名稱 產品價格
001 男士活力潔面乳 39
002 男士剃鬚刀 109
......
030 男士沐浴香波 120
有兩种方法寫入數據庫:
(1)
打開數據庫連接
逐條插入數據
關閉連接
(2)
拼湊出更新數據的SQL語句
打開數據庫連接
執行這條拼湊的SQL語句
關閉數據庫連接
請問哪一種效率更高?大概能高出多少?
另外,在ASP.NET 2.0中,有SqlBulkCopy類,它能完全取代普通的ADO.NET操作嗎?
测试代码:
表:
CREATE TABLE [dbo].[TestTable](
[ID] [int] NULL,
[CreateDateTime] [datetime] NULL,
[TestMethod] [nvarchar](50) NULL
) ON [PRIMARY]
C#代码
测试结果:
第一次执行ExecuteRowByRow:151msExecuteOnce:19msExecuteSqlBulkCopy:5ms
第二次执行ExecuteRowByRow:140msExecuteOnce:15msExecuteSqlBulkCopy:6ms
第三次执行ExecuteRowByRow:179msExecuteOnce:18msExecuteSqlBulkCopy:5ms
虽然测试方法比较简单,但基本能说明问题了。
GridView中有30條記錄:
產品編號 產品名稱 產品價格
001 男士活力潔面乳 39
002 男士剃鬚刀 109
......
030 男士沐浴香波 120
有兩种方法寫入數據庫:
(1)
打開數據庫連接
逐條插入數據
關閉連接
(2)
拼湊出更新數據的SQL語句
打開數據庫連接
執行這條拼湊的SQL語句
關閉數據庫連接
請問哪一種效率更高?大概能高出多少?
另外,在ASP.NET 2.0中,有SqlBulkCopy類,它能完全取代普通的ADO.NET操作嗎?
测试代码:
表:
CREATE TABLE [dbo].[TestTable](
[ID] [int] NULL,
[CreateDateTime] [datetime] NULL,
[TestMethod] [nvarchar](50) NULL
) ON [PRIMARY]
C#代码
using System; using System.Text; using System.Data; using System.Data.SqlClient; namespace InsertEfficiency { class Program { static void Main(string[] args) { //构造数据源 DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("ID",typeof(int))); dt.Columns.Add(new DataColumn("CreateDateTime",typeof(DateTime))); dt.Columns.Add(new DataColumn("TestMethod", typeof(string))); for (int i = 1; i <= 30; i++) { dt.Rows.Add(new object[] { i, DateTime.Now, "ExecuteSqlBulkCopy" }); } Test t = new Test(); DateTime begin1 = DateTime.Now; t.ExecuteRowByRow(dt); DateTime end1 = DateTime.Now; Console.WriteLine("ExecuteRowByRow:{0}ms", (end1 - begin1).Milliseconds); DateTime begin2 = DateTime.Now; t.ExecuteOnce(dt); DateTime end2 = DateTime.Now; Console.WriteLine("ExecuteOnce:{0}ms", (end2 - begin2).Milliseconds); DateTime begin3 = DateTime.Now; t.ExecuteSqlBulkCopy(dt); DateTime end3 = DateTime.Now; Console.WriteLine("ExecuteSqlBulkCopy:{0}ms", (end3 - begin3).Milliseconds); Console.ReadLine(); } } class Test { public Test() { } public void ExecuteRowByRow(DataTable dt) { using(SqlConnection conn = new SqlConnection(GetConnectionString)) { conn.Open(); for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++) { DataRow dr = dt.Rows[rowIndex]; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = string.Format("insert into TestTable values ({0},'{1}','{2}')", dr[0].ToString(), dr[1].ToString(), "ExecuteRowByRow"); cmd.ExecuteNonQuery(); } } } public void ExecuteOnce(DataTable dt) { StringBuilder strSql = new StringBuilder(); for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++) { DataRow dr = dt.Rows[rowIndex]; string sql = string.Format("insert into TestTable values ({0},'{1}','{2}')", dr[0].ToString(), dr[1].ToString(), "ExecuteOnce"); if (strSql.ToString().Length == 0) { strSql.Append(sql); } else { strSql.Append(";").Append(sql); } } using (SqlConnection conn = new SqlConnection(GetConnectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = strSql.ToString(); cmd.ExecuteNonQuery(); } } public void ExecuteSqlBulkCopy(DataTable dt) { using (SqlConnection conn = new SqlConnection(GetConnectionString)) { SqlBulkCopy bulk = new SqlBulkCopy(conn); bulk.DestinationTableName = "TestTable"; bulk.BatchSize = dt.Rows.Count; if (dt != null && dt.Rows.Count != 0) { conn.Open(); bulk.WriteToServer(dt); } bulk.Close(); } } string GetConnectionString { get { return @"server=./mssqlserver2008;database=test;uid=sa;pwd=123456"; } } } }
测试结果:
第一次执行ExecuteRowByRow:151msExecuteOnce:19msExecuteSqlBulkCopy:5ms
第二次执行ExecuteRowByRow:140msExecuteOnce:15msExecuteSqlBulkCopy:6ms
第三次执行ExecuteRowByRow:179msExecuteOnce:18msExecuteSqlBulkCopy:5ms
虽然测试方法比较简单,但基本能说明问题了。
相关文章推荐
- C#:30行数据插入到数据库中的效率测试-一行行执行、构造SQL一次执行、SqlBulkCopy
- c#向数据库插入较大数据(SqlBulkCopy)
- 大数据批量插入数据库使用(SqlBulkCopy )效率更高
- C# 数据批量插入到数据库SqlBulkCopy(源数据类型:List<T> Or DataTable)
- 海量数据插入数据库效率对比测试 ---ADO.NET下SqlBulkCopy()对比LINQ 下InsertAllOnSubmit()
- C# SqlBulkCopy实现大数据插入数据库
- c# 数据库批量插入数据SqlBulkCopy 示例
- C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)
- 批量插入数据 C# SqlBulkCopy使用(当插入超过1000行用)
- c#批量插入数据 C# SqlBulkCopy使用
- 使用SqlBulkCopy将DataTable中的数据批量插入数据库中
- C# 用SqlBulkCopy 批量插入oracle数据 遇到了 ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效
- SqlBulkCopy实现大容量数据快速插入数据库中
- C#:用SqlBulkCopy来实现批量插入数据
- C# 使用 SqlBulkCopy 类批量复制数据到数据库
- SqlBulkCopy 数据库批量插入数据
- 利用SqlBulkCopy一次性把Table数据插入到数据库
- 批量插入数据 C# SqlBulkCopy使用
- 批量插入数据 C# SqlBulkCopy使用
- C# 使用 SqlBulkCopy 类批量复制数据到数据库