测试SqlHelp,linq to SQL,Nhibernate批量处理数据的效率 2009-06-07
(SqlHelp是一个操作数据库的辅助类,linq to SQL,Nhibernate,是数据持久化框架, linq to SQ只适合MS SQL,Nhibernate适合多种数据源)
数据的准备:
示例数据库: AdventureWorks
产生测试数据的脚本:
Code
--从[Person].[Address]把数据复制到新表[Address1]中
select into [Address1] from [AdventureWorks].[Person].[Address]
--从[Person].[Address]数据复制到[Address1]表,多次执行可产生更多数据
INSERT INTO [AdventureWorks].[dbo].[Address1]
([AddressLine1]
,[AddressLine2]
,[City]
,[StateProvinceID]
,[PostalCode]
,[rowguid]
,[ModifiedDate])
SELECT
[AddressLine1]
,[AddressLine2]
,[City]
,[StateProvinceID]
,[PostalCode]
,[rowguid]
,[ModifiedDate]
FROM [AdventureWorks].[Person].[Address]
--删除[Address1]数据
delete from [AdventureWorks].[dbo].[Address1]
--查询数据
select * from [dbo].[Address1]
测试代码:
Code
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using Microsoft.ApplicationBlocks.Data;
using System.Diagnostics;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq.Dynamic;
using NHibernate;
using NHibernate.Cfg;
using System.Data.Common;
namespace ConTestData
{
class Program
{
static void Main(string[] args)
{
TestSqlHelp();
TestLinq();
TestNhibernate();
Console.Read();
}
/// <summary>
/// 测试SqlHelp的方法
/// </summary>
static void TestSqlHelp()
{
Console.WriteLine("SqlHelp 操作数据!");
Stopwatch wacth = new Stopwatch();
string conString = ConfigurationManager.ConnectionStrings["AdventureWorksConnectionString"].ConnectionString;
string selectCmm = " select * from Address1 ";
DataSet ds = new DataSet();
DataTable address = new DataTable();
wacth.Start();
Console.WriteLine("开始取数据");
ds= SqlHelper.ExecuteDataset(conString,CommandType.Text,selectCmm);
address = ds.Tables[0];
Console.WriteLine("取数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Rows.Count);
Console.WriteLine("开始取改变实体的值");
wacth.Reset();
wacth.Start();
foreach (DataRow a in address.Rows)
{
a["AddressLine1"] = a["AddressLine1"] + "1";
a["AddressLine2"] = a["AddressLine2"] + "1";
a["City"] = a["City"] + "1";
a["ModifiedDate"] =((DateTime)a["ModifiedDate"]).AddDays(1);
}
Console.WriteLine("改变实体值完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Rows.Count);
wacth.Reset();
wacth.Start();
SqlConnection con = new SqlConnection(conString);
SqlDataAdapter sqlDA = new SqlDataAdapter(selectCmm,con);
SqlCommandBuilder bd= new SqlCommandBuilder(sqlDA);
SqlCommand up = bd.GetUpdateCommand();
Console.WriteLine("开始取更新数据");
SqlHelper.UpdateDataset(bd.GetInsertCommand(), bd.GetDeleteCommand(), up, ds, ds.Tables[0].TableName);
Console.WriteLine("更新数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Rows.Count);
DataSet addressCopy = SqlHelper.ExecuteDataset(conString, CommandType.Text, selectCmm);
wacth.Reset();
wacth.Start();
foreach (DataRow a in address.Rows)
{
a.Delete();
}
Console.WriteLine("开始取删除数据");
SqlHelper.UpdateDataset(bd.GetInsertCommand(), bd.GetDeleteCommand(), up, ds, ds.Tables[0].TableName);
Console.WriteLine("删除数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, addressCopy.Tables[0].Rows.Count);
wacth.Reset();
wacth.Start();
foreach (DataRow a in addressCopy.Tables[0].Rows)
{
a.SetAdded();
}
Console.WriteLine("开始添加新数据");
SqlHelper.UpdateDataset(bd.GetInsertCommand(), bd.GetDeleteCommand(), up, addressCopy, addressCopy.Tables[0].TableName);
Console.WriteLine("添加数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, addressCopy.Tables[0].Rows.Count);
}
/// <summary>
/// 测试Linq的方法
/// </summary>
static void TestLinq()
{
Console.WriteLine("Linq to SQL 操作数据!");
Stopwatch wacth = new Stopwatch();
TestLinqDataContext dc = new TestLinqDataContext();
wacth.Start();
Console.WriteLine("开始取数据");
var address = dc.Address1.ToArray();
Console.WriteLine("取数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Length);
Console.WriteLine("开始取改变实体的值");
wacth.Reset();
wacth.Start();
foreach (var a in address)
{
a.AddressLine1 = a.AddressLine1 + "1";
a.AddressLine2 = a.AddressLine2 + "1";
a.City = a.City + "1";
a.ModifiedDate = a.ModifiedDate.AddDays(1);
}
Console.WriteLine("改变实体值完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Length);
wacth.Reset();
wacth.Start();
Console.WriteLine("开始取更新数据");
dc.SubmitChanges();
Console.WriteLine("更新数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Length);
wacth.Reset();
wacth.Start();
foreach (var a in address)
{
dc.Address1.DeleteOnSubmit(a);
}
int count = address.Length;
Console.WriteLine("开始删除数据");
dc.SubmitChanges();
Console.WriteLine("删除数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, count);
TestLinqDataContext dcAdd = new TestLinqDataContext();
wacth.Reset();
wacth.Start();
foreach (var a in address)
{
dcAdd.Address1.InsertOnSubmit(a);
}
Console.WriteLine("开始添加数据");
dcAdd.SubmitChanges();
Console.WriteLine("添加数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Length);
}
/// <summary>
/// 测试Nhibernate的方法
/// </summary>
static void TestNhibernate()
{
Console.WriteLine("Nhibernate 操作数据!");
Stopwatch wacth = new Stopwatch();
string strSelect = " select * from Address1 ";
NHibernate.Cfg.Configuration config = new NHibernate.Cfg.Configuration();
config.Configure(@"D:\MyProject\ConTestData\ConTestData\ConTestData\App.config");
config.AddAssembly(typeof(Address1N).Assembly);
config.AddXmlFile(@"D:\MyProject\ConTestData\ConTestData\ConTestData\Adress1N.hbm.xml");
//config.AddClass(typeof(Address1N));
ISessionFactory isessionFactory = config.BuildSessionFactory();
ISession isession = isessionFactory.OpenSession();
wacth.Start();
Console.WriteLine("开始取数据");
// IList<Address1N> address = isession.CreateCriteria(typeof(Address1N)).List<Address1N>();
IList<Address1N> address = isession.CreateSQLQuery(strSelect).AddEntity(typeof(Address1N)).List<Address1N>();
Console.WriteLine("取数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Count);
Console.WriteLine("开始取改变实体的值");
wacth.Reset();
wacth.Start();
foreach (var a in address)
{
a.AddressLine1 = a.AddressLine1 + "1";
a.AddressLine2 = a.AddressLine2 + "1";
a.City = a.City + "1";
a.ModifiedDate = a.ModifiedDate.AddDays(1);
}
Console.WriteLine("改变实体值完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Count);
wacth.Reset();
wacth.Start();
Console.WriteLine("开始取更新数据");
using(ITransaction tran=isession.Transaction)
{
tran.Begin();
foreach(Address1N a in address)
{
isession.Update(a);
}
tran.Commit();
}
Console.WriteLine("更新数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Count);
wacth.Reset();
wacth.Start();
Console.WriteLine("开始取删除数据");
using (ITransaction tran = isession.Transaction)
{
tran.Begin();
foreach (Address1N a in address)
{
isession.Delete(a);
}
tran.Commit();
}
Console.WriteLine("删除数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Count);
wacth.Reset();
wacth.Start();
Console.WriteLine("开始取添加数据");
using (ITransaction tran = isession.Transaction)
{
tran.Begin();
foreach (Address1N a in address)
{
isession.Save(a);
}
tran.Commit();
}
Console.WriteLine("添加数据完成用时为{0}毫秒!一共{1}条数据", wacth.ElapsedMilliseconds, address.Count);
}
}
}
测试解决方案的下载
测试显示结果:
操作数据为117684条;显示结果表进:Linq to SQL 读取数据最快,但更新数据\删除数据\添加数据性速度是最慢的。
Nhibernate读取数据最慢。
测试SqlHelp,linq to SQL,Nhibernate批量处理数据的效率 2009-06-07相关推荐
- SQL Server 批量插入数据方案 SqlBulkCopy 的简单封装,让批量插入更方便
在线工具 一.Sql Server插入方案介绍 关于 SqlServer 批量插入的方式,有三种比较常用的插入方式,Insert.BatchInsert.SqlBulkCopy,下面我们对比以下三种方 ...
- mvc mysql linq_MVC3+Linq to sql 显示数据库中数据表的数据
1:首先创建asp.net mvc3应用程序 2:创建项目完成后 找到controllers文件鼠标右击选择添加控制器 3 为models文件夹添加一个linq to sql类文件,然后把数据库中的数 ...
- sql中批量删除数据
dao层: xml 注意:发现根据id批量删除数据的时候不设置index属性也是可以的 当批量插入的时候那个时候是一个对象那个时候旧需要设置index属性了
- SQL Server 批量插入数据的两种方法(转)
原文:http://blog.csdn.net/tjvictor/article/details/4360030 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数 ...
- 【转载】SQL Server 批量插入数据的两种方法
在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...
- SqlServer中通过Sql语句批量删除数据表
业务描述: 我们在实际生产中,有时候可能会需要批量删除数据库中的某些数据表(比如:在导数据时,需要将数据库A中的某些表数据导入到数据库B中,导入的过程中也需要将数据库A的某些表结构也需要导过去,当数据 ...
- sql中批量插入数据用法
单次插入数据方法 INSERT INTO 表名(字段1,字段2,字段3)VALUES(第一个值,第二个值,第三个值) 多次插入方法 第一种 INSERT INTO 表名(字段1,字段2,字段3) VA ...
- SQL Server批量插入数据
有这样一个表[OperatorInfo],字段有[OPERATOR_NO],[OPERATOR_PWD],[OPERATOR_NAME],[GROUP_ID],[GROUP_NO],[SKILL_LE ...
- 浅谈LINQ to SQL集成数据库语言优劣
Linq To SQL是Microsoft开发的针对解决data!=object问题的新技术.在笔者的一系列的文章中,对它已经做了大量的介绍.现在,笔者将从经验的角度,谈谈它的优劣. 1.LINQ t ...
最新文章
- 同济大学计算机云南2019,同济大学录取分数线2019(在各省市录取数据)
- 如何实现android和服务器长连接呢?推送消息的原理
- 我的工作日志 - 2020年11月11日星期三 阴
- ipad分屏_iPad如何分屏及常见问题
- c#导出Excel及操作
- 纯javaweb项目整合quarz定时器
- /etc/resolv.conf
- 如何在 Flink 1.9 中使用 Hive?
- 谈谈博客园和写博客,以及通过博客遇到的那些人
- iTextSharp 显示中文字体
- ERP系统-应收应付子系统-付款单
- 数据结构练习题——线性表(二)
- wireshark中筛选中文内容
- (基础)Promise中then()方法使用,多次调用、链式调用
- R3LIVE代码详解(一)
- windows基本命令
- MacBookPro 2015电池召回
- 【noip模拟赛5】细菌
- 工具使用 - IDA使用
- Tiny语言编译器简介