继上篇开始,这里主要再次精简.因为大家已经熟悉了主要思想以及它的工作方式.那么这里提供的案例改动会很大.上篇的DatabaseCommand***均是为了大家能够轻松的理解所临时编写的.这次提供的接口会有很大变动,以及会有一些新的内容,比如执行Reader是修改的Connection状态,同时不上没有提供异步功能的案例.我将一步一步的带领大家走入.

1.NoCountModel

  1. public enum NoCountModel
  2. {
  3. /// <summary>
  4. /// 默认当前连接的状态
  5. /// </summary>
  6. None,
  7. /// <summary>
  8. /// 不返回受影响行计数
  9. /// 对于在连接打开时执行的任何后续命令,连接状态不会被修改.
  10. /// </summary>
  11. ON,
  12. /// <summary>
  13. /// 返回受影响行计数
  14. /// 如果要确保某个命令不修改所有后续命令的连接,建议您在命令中包括用于重置连接状态的命令
  15. /// 建议您使用 ExecuteNonQuery时来执行该命令
  16. /// </summary>
  17. ON_AND_OFF
  18. }

相信大家对NoCountModel这个枚举的功能可以猜出一二.None模式默认的,它完全按ADO.NET默认的操作来处理Connection等等.ON模式表示不接受处理受影响的返回值.很多时候我在处理数据库数据是并不需要SQL SERVER 告诉我们受影响结果.那么体现在代码里面,经常看到方法返回值类型是Void类型.这个对于SQL SERVER来做毫无干系的.因此我们可以通过ON模式来控制,这个模式我经常倾向于频繁使用ExecuteNonQuery.ON_AND_OFF模式倾向用于ExecuteReader.这些模式主要注意.Net Framework版本.我记得好像是1.1版本亦或是2.0版本默认是ON.但并没有执行OFF.下面是各个模式生成的对应SQL SERVER的命令.这些模式使用得当可以得到性能上的提升.

1.1 ON -> SET NOCOUNT ON;

1.2 OFF -> SET NOCOUNT OFF;

2.SqlText

  1. public sealed class SqlText
  2. {
  3. public SqlText(string argument_SqlString, NoCountModel argument_NoCount = NoCountModel.None)
  4. {
  5. this.SqlString = argument_SqlString;
  6. this.NoCount = argument_NoCount;
  7. }
  8.  
  9. public string SqlString { get; set; }
  10. public NoCountModel NoCount { get; set; }
  11.  
  12. public StringBuilder Builder()
  13. {
  14. StringBuilder _Builder = new StringBuilder();
  15. switch (this.NoCount)
  16. {
  17. case NoCountModel.None:
  18. _Builder.AppendLine(this.SqlString);
  19. break;
  20. case NoCountModel.ON:
  21. _Builder.AppendLine("SET NOCOUNT ON;");
  22. _Builder.AppendLine(this.SqlString);
  23. break;
  24. case NoCountModel.ON_AND_OFF:
  25. _Builder.AppendLine("SET NOCOUNT ON;");
  26. _Builder.AppendLine(this.SqlString);
  27. _Builder.AppendLine("SET NOCOUNT OFF;");
  28. break;
  29. }
  30.  
  31. return _Builder;
  32. }
  33. }

以后所有的接口执行SQL都会调用Builder方法.

  1. public interface IDatabaseCommandTextAsyncProvide
  2. {
  3. string CommandName { get; set; }
  4. DatabaseConnection Connection { get; }
  5. DbParameter NewParameter();
  6. DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction);
  7. Task<OperationValue> Reader(SqlText argument_SqlText, DbParameter[] argument_Parameters);
  8. Task<OperationValue> ExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
  9. Task<OperationValue> TExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
  10. Task<OperationValue> ExecuteNonQuery(SqlText argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
  11. }
  1. public interface IDatabaseCommandTextProvide
  2. {
  3. string CommandName { get; set; }
  4. DatabaseConnection Connection { get; }
  5. DbParameter NewParameter();
  6. DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction);
  7. OperationValue Reader(SqlText argument_SqlText, DbParameter[] argument_Parameters);
  8. OperationValue ExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
  9. OperationValue TExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
  10. OperationValue ExecuteNonQuery(SqlText argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
  11. }

按照规定T开头的表示自己内部实现了事物.带有事物参数的表示有外部控制事物处理,但出现了异常就会不会由外部处理,而是内部自己去执行事务回滚操作.具体的实现方式可以参考上期文章.

案例1:

  1. IDatabaseCommandTextProvide _Command = new DatabaseCommandText(new DatabaseConnection(new Database()));
  2. OperationValue _Value = _Command.Reader(new SqlText("SELECT * FROM DatabaseUser", NoCountModel.ON_AND_OFF), null);
  3. DataTable _Dt = _Value.Value as DataTable;
  4. for (int _RowIndex = ; _RowIndex < _Dt.Rows.Count; _RowIndex++)
  5. {
  6. Console.WriteLine("ID:{0}\tName:{1}", _Dt.Rows[_RowIndex]["ID"], _Dt.Rows[_RowIndex]["Name"]);
  7. }

案例2:

  1. public static async Task<OperationValue> WriteData()
  2. {
  3. IDatabaseCommandTextAsyncProvide _Command = new DatabaseCommandTextAsync(new DatabaseConnection(new Database()));
  4. return await _Command.Reader(new SqlText("SELECT * FROM DatabaseUser", NoCountModel.ON_AND_OFF), null);
  5. }
  6.  
  7. public class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. DataTable _Dt = WriteData().GetAwaiter().GetResult().Value as DataTable;
  12. for (int _RowIndex = ; _RowIndex < _Dt.Rows.Count; _RowIndex++)
  13. {
  14. Console.WriteLine("ID:{0}\tName:{1}", _Dt.Rows[_RowIndex]["ID"], _Dt.Rows[_RowIndex]["Name"]);
  15. }
  16.  
  17. Console.ReadLine();
  18. }

以上就这些,可能大家觉得这期变化会有些大.其实任何设计好的,编写好的,都在不断在变化,我个人觉得,一个公司的框架二年之内没有质的变化是件挺恐怖的事情。后期提供的案例,这些还会有些变化,会一点点带给大家,让大家感受到我使用的这个模块是如何一点点演进的。

我与ADO.NET二三事(2)的更多相关文章

  1. 我与ADO.NET二三事

      天气渐冷,闲来无事就把业余时间自己使用的数据访问库凉一凉.这个库本人自己使用了2年多,主要用于个人学习时需要操作数据库时使用,非组织和商业性质的使用.记得上学的时候,在网络上看到SqlServer ...

  2. Java并发编程二三事

    Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...

  3. linux杂记(十二?) 关于账号和密码的二三事

    关于密码的二三事 关于账号和密码的二三事 久了不更linux的相关知识,实在是懒得想内容点(纯粹是懒).那么今天就来谈谈关于linux密码和账号的重要概念. 假如你的主机遭到入侵,那么对方的第一个侵入 ...

  4. MySQL5.7关于密码二三事

    MySQL5.7关于密码二三事 第一个:update user set password=password('root') where user='root' and host='localhost' ...

  5. Java中的匿名内部类及内部类的二三事

    匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...

  6. Emacs 启动优化二三事

    Emacs 启动优化二三事 */--> div.org-src-container { font-size: 85%; font-family: monospace; } p {font-siz ...

  7. WinForm二三事(三)Control.Invoke&Control.BeginInvoke

    http://www.cnblogs.com/yuyijq/archive/2010/01/11/1643802.html 这个系列从2009年写到2010年,差点又成太监文.随着WPF/Silver ...

  8. iOS7下滑动返回与ScrollView共存二三事

    [转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用 ...

  9. 一只代码小白git托管路上的二三事

    [经验]一只代码小白git托管路上的二三事 写在前面的话 寒假的时候,娄老师给我们布置了代码托管的作业,并要求把托管地址发给学委.因假期的时候没有带电脑回家,所以只是在手机上草草注册了,也稀里糊涂就将 ...

随机推荐

  1. 替代jquery1.9版本以前的toggle事件函数(开关)

    以上文章为转载自http://blog.sina.com.cn/s/blog_50042fab0101c7a9.html var flag=1; $(".selector").cl ...

  2. Trace2:创建SQL Trace

    Trace是轻量级的追踪工具,几乎对系统没有任何副作用,开启Trace,经常能够帮助DBA追踪到一些非常有用的信息.Trace出现的比较早,MS推出更强大的Extended Events来取代Trac ...

  3. OPEN CASCADE Multiple Variable Function

    OPEN CASCADE Multiple Variable Function eryar@163.com Abstract. Multiple variable function with grad ...

  4. WindowsError的错误代码详解

    0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. 4系统无法打开文件. 5拒绝访问. 6句柄无效. 7存储控制块被损坏. 8存储空间不足,无法处理此命令. 9存储控制 ...

  5. 页面loading效果

    当网页太大,打开太慢的时候,为了增加良好的用户体验(不让用户眼巴巴的等,心中暗骂c,这么慢),我们需要加一个等待动画. 只需把以下代码加入页面中即可,图片可以根据自己的需求更换,更换图片之后需要改变l ...

  6. 前端学PHP之面向对象系列第四篇——关键字

    × 目录 [1]public [2]protected [3]private[4]final[5]static[6]const[7]this[8]self[9]parent 前面的话 php实现面向对 ...

  7. Android标题栏最右边添加按钮

    step1:重写activity的onCreateOptionsMenu方法 @Override public boolean onCreateOptionsMenu(Menu menu){ Menu ...

  8. 出操队形(LIS)

    题目来源:微策略2013年校园招聘面试一面试题 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往楼下跑了,然后身高矮的排在队伍的前面,身高较 ...

  9. YII 的源码分析(-)

    做为源码分析的首秀,我就挑了yii(读作歪依依而不是歪爱爱):它的赞美之词我就不多说了,直接入正题.先准备材料,建议直从官网下载yii的源码包(1.1.15). 在demos里边有一个最简单的应用—h ...

  10. 修改ibdata1大小的验证以及如何使用mysqld_multi管理多实例

    修改ibdata1大小的验证 ibdata是共享表空间,在MySQL初始化的时候就生成了. 但很多童鞋会看到网上各种大神的调优建议,在MySQL已经初始化的情况下,修改配置文件中innodb_data ...