码迷,mamicode.com
首页 > Web开发 > 详细

我与ADO.NET二三事(2)

时间:2015-10-22 23:48:54      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:

继上篇开始,这里主要再次精简.因为大家已经熟悉了主要思想以及它的工作方式.那么这里提供的案例改动会很大.上篇的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 }
View Code

相信大家对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 }
View Code

以后所有的接口执行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 }
View Code
技术分享
 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 }
View Code

按照规定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 = 0; _RowIndex < _Dt.Rows.Count; _RowIndex++)
5 {
6     Console.WriteLine("ID:{0}\tName:{1}", _Dt.Rows[_RowIndex]["ID"], _Dt.Rows[_RowIndex]["Name"]);
7 }
View Code

 

案例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 = 0; _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 }    
View Code

 

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

 

我与ADO.NET二三事(2)

标签:

原文地址:http://www.cnblogs.com/blakebook/p/4903116.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!