一、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. Shell字符串截取

    shell中截取字符串的方法有很多中, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...

  2. USB协议-检测设备连接与速度

    在USB设备连接时,USB系统能自动检测到这个连接,并识别出其采用的数据传输速率.USB采用在D+或D-线上增加上拉电阻的方法来识别低速和全速设备. USB支持3种类型的传输速率:1.5Mb/s的低速 ...

  3. Linux启动Apache支持.htaccess伪静态文件方法

    第一.编辑httpd.conf文件 A - 在etc/httpd/conf/目录下的httpd.conf 文件,找到: LoadModule rewrite_module modules/mod_re ...

  4. Linux 安装挂载时注意事项

    Linux系统下使用的是目录树系统,所以安装的时候要规划磁盘分区与目录树的挂载.实际上,在Linux系统安装的时候已经提供了相当多的默认模式让你选择分割的方式了,不过无论如何,分割的结果可能都不是能符 ...

  5. windows下apache及mysql定时自动重启设置

    有时候觉得,服务器运行时间过长,造成服务器内存等压力过大.因此,不用重新启动服务器的情况下,完成apache和mysql的内存释放,是非常有益处的(把重启时间设置在访问量最低的).首先,apache的 ...

  6. UpdatePanel与$.function()同时使用问题

    在.NET中使用了UpdatePanel,里面的输入框使用了jQuery的日历选择器,接下来介绍下两者同时使用的一些细节及问题的解决方法,感兴趣的各位可以参考下哈 今天,在.NET中使用了Update ...

  7. Android拍照保存图片内存大小

    图片拍摄的大小会随着硬件而变化,比如,像素高的相机拍出来的图片要比像素低的图片内存要大. 如此一来,针对机型可能调用camera app保存照片的时候,图片大小会不一样. 为了缩小图片大小,我们需要把 ...

  8. 工作中遇到的问题--JPA 一对多查询

    /**     *  order by gs.updateDate desc          *  SELECT gs FROM GoodStatus gs WHERE gs IN(     * @ ...

  9. JavaWeb学习记录(二十五)——权限管理总结

    一.面向对象思想简化数据库操作 public List<Role> getObjectsByIds(List<AdminRole> adminRoles) {        L ...

  10. 带百分号的数据转json

    今天处理前后数据传输的时候遇到了问题. 前台拼参数是这样写的 '&rowData=' + JSON.stringify(rowData); 后台解析出的对象却总是null,而且没有抛Parse ...