(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相关推荐

  1. SQL Server 批量插入数据方案 SqlBulkCopy 的简单封装,让批量插入更方便

    在线工具 一.Sql Server插入方案介绍 关于 SqlServer 批量插入的方式,有三种比较常用的插入方式,Insert.BatchInsert.SqlBulkCopy,下面我们对比以下三种方 ...

  2. mvc mysql linq_MVC3+Linq to sql 显示数据库中数据表的数据

    1:首先创建asp.net mvc3应用程序 2:创建项目完成后 找到controllers文件鼠标右击选择添加控制器 3 为models文件夹添加一个linq to sql类文件,然后把数据库中的数 ...

  3. sql中批量删除数据

    dao层: xml 注意:发现根据id批量删除数据的时候不设置index属性也是可以的 当批量插入的时候那个时候是一个对象那个时候旧需要设置index属性了

  4. SQL Server 批量插入数据的两种方法(转)

    原文:http://blog.csdn.net/tjvictor/article/details/4360030 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数 ...

  5. 【转载】SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...

  6. SqlServer中通过Sql语句批量删除数据表

    业务描述: 我们在实际生产中,有时候可能会需要批量删除数据库中的某些数据表(比如:在导数据时,需要将数据库A中的某些表数据导入到数据库B中,导入的过程中也需要将数据库A的某些表结构也需要导过去,当数据 ...

  7. sql中批量插入数据用法

    单次插入数据方法 INSERT INTO 表名(字段1,字段2,字段3)VALUES(第一个值,第二个值,第三个值) 多次插入方法 第一种 INSERT INTO 表名(字段1,字段2,字段3) VA ...

  8. SQL Server批量插入数据

    有这样一个表[OperatorInfo],字段有[OPERATOR_NO],[OPERATOR_PWD],[OPERATOR_NAME],[GROUP_ID],[GROUP_NO],[SKILL_LE ...

  9. 浅谈LINQ to SQL集成数据库语言优劣

    Linq To SQL是Microsoft开发的针对解决data!=object问题的新技术.在笔者的一系列的文章中,对它已经做了大量的介绍.现在,笔者将从经验的角度,谈谈它的优劣. 1.LINQ t ...

最新文章

  1. 同济大学计算机云南2019,同济大学录取分数线2019(在各省市录取数据)
  2. 如何实现android和服务器长连接呢?推送消息的原理
  3. 我的工作日志 - 2020年11月11日星期三 阴
  4. ipad分屏_iPad如何分屏及常见问题
  5. c#导出Excel及操作
  6. 纯javaweb项目整合quarz定时器
  7. /etc/resolv.conf
  8. 如何在 Flink 1.9 中使用 Hive?
  9. 谈谈博客园和写博客,以及通过博客遇到的那些人
  10. iTextSharp 显示中文字体
  11. ERP系统-应收应付子系统-付款单
  12. 数据结构练习题——线性表(二)
  13. wireshark中筛选中文内容
  14. (基础)Promise中then()方法使用,多次调用、链式调用
  15. R3LIVE代码详解(一)
  16. windows基本命令
  17. MacBookPro 2015电池召回
  18. 【noip模拟赛5】细菌
  19. 工具使用 - IDA使用
  20. Tiny语言编译器简介

热门文章

  1. OO模式-Composite
  2. 时间:2014年3月27日20:08:01网站建表实战与优化意识
  3. 运用Axure6.5快速完成微信交互效果的简单办法
  4. ListView控件的弧形设计
  5. Nginx限制连接数和下载速度
  6. 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 编程指南
  7. 容器编排技术 -- Kubernetes JSONpath Support
  8. Spring JdbcTemplate示例
  9. 七牛云图片--Java文档
  10. Intellij IDEA+Tomcat+JRebel热部署