一、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. ci总结

    1.创建模型,在模型中加载$this->load->database();2.在模型中写入想实现的功能方法3.在控制器中加载辅助函数和模型,$this->load->model ...

  2. csdn第三名

    编号:1026时间:22016年7月18日11:10:35功能:csdn第三名URL :http://blog.csdn.net/phphot

  3. 一个js对象的代码结构

    初步理解的js里一个对象的写法: GameLayer   GameLayer.js   var GameLayer = cc.Layer.extend({   //私有属性(带下划线"_&q ...

  4. hexo git配置问题笔记

    本地安装hexo步骤 注意:本节教程只针对Windows用户,Linux和Mac用户请移步hexo安装. 安装Git 下载 msysgit 并执行即可完成安装. 安装Node.js 在 Windows ...

  5. easyui accordion—手风琴格子始终展开和多个格子展开

    来源:http://www.cnblogs.com/tylerdonet/p/3531844.html 始终打开有时候可能会很管用,其实就是一个设置问题.这里就不再介绍引用的资源了,这里只看看html ...

  6. 下载abap 源代码

    转自http://blog.sina.com.cn/s/blog_4d1570de0100pvhd.html *@------------------------------------------- ...

  7. C++ Primer : 第十二章 : 动态内存之unique_ptr和weak_ptr

    unique_ptr 一个unique_ptr拥有它所管理的对象,与shared_ptr不同,unique_ptr指向的对象只能有一个用户.当unique_ptr被销毁后,它所指向的对象也被销毁. 定 ...

  8. c 深度剖析 4

    1 预处理 1#define 1.不能用 #define 定义注释,因为注释先于预处理被处理. 2 .宏定义表达式 1,注意展开后结合顺序,尽量多加括号 2,常量定义时注意是否溢出 1 #define ...

  9. hdu1158 dp经典题

    题意:已知雇佣员工花费(h).解雇员工花费(f).员工每月薪水(s),员工未被解雇的话即使未工作也要付薪水,现知道每个月需要几名员工,求最低花费. 很显然,刷 DP 专题的我早早地就意识到这是一道 D ...

  10. CentOS下添加新硬盘

    1.查看新硬盘     #fdisk –l      新添加的硬盘的编号为/dev/sdb 2.硬盘分区     1)进入fdisk模式 #/sbin/fdisk  /dev/sdb 2)输入n进行分 ...