最近下载了点资料,学了学Android,发现Android入门还算简单,从.NET过渡到Android,也就三七十一天的事。

大伙有空也可以学学。。。

好了,言归正文,那日,有网友发了一个他们公司的数据层框架的DLL,让我审视(Reflector查看如下):

炸一看框架,支持的数据库种类繁多,看来写框架的人涉及面还挺广的。

往里一看,比较悲催,有广度而无深度,另外数据库种类的dll需要提前引用,那是相当浩大的数据库工程:

框架具体就不过多点评了,在不经意思间,本人看到有一个闪光点,觉的可以和大伙分享分享:

1:检测某列是否存在:

2:检测某表是否存在: 

这是一条判断某字段列和某表是否存在的方法,此处用了select X from table的方式,然后调用了GetSingle(sql)。

而 GetSingle的代码如下:

代码里,关于ADO.net的相关对象没提升到全局变量以重用这个不是讲的重点,就先忽略先,今天分享的知识点是ExecuteScalar:

对于ADO.NET的Command命令,有三个方法,大伙很熟悉:

:ExecuteDataReader,返回数据流,用于列表读取。
:ExecuteScalar,返回首行首列。
:ExecuteNonQuery,返回首影响的行。

解说:

如果我们从语义上讲,用ExecuteScalar执行一条select * from table,只返回首行首列,看似还过的去,然实际不然。
实际上,后面的ExecuteScalar,或是ExecuteNonQuery,内部都是调用的ExecuteDataReader来处理的,见如下代码即知:

说明分析:

微软并没有什么特殊照顾,所以原来的语句,仍会到数据库里,按语句的要求,并找出全部满足条件的数据流进行返回。
当然,值的欣慰的是,DataReader是一个流数据传输,它并不是一次性传输所有数据,而是部分段传输。

中间我做了一个小测试,大体过程是这样的:

使用DataReader去读取数据返回一个SqlDataReader,然后断点,接着把数据库服务给停了,然后继续调试,发现数据还可以正常读取。
说明还未读取之时,部分数据就先通过管道把数据从数据库传输到程序的内存中了,后来按F5继续,读取后面就会抛进程管道已关闭的错误。

总结:

本文说明两点使用方法上的两点:

: 本来是Top  的语句,结果变成Select *,这两条语句在数据库端执行,性能的差异不说大伙也懂了。
: ExecuteScalar虽然是返回首行首列,但实际返回的是个DataReader,如果你查询的是列表,实际上内存传输了列表,只是最终你程序读取了列表中的第一个字节。
当然了,由于流的传输,并不一次性传输全部,只是部分段传输,所以性能的损失并不是太明显。 

要写好底层框架,任重而道远,望大伙再接再励。 

框架设计之ADO.NET Command的ExecuteScalar误用情景及底层解说的更多相关文章

  1. 游戏框架设计中的。绑定binding。。。命令 command 和消息message 以及MVVM

    游戏框架设计中的.绑定binding...命令 command 和消息message

  2. Linux设备驱动框架设计

    引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码.能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Li ...

  3. 【ASP.NET Core快速入门】(六)配置的热更新、配置的框架设计

    配置的热更新 什么是热更新:一般来说,我们创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOptions改成IOptionsSnap ...

  4. 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计

    配置的热更新 什么是热更新:这个词听着有点熟悉,但到底是什么呢? 一般来说:创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOpti ...

  5. Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF

    Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF Entity FrameWork的特点 1.支持多种数据库(MSSQL.Oracle.M ...

  6. .NET CORE 2.0小白笔记(五):配置的热更新、配置的框架设计

    配置的热更新 什么是热更新:一般来说,我们创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOptions改成IOptionsSnap ...

  7. 基于WPF系统框架设计(3)-Fluent Ribbon界面布局

    一个系统框架除了功能菜单导航,有系统内容显示区域,系统状态栏. Silver: Blue: Black: 系统界面设计,就不进行技术细节介绍了,主题以框架设计为主,Xaml源码参考: <Flue ...

  8. 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)

    AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...

  9. 基于WPF系统框架设计(4)-Ribbon整合Avalondock 2.0实现多文档界面设计(一)

    前些时间研究了WPF的一些框架,感觉基于Prism框架的MVVM模式对系统的UI与逻辑分离很好,所以就按照之前Winform的框架设计,用WPF做了一套,感觉比Winform要强很多. MVVM模式和 ...

随机推荐

  1. Android 常用代码

    1.单元测试 然而可以直接建立单元测试 <uses-library android:name="android.test.runner"/> 放在application ...

  2. Project Euler欧拉计划

    1 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. Th ...

  3. swift 单独部署,开发

    部署环境 virtualBox Ubuntu 14.04 desktop OpenStack Swift (kilo) 说明 此文档为基于官方修改的只针对Ubuntu 14.04,完整的参阅官方文档 ...

  4. Servlet读取Excel标准化数据库过程记录

    完成数据库的连接 获取连接参数 拷贝1.数据库URL 2.驱动程序类 3.用户 编写Servlet 1.创建连接对象 Connection con = null; PreparedStatement ...

  5. 主机信息收集工具DMitry

    主机信息收集工具DMitry   DMitry是Kali Linux内置的一款信息收集工具.它的目标主要是Web类主机.它不仅通过主动查询.端口扫描方式,还借助第三方网站和搜索引擎获取信息. 它搜集的 ...

  6. npm淘宝镜像cnpm

    npm install -g cnpm --registry=https://registry.npm.taobao.org

  7. 添加ssh key

    我现在根据<github入门和实践>来去摸索github 其实,我发现自己在看github时,感觉不适应,是因为自己太久没有碰到英文了.可以联想到以前当看到一个网页,根据汉字的标题或描述, ...

  8. Visual Studio 常用快捷键

    作为一个使用VisualStudio的程序员,使用快捷键会为你的开发提供助力. 下附个人开发过程中感觉比较实用的快捷键: 开始运行"devenv",启动相应版本的VisualStu ...

  9. Codeforces Round #259 (Div. 2)

    A. Little Pony and Crystal Mine 水题,每行D的个数为1,3.......n-2,n,n-2,.....3,1,然后打印即可 #include <iostream& ...

  10. 【JBOSS】控制台数据库连接信息

    数据库连接 信息 进入         在这个页面中(IP和端口已自己的为主):ConnectionCount 这个项目代表在服务开启后,总共使用的连接数!ConnectionCreatedCount ...