测试SqlHelp,linq to SQL,Nhibernate批量处理数据的效率 2009-06-07

181 篇文章 3 订阅
31 篇文章 0 订阅

 

(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读取数据最慢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值