一、SqlDataReader和SqlDataAdapter性能对比

  Stopwatch sw = new Stopwatch();
             sw.Start();
             using(SqlConnection cnn = new SqlConnection(@"Data Source=RuyeeSoft\SqlExpress;user id=sa;password=123;Initial catalog=NorthWind"))
             {
                 SqlCommand cmd = cnn.CreateCommand();
                 cmd.CommandText = "select top(2000000) * from student";
                 cnn.Open();
                 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

                 DataTable auto = new DataTable("Auto");

                 DataColumn vin = new DataColumn("ID");
                 vin.DataType = typeof(int);
                 vin.Unique = true;
                 vin.AllowDBNull = false;
                 vin.Caption = "ID";
                 auto.Columns.Add(vin);

                 DataColumn Name = new DataColumn("Name");
                 Name.DataType = typeof(string);
                 Name.MaxLength = ;
                 //Name.Unique = true;
                 Name.AllowDBNull = false;
                 Name.Caption = "Name";
                 auto.Columns.Add(Name);

                 DataColumn score = new DataColumn("score");
                 score.DataType = typeof(int);
                 //score.Unique = true;
                 score.AllowDBNull = false;
                 score.Caption = "score";
                 auto.Columns.Add(score);

                 while (rdr.Read())
                 {
                     DataRow newAuto = auto.NewRow();
                     newAuto[);
                     newAuto[);
                     newAuto[);
                     auto.Rows.Add(newAuto);
                 }
             }
             sw.Stop();
             Console.WriteLine("1总运行时间:" + sw.Elapsed);

             sw.Start();
             using (SqlConnection cnn = new SqlConnection(@"Data Source=ruyeesoft\SqlExpress;user id=sa;password=123;Initial catalog=NorthWind"))
             {
                 SqlCommand cmd = cnn.CreateCommand();
                 cmd.CommandText = "select top(2000000) * from student";
                 SqlDataAdapter sda = new SqlDataAdapter(cmd);
                 DataTable dt = new DataTable();
                 cnn.Open();
                 sda.Fill(dt);
             }
             sw.Stop();
             Console.WriteLine("2总运行时间:" + sw.Elapsed);

对比结果

100万条数据的效果
1总运行时间:00:00:11.3748084
2总运行时间:00:00:18.0405345

200万条数据的效果
1总运行时间:00:00:24.1619173
2总运行时间:00:00:37.6120735

二、使用非连接数据

1、关于并发:

由于不同的客户端拿到了相同版本的副本,修改后都要讲结果保存到数据库中,这时出现了以哪个修改后的副本为最新版本的决策冲突问题。

2、解决并发冲突:

a、时间优先:第一次更新优先。

b、时间优先:最后一次更新优先。

c、角色优先:看获取副本的客户端的权限级别,谁级别高以谁为准。

d、位置优先:如总部优先与分店。

e、用户解决冲突:提供一个解决冲突界面,让用户选择数据的版本。如tfs的版本冲突解决策略。

3、应该加载什么离线数据

a、数据选择:应该只加载用户需要处理的数据,而不是加载整个数据库。

b、数据量:数量量的大小会影响加载的时间、更新的时间和客户的内存需求量。

c、分割数据:根据业务的使用目的,最好将数据分割成多个部分,并分别存入相应的DataSet对象中。不能在不同的DataSet对象的DataTable对象之间建立外键约束。

4、为了更好的使用离线数据,请使用GUID作为数据库的主键。

ADO.NET 拾遗的更多相关文章

  1. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  2. .NET基础拾遗(8)ADO.NET与数据库开发基础

    1.1 ADO.NET支持哪几种数据源? ① System.Data.SqlClient .NET程序员最常用的了.通过OLEDB或者ODBC都可以访问,但是SqlClient下的组件直接针对MSSQ ...

  3. Ado.Net基础拾遗二:插入,更新,删除数据

    插入数据 public void InsertDataToSQL() { string conStr = ConfigurationManager.ConnectionStrings["No ...

  4. Ado.Net基础拾遗一:读取数据

    从数据库中读取数据: 使用DataReader对象从数据库中读取数据 首先需要添加几个命名空间 //需要添加的命名空间 using System.Configuration; using System ...

  5. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  6. ADO.NET对象的详解

    1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...

  7. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体

    最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...

  8. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

  9. ADO.NET一小记-select top 参数问题

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 最近使用ADO.NET的时候,发现select top @count xxxx 不 ...

随机推荐

  1. KSM剖析——Linux 内核中的内存去耦合

    简介: 作为一个系统管理程序(hypervisor),Linux® 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging)  允许这个系统管理程序通 ...

  2. Spring AOP配置文件

    在<aop:config>...</aop:config>报错: Multiple annotations found at this line: - cvc-complex- ...

  3. 转载:LBP的初步理解

    转自http://blog.csdn.net/ty101/article/details/8905394 本文的PDF版本,以及涉及到的所有文献和代码可以到下列地址下载: 1.PDF版本以及文献:ht ...

  4. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) G 优先队列

    G. Car Repair Shop time limit per test 2 seconds memory limit per test 512 megabytes input standard ...

  5. C++ Primer : 第九章 : 顺序容器的定义、迭代器以及赋值与swap

    顺序容器属于C++ STL的一部分,也是非常重要的一部分. 顺序容器包括: std::vector,包含在头文件<vector>中 std::string, 包含在头文件<strin ...

  6. 【渗透测试学习平台】 web for pentester -2.SQL注入

    Example 1 字符类型的注入,无过滤 http://192.168.91.139/sqli/example1.php?name=root http://192.168.91.139/sqli/e ...

  7. SQL注入测试平台 SQLol -6.CHALLENGES挑战

    SQLol上面的挑战共有14关,接下来我们一关一关来突破. Challenge 0 目的是让查询返回所有的用户名,而不是只有一个. SELECT username FROM users WHERE u ...

  8. codevs 1704 卡片游戏

    题目描述 Description 桌面上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n.当至少还剩两张排时进行一下操作:把第一张牌扔掉,然后把新的第一张牌放到整叠牌的最后.输入n. ...

  9. POJ2284 That Nice Euler Circuit (欧拉公式)(计算几何 线段相交问题)

                                                          That Nice Euler Circuit Time Limit: 3000MS   M ...

  10. python study - 正则表达式

    第 7 章 正则表达式 7.1. 概览 7.2. 个案研究:街道地址 7.3. 个案研究:罗马字母 7.3.1. 校验千位数 7.3.2. 校验百位数 7.4. 使用 {n,m} 语法 7.4.1. ...