我与ADO.NET二三事(2)
继上篇开始,这里主要再次精简.因为大家已经熟悉了主要思想以及它的工作方式.那么这里提供的案例改动会很大.上篇的DatabaseCommand***均是为了大家能够轻松的理解所临时编写的.这次提供的接口会有很大变动,以及会有一些新的内容,比如执行Reader是修改的Connection状态,同时不上没有提供异步功能的案例.我将一步一步的带领大家走入.
1.NoCountModel
public enum NoCountModel
{
/// <summary>
/// 默认当前连接的状态
/// </summary>
None,
/// <summary>
/// 不返回受影响行计数
/// 对于在连接打开时执行的任何后续命令,连接状态不会被修改.
/// </summary>
ON,
/// <summary>
/// 返回受影响行计数
/// 如果要确保某个命令不修改所有后续命令的连接,建议您在命令中包括用于重置连接状态的命令
/// 建议您使用 ExecuteNonQuery时来执行该命令
/// </summary>
ON_AND_OFF
}
相信大家对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
public sealed class SqlText
{
public SqlText(string argument_SqlString, NoCountModel argument_NoCount = NoCountModel.None)
{
this.SqlString = argument_SqlString;
this.NoCount = argument_NoCount;
} public string SqlString { get; set; }
public NoCountModel NoCount { get; set; } public StringBuilder Builder()
{
StringBuilder _Builder = new StringBuilder();
switch (this.NoCount)
{
case NoCountModel.None:
_Builder.AppendLine(this.SqlString);
break;
case NoCountModel.ON:
_Builder.AppendLine("SET NOCOUNT ON;");
_Builder.AppendLine(this.SqlString);
break;
case NoCountModel.ON_AND_OFF:
_Builder.AppendLine("SET NOCOUNT ON;");
_Builder.AppendLine(this.SqlString);
_Builder.AppendLine("SET NOCOUNT OFF;");
break;
} return _Builder;
}
}
以后所有的接口执行SQL都会调用Builder方法.
public interface IDatabaseCommandTextAsyncProvide
{
string CommandName { get; set; }
DatabaseConnection Connection { get; }
DbParameter NewParameter();
DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction);
Task<OperationValue> Reader(SqlText argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> ExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> TExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> ExecuteNonQuery(SqlText argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
}
public interface IDatabaseCommandTextProvide
{
string CommandName { get; set; }
DatabaseConnection Connection { get; }
DbParameter NewParameter();
DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction);
OperationValue Reader(SqlText argument_SqlText, DbParameter[] argument_Parameters);
OperationValue ExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
OperationValue TExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
OperationValue ExecuteNonQuery(SqlText argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
}
按照规定T开头的表示自己内部实现了事物.带有事物参数的表示有外部控制事物处理,但出现了异常就会不会由外部处理,而是内部自己去执行事务回滚操作.具体的实现方式可以参考上期文章.
案例1:
IDatabaseCommandTextProvide _Command = new DatabaseCommandText(new DatabaseConnection(new Database()));
OperationValue _Value = _Command.Reader(new SqlText("SELECT * FROM DatabaseUser", NoCountModel.ON_AND_OFF), null);
DataTable _Dt = _Value.Value as DataTable;
for (int _RowIndex = ; _RowIndex < _Dt.Rows.Count; _RowIndex++)
{
Console.WriteLine("ID:{0}\tName:{1}", _Dt.Rows[_RowIndex]["ID"], _Dt.Rows[_RowIndex]["Name"]);
}
案例2:
public static async Task<OperationValue> WriteData()
{
IDatabaseCommandTextAsyncProvide _Command = new DatabaseCommandTextAsync(new DatabaseConnection(new Database()));
return await _Command.Reader(new SqlText("SELECT * FROM DatabaseUser", NoCountModel.ON_AND_OFF), null);
} public class Program
{
static void Main(string[] args)
{
DataTable _Dt = WriteData().GetAwaiter().GetResult().Value as DataTable;
for (int _RowIndex = ; _RowIndex < _Dt.Rows.Count; _RowIndex++)
{
Console.WriteLine("ID:{0}\tName:{1}", _Dt.Rows[_RowIndex]["ID"], _Dt.Rows[_RowIndex]["Name"]);
} Console.ReadLine();
}
以上就这些,可能大家觉得这期变化会有些大.其实任何设计好的,编写好的,都在不断在变化,我个人觉得,一个公司的框架二年之内没有质的变化是件挺恐怖的事情。后期提供的案例,这些还会有些变化,会一点点带给大家,让大家感受到我使用的这个模块是如何一点点演进的。
我与ADO.NET二三事(2)的更多相关文章
- 我与ADO.NET二三事
天气渐冷,闲来无事就把业余时间自己使用的数据访问库凉一凉.这个库本人自己使用了2年多,主要用于个人学习时需要操作数据库时使用,非组织和商业性质的使用.记得上学的时候,在网络上看到SqlServer ...
- Java并发编程二三事
Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...
- linux杂记(十二?) 关于账号和密码的二三事
关于密码的二三事 关于账号和密码的二三事 久了不更linux的相关知识,实在是懒得想内容点(纯粹是懒).那么今天就来谈谈关于linux密码和账号的重要概念. 假如你的主机遭到入侵,那么对方的第一个侵入 ...
- MySQL5.7关于密码二三事
MySQL5.7关于密码二三事 第一个:update user set password=password('root') where user='root' and host='localhost' ...
- Java中的匿名内部类及内部类的二三事
匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...
- Emacs 启动优化二三事
Emacs 启动优化二三事 */--> div.org-src-container { font-size: 85%; font-family: monospace; } p {font-siz ...
- WinForm二三事(三)Control.Invoke&Control.BeginInvoke
http://www.cnblogs.com/yuyijq/archive/2010/01/11/1643802.html 这个系列从2009年写到2010年,差点又成太监文.随着WPF/Silver ...
- iOS7下滑动返回与ScrollView共存二三事
[转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用 ...
- 一只代码小白git托管路上的二三事
[经验]一只代码小白git托管路上的二三事 写在前面的话 寒假的时候,娄老师给我们布置了代码托管的作业,并要求把托管地址发给学委.因假期的时候没有带电脑回家,所以只是在手机上草草注册了,也稀里糊涂就将 ...
随机推荐
- 基于Spring Mvc实现的Excel文件上传下载
最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库.因此为了更好的理解公司框架,我就自己先用spring mvc实现了一个样例. 基础框架 之前曾经介绍过一个最简单的spring ...
- 程序中保存状态的方式之Cookies
程序中保存状态的方式之 Cookies,之前写过一篇关于ViewState的.现在继续总结Cookies方式的 新建的测试页面login <%@ Page Language="C#&q ...
- easyui相关script的配置
<!-- 1 jQuery的js包 --> <script type="text/javascript" src="jquery-easyui-1.4. ...
- react-native 简述
1. RN 是什么 2. RN 与传统Hybrid框架相比的优势 3. RN的优势 4. RN的劣势 5. RN开发重点关注的问题 1 RN是什么 2 RN 与传统Hybrid框架相比的优势 传统的如 ...
- Plant Design Review Based on AnyCAD
Plant Design Review Based on AnyCAD eryar@163.com Abstract. AVEVA Review is used to 3D model visuali ...
- 【转】SQL删除重复数据方法,留着备用
感谢孙潇楠前辈的总结,地址http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id name ...
- JS preventDefault ,stopPropagation ,return false
所谓的事件有两种:监听事件和浏览器对特殊标签元素的默认行为事件.监听事件:在节点上被监听的事件操作,如 select节点的change事件,a节点的click事件.浏览器的默认事件:特定页面元素上带的 ...
- MVC4做网站后台:栏目管理2、修改栏目
接上节添加栏目. 修改栏目与添加栏目非常相似,主要区别在于先向视图传递要修改栏目的model.另外在保存时比添加栏目验证要更多一些. 1.要验证父栏目不能是其本身: 2.父栏目不能是其子栏目: 3.父 ...
- eclipse将android项目生成apk并且给apk签名
转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...
- 创建第一个 vlan network "vlan100" - 每天5分钟玩转 OpenStack(94)
上一节我们在 ML2 配置中 enable 了 vlan network,今天将创建 vlan100 并讨论底层网络变化. 打开菜单 Admin -> Networks,点击 “Create N ...