继上篇开始,这里主要再次精简.因为大家已经熟悉了主要思想以及它的工作方式.那么这里提供的案例改动会很大.上篇的DatabaseCommand***均是为了大家能够轻松的理解所临时编写的.这次提供的接口会有很大变动,以及会有一些新的内容,比如执行Reader是修改的Connection状态,同时不上没有提供异步功能的案例.我将一步一步的带领大家走入.
?
1.NoCountModel
?
?
?
?1 public enum NoCountModel
?2 {
?3 ? ? ///
?4 ? ? /// 默认当前连接的状态
?5 ? ? ///
?6 ? ? None,
?7 ? ? ///
?8 ? ? /// 不返回受影响行计数
?9 ? ? /// 对于在连接打开时执行的任何后续命令,连接状态不会被修改.
10 ? ? ///
11 ? ? ON,
12 ? ? ///
13 ? ? /// 返回受影响行计数
14 ? ? /// 如果要确保某个命令不修改所有后续命令的连接,建议您在命令中包括用于重置连接状态的命令
15 ? ? /// 建议您使用 ExecuteNonQuery时来执行该命令
16 ? ? ///
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 Reader(SqlText argument_SqlText, DbParameter[] argument_Parameters);
?8 ? ? ? ? Task ExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
?9 ? ? ? ? Task TExecuteNonQuery(SqlText argument_SqlText, DbParameter[] argument_Parameters);
10 ? ? ? ? Task 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, Paramete