• SqlHelper个人完善版本介绍


     虽然现在有层出不穷的各种ORM框架来与数据库交互,但是其底层也无外乎调用ADO.NET来处理,所以ADO.NET是根本,而且对于传统的老三层项目,大家想都不用想就能说出数据库操作有各种完善的SqlHelper。

    别人的自己用了总是有不爽的地方,所以花时间把现有的SqlHelper全部改写了一下,充分利用泛型的以及委托的特性。

    先来个代码截图

    主要代码如下:

    1.批量SQL语句处理类创建

     1 /// <summary>
     2     ///     批量SQL定义
     3     /// </summary>
     4     public sealed class BatchCmdEntity
     5     {
     6         //参数列表
     7         private readonly List<SqlParameter> _mParas;
     8 
     9         public BatchCmdEntity()
    10         {
    11             _mParas = new List<SqlParameter>();
    12         }
    13 
    14         /// <summary>
    15         ///     SQL语句
    16         /// </summary>
    17         public string Sql { get; set; }
    18 
    19         /// <summary>
    20         ///     参数数组属性
    21         /// </summary>
    22         public SqlParameter[] Parameter => _mParas.ToArray();
    23 
    24         /// <summary>
    25         ///     添加参数
    26         /// </summary>
    27         /// <param name="name">参数名称</param>
    28         /// <param name="value">参数值</param>
    29         public void AddParameter(string name, object value)
    30         {
    31             _mParas.Add(new SqlParameter(name, value));
    32         }
    33 
    34         /// <summary>
    35         ///     添加参数数组
    36         /// </summary>
    37         /// <param name="paras">参数数组</param>
    38         public void AddParameter(SqlParameter[] paras)
    39         {
    40             _mParas.AddRange(paras);
    41         }
    42     }
    View Code

    有些场景比如ExecuteNonQuery需要返回多条语句叠加的数量结果是可以采用此类来封装

    2.处理数据库空值方法

     1 #region 【处理数据库空值方法】
     2 
     3         /// <summary>
     4         /// 处理数据库空值方法
     5         /// </summary>
     6         /// <typeparam name="T">泛型类型</typeparam>
     7         /// <param name="value">读取出来的值</param>
     8         /// <param name="defaultValue">泛型类型的默认值</param>
     9         /// <returns></returns>
    10         private static T ConvertData<T>(object value, T defaultValue)
    11         {
    12             if (Convert.IsDBNull(value) || value == null)
    13             {
    14                 return defaultValue;
    15             }
    16             if (value is T)
    17             {
    18                 return (T)value;
    19             }
    20             return (T)Convert.ChangeType(value, typeof(T));
    21         }
    22 
    23         #endregion
    View Code

    有些场景比如ExecuteScalar需要返回首行首列的值,该值可能为空,如果不为空则为object类型,需要返回我们需要的类型如int,string,double等,可以调用此方法

    3.生成分页SQL语句,采用row_number函数

     1   #region【BuildPagingSql】
     2 
     3         /// <summary>
     4         ///     生成分页语句
     5         /// </summary>
     6         /// <param name="orderByField">分页字段</param>
     7         /// <param name="querySql">查询SQL语句</param>
     8         /// <param name="pageSize">每页数量</param>
     9         /// <param name="pageIndex">页索引</param>
    10         /// <returns></returns>
    11         public static string BuildPagingSql(string orderByField, string querySql, int pageSize, int pageIndex)
    12         {
    13             //开始记录数
    14             int beginRowNum = (pageIndex - 1) * pageSize + 1;
    15             //结束记录数
    16             int endRowNum = pageIndex * pageSize;
    17 
    18             StringBuilder sb = new StringBuilder();
    19             sb.Append(@"SELECT * ");
    20             sb.AppendFormat($" FROM ( SELECT    ROW_NUMBER() OVER ( ORDER BY {orderByField} ) ROWNUMBER, *");
    21             sb.AppendFormat($" FROM ({querySql}) a) b ");
    22             sb.AppendFormat($" WHERE ROWNUMBER BETWEEN {beginRowNum} AND {endRowNum}");
    23 
    24             return sb.ToString();
    25         }
    View Code

    现在的系统基本都不大使用存储过程,存储过程的弊端大家都知道,不好迁移,不利于做分库,所以采用row_number函数生成SQL语句来处理分页

    4.其他代码大家应该理解起来没多大难度,完整代码如下,如有错误,欢迎告知,感谢

      1 #region
      2 
      3 using System;
      4 using System.Collections.Generic;
      5 using System.Configuration;
      6 using System.Data;
      7 using System.Data.SqlClient;
      8 using System.Linq;
      9 using System.Text;
     10 
     11 #endregion
     12 
     13 namespace OAO2O.BusinessService.DAL
     14 {
     15     /// <summary>
     16     ///     DbHelper 的摘要说明
     17     /// </summary>
     18     public sealed class SqlHelper
     19     {
     20         //连接字符串从配置文件中读取
     21         public static readonly string ConnString = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
     22 
     23         #region【ExecuteNonQuery】
     24 
     25         /// <summary>
     26         /// 生成使用默认连接的ExecuteNonQuery
     27         /// </summary>
     28         /// <param name="commandText">语句</param>
     29         /// <param name="cmdType">类型</param>
     30         /// <param name="paras">参数数组</param>
     31         /// <returns></returns>
     32         public static int ExecuteNonQuery(string commandText, CommandType cmdType, params SqlParameter[] paras)
     33         {
     34             return ExecuteNonQuery(ConnString, commandText, cmdType, paras);
     35         }
     36 
     37         /// <summary>
     38         /// 生成使用自定义连接的ExecuteNonQuery
     39         /// </summary>
     40         /// <param name="connectionString">自定义连接字符串</param>
     41         /// <param name="commandText">语句</param>
     42         /// <param name="cmdType">类型</param>
     43         /// <param name="parms">参数数组</param>
     44         /// <returns></returns>
     45         public static int ExecuteNonQuery(string connectionString, string commandText, CommandType cmdType,
     46             params SqlParameter[] parms)
     47         {
     48             using (SqlConnection connection = new SqlConnection(connectionString))
     49             {
     50                 using (SqlCommand command = new SqlCommand())
     51                 {
     52                     PrepareCommand(command, connection, null, cmdType, commandText, parms);
     53                     int retval = command.ExecuteNonQuery();
     54                     command.Parameters.Clear();
     55                     return retval;
     56                 }
     57             }
     58         }
     59 
     60         /// <summary>
     61         /// 生成使用默认连接的ExecuteNonQuery
     62         /// </summary>
     63         /// <param name="cmdList">批量SQL语句</param>
     64         /// <returns></returns>
     65         public static int ExecuteNonQuery(List<BatchCmdEntity> cmdList)
     66         {
     67             return ExecuteNonQuery(ConnString, cmdList);
     68         }
     69 
     70         /// <summary>
     71         /// 生成使用自定义连接的ExecuteNonQuery
     72         /// </summary>
     73         /// <param name="connectionString">自定义连接字符串</param>
     74         /// <param name="cmdList">批量SQL语句</param>
     75         /// <returns></returns>
     76         public static int ExecuteNonQuery(string connectionString, List<BatchCmdEntity> cmdList)
     77         {
     78             return ExecuteNonQuery(connectionString, command =>
     79             {
     80                 int retval = 0;
     81                 foreach (BatchCmdEntity cmd in cmdList)
     82                 {
     83                     //因为是批量语句,所以进来之前先清空
     84                     command.CommandText = "";
     85                     command.Parameters.Clear();
     86                     //重新赋值
     87                     command.CommandText = cmd.Sql;
     88                     command.Parameters.AddRange(cmd.Parameter);
     89                     retval += command.ExecuteNonQuery();
     90                 }
     91 
     92                 return retval;
     93             });
     94         }
     95 
     96         /// <summary>
     97         /// 生成使用默认连接的ExecuteNonQuery
     98         /// </summary>
     99         /// <param name="fun">泛型委托方法</param>
    100         /// <returns></returns>
    101         public static int ExecuteNonQuery(Func<SqlCommand, int> fun)
    102         {
    103             return ExecuteNonQuery(ConnString, fun);
    104         }
    105 
    106         /// <summary>
    107         /// 生成使用自定义连接的ExecuteNonQuery
    108         /// </summary>
    109         /// <param name="connectionString">自定义连接字符串</param>
    110         /// <param name="fun">泛型委托方法</param>
    111         /// <returns></returns>
    112         public static int ExecuteNonQuery(string connectionString, Func<SqlCommand, int> fun)
    113         {
    114             using (SqlConnection connection = new SqlConnection(connectionString))
    115             {
    116                 if (connection.State != ConnectionState.Open) connection.Open();
    117 
    118                 SqlTransaction trans = connection.BeginTransaction();
    119                 using (SqlCommand command = new SqlCommand())
    120                 {
    121                     PrepareCommand(command, connection, trans);
    122                     int retval = 0;
    123                     try
    124                     {
    125                         retval = fun(command);
    126                         trans.Commit();
    127                     }
    128                     catch
    129                     {
    130                         trans.Rollback();
    131 
    132                     }
    133                     return retval;
    134                 }
    135             }
    136         }
    137 
    138         #endregion
    139 
    140         #region 【ExecuteScalar】
    141 
    142         /// <summary>
    143         /// 生成使用默认连接的ExecuteScalar
    144         /// </summary>
    145         /// <typeparam name="T">泛型类型</typeparam>
    146         /// <param name="commandText">语句</param>
    147         /// <param name="cmdType">类型</param>
    148         /// <param name="parms">参数数组</param>
    149         /// <returns></returns>
    150         public static T ExecuteScalar<T>(string commandText, CommandType cmdType, params SqlParameter[] parms)
    151         {
    152             return ExecuteScalar<T>(ConnString, commandText, cmdType, parms);
    153         }
    154 
    155         /// <summary>
    156         /// 生成使用自定义连接的ExecuteScalar
    157         /// </summary>
    158         /// <typeparam name="T">泛型类型</typeparam>
    159         /// <param name="connectionString">自定义连接字符串</param>
    160         /// <param name="commandText">语句</param>
    161         /// <param name="cmdType">类型</param>
    162         /// <param name="parms">参数数组</param>
    163         /// <returns></returns>
    164         public static T ExecuteScalar<T>(string connectionString, string commandText, CommandType cmdType,
    165             params SqlParameter[] parms)
    166         {
    167             using (SqlConnection connection = new SqlConnection(connectionString))
    168             {
    169                 using (SqlCommand command = new SqlCommand())
    170                 {
    171                     PrepareCommand(command, connection, null, cmdType, commandText, parms);
    172                     object retval = command.ExecuteScalar();
    173                     command.Parameters.Clear();
    174                     return ConvertData(retval, default(T));
    175                 }
    176             }
    177         }
    178 
    179         #endregion
    180 
    181         #region 【ExecuteDataRow】
    182 
    183         public static DataRow ExecuteDataRow(string commandText, CommandType cmdType, params SqlParameter[] parms)
    184         {
    185             return ExecuteDataRow(ConnString, commandText, cmdType, parms);
    186         }
    187 
    188         /// <summary>
    189         /// 生成数据行DataRow
    190         /// </summary>
    191         /// <param name="connectionString"></param>
    192         /// <param name="commandText"></param>
    193         /// <param name="cmdType"></param>
    194         /// <param name="parms"></param>
    195         /// <returns></returns>
    196         public static DataRow ExecuteDataRow(string connectionString, string commandText, CommandType cmdType,
    197             params SqlParameter[] parms)
    198         {
    199             DataTable data = ExecuteDataTable(connectionString, commandText, cmdType, parms);
    200             return data?.Rows[0];
    201         }
    202 
    203         #endregion
    204 
    205         #region 【ExecuteDataTable】
    206 
    207         public static DataTable ExecuteDataTable(string commandText, CommandType cmdType, params SqlParameter[] paras)
    208         {
    209             return ExecuteDataTable(ConnString, commandText, cmdType, paras);
    210         }
    211 
    212         /// <summary>
    213         /// 生成数据表DataTable
    214         /// </summary>
    215         /// <param name="connectionString">连接字符串</param>
    216         /// <param name="commandText">语句</param>
    217         /// <param name="cmdType">类型</param>
    218         /// <param name="parms">参数数组</param>
    219         /// <returns></returns>
    220         public static DataTable ExecuteDataTable(string connectionString, string commandText, CommandType cmdType,
    221             params SqlParameter[] parms)
    222         {
    223             using (SqlConnection connection = new SqlConnection(connectionString))
    224             {
    225                 using (SqlCommand command = new SqlCommand())
    226                 {
    227                     PrepareCommand(command, connection, null, cmdType, commandText, parms);
    228                     SqlDataAdapter adapter = new SqlDataAdapter(command);
    229 
    230                     DataTable data = new DataTable();
    231                     adapter.Fill(data);
    232                     command.Parameters.Clear();
    233 
    234                     return data;
    235                 }
    236             }
    237         }
    238 
    239         #endregion
    240 
    241         #region【ExecuteDataSet】
    242 
    243         public static DataSet ExecuteDataSet(string cmdText, CommandType cmdType, params SqlParameter[] parms)
    244         {
    245             return ExecuteDataSet(ConnString, cmdText, cmdType, parms);
    246         }
    247 
    248         /// <summary>
    249         /// 生成数据集合DataSet
    250         /// </summary>
    251         /// <param name="connectionString">连接字符串</param>
    252         /// <param name="commandText">语句</param>
    253         /// <param name="cmdType">类型</param>
    254         /// <param name="parms">参数数组</param>
    255         /// <returns></returns>
    256         public static DataSet ExecuteDataSet(string connectionString, string commandText, CommandType cmdType,
    257             params SqlParameter[] parms)
    258         {
    259             using (SqlConnection connection = new SqlConnection(connectionString))
    260             {
    261                 using (SqlCommand command = new SqlCommand())
    262                 {
    263                     PrepareCommand(command, connection, null, cmdType, commandText, parms);
    264                     SqlDataAdapter adapter = new SqlDataAdapter(command);
    265 
    266                     DataSet data = new DataSet();
    267                     adapter.Fill(data);
    268                     command.Parameters.Clear();
    269 
    270                     return data;
    271                 }
    272             }
    273         }
    274 
    275         #endregion
    276 
    277         #region 【PrepareCommand】
    278 
    279         private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction)
    280         {
    281             PrepareCommand(command, connection, transaction, CommandType.Text, string.Empty, null);
    282         }
    283 
    284         /// <summary>
    285         /// 生成cmd
    286         /// </summary>
    287         /// <param name="command">cmd对象</param>
    288         /// <param name="connection">连接</param>
    289         /// <param name="transaction">事务</param>
    290         /// <param name="commandType">类型</param>
    291         /// <param name="commandText">语句</param>
    292         /// <param name="parms">参数数组</param>
    293         private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction,
    294             CommandType commandType, string commandText, params SqlParameter[] parms)
    295         {
    296             if (connection.State != ConnectionState.Open) connection.Open();
    297 
    298             command.Connection = connection;
    299             command.CommandTimeout = 600;
    300             command.CommandText = commandText;
    301             command.CommandType = commandType;
    302 
    303             if (transaction != null) command.Transaction = transaction;
    304 
    305             if (parms == null || parms.Length == 0) return;
    306             //循环设置参数值为null的参数,设置其值为数据库制定类型DBNull.Value
    307             foreach (SqlParameter parameter in parms.Where(parameter => (parameter.Direction == ParameterDirection.InputOutput ||
    308                                                                 parameter.Direction == ParameterDirection.Input) &&
    309                                                                (parameter.Value == null)))
    310             {
    311                 parameter.Value = DBNull.Value;
    312             }
    313             //添加到参数数组中
    314             command.Parameters.AddRange(parms);
    315         }
    316 
    317         #endregion
    318 
    319         #region 【BuildPara】
    320         /// <summary>
    321         /// 生成普通参数
    322         /// </summary>
    323         /// <param name="name">参数名</param>
    324         /// <param name="value">参数值</param>
    325         /// <returns></returns>
    326         public static SqlParameter BuildPara(string name, object value)
    327         {
    328             return new SqlParameter(name, value);
    329         }
    330 
    331         /// <summary>
    332         /// 生成普通参数
    333         /// </summary>
    334         /// <param name="name">参数名</param>
    335         /// <param name="dbType">参数类型</param>
    336         /// <param name="value">参数值</param>
    337         /// <returns></returns>
    338         public static SqlParameter BuildPara(string name, SqlDbType dbType, object value)
    339         {
    340             return new SqlParameter(name, dbType)
    341             {
    342                 Value = value
    343             };
    344         }
    345 
    346         /// <summary>
    347         /// 生成输出参数
    348         /// </summary>
    349         /// <param name="name">参数名</param>
    350         /// <param name="direction">输出方向</param>
    351         /// <param name="value">参数值</param>
    352         /// <returns></returns>
    353         public static SqlParameter BuildPara(string name, ParameterDirection direction, object value)
    354         {
    355             return new SqlParameter
    356             {
    357                 ParameterName = name,
    358                 Direction = direction,
    359                 Value = value
    360             };
    361         }
    362 
    363         /// <summary>
    364         /// 生成输出参数
    365         /// </summary>
    366         /// <param name="name">参数名</param>
    367         /// <param name="dbType">参数类型</param>
    368         /// <param name="direction">输出方向</param>
    369         /// <returns></returns>
    370         public static SqlParameter BuildPara(string name, SqlDbType dbType, ParameterDirection direction)
    371         {
    372             return new SqlParameter(name, dbType)
    373             {
    374                 Direction = direction
    375             };
    376         }
    377 
    378         /// <summary>
    379         /// 生成带长度的输出参数
    380         /// </summary>
    381         /// <param name="name">参数名</param>
    382         /// <param name="dbType">参数类型</param>
    383         /// <param name="size">长度</param>
    384         /// <param name="direction">输出方向</param>
    385         /// <returns></returns>
    386         public static SqlParameter BuildPara(string name, SqlDbType dbType, int size, ParameterDirection direction)
    387         {
    388             return new SqlParameter(name, dbType, size)
    389             {
    390                 Direction = direction
    391             };
    392         }
    393 
    394         /// <summary>
    395         /// 生成输出参数
    396         /// </summary>
    397         /// <param name="name">参数名</param>
    398         /// <param name="dbType">参数类型</param>
    399         /// <param name="direction">输出方向</param>
    400         /// <param name="value">参数值</param>
    401         /// <returns></returns>
    402         public static SqlParameter BuildPara(string name, SqlDbType dbType, ParameterDirection direction, object value)
    403         {
    404             return new SqlParameter(name, dbType)
    405             {
    406                 Direction = direction,
    407                 Value = value
    408             };
    409         }
    410 
    411         #endregion
    412 
    413         #region【BuildPagingSql】
    414 
    415         /// <summary>
    416         ///     生成分页语句
    417         /// </summary>
    418         /// <param name="orderByField">分页字段</param>
    419         /// <param name="querySql">查询SQL语句</param>
    420         /// <param name="pageSize">每页数量</param>
    421         /// <param name="pageIndex">页索引</param>
    422         /// <returns></returns>
    423         public static string BuildPagingSql(string orderByField, string querySql, int pageSize, int pageIndex)
    424         {
    425             //开始记录数
    426             int beginRowNum = (pageIndex - 1) * pageSize + 1;
    427             //结束记录数
    428             int endRowNum = pageIndex * pageSize;
    429 
    430             StringBuilder sb = new StringBuilder();
    431             sb.Append(@"SELECT * ");
    432             sb.AppendFormat($" FROM ( SELECT    ROW_NUMBER() OVER ( ORDER BY {orderByField} ) ROWNUMBER, *");
    433             sb.AppendFormat($" FROM ({querySql}) a) b ");
    434             sb.AppendFormat($" WHERE ROWNUMBER BETWEEN {beginRowNum} AND {endRowNum}");
    435 
    436             return sb.ToString();
    437         }
    438 
    439         #endregion
    440 
    441         #region 【处理数据库空值方法】
    442 
    443         /// <summary>
    444         /// 处理数据库空值方法
    445         /// </summary>
    446         /// <typeparam name="T">泛型类型</typeparam>
    447         /// <param name="value">读取出来的值</param>
    448         /// <param name="defaultValue">泛型类型的默认值</param>
    449         /// <returns></returns>
    450         private static T ConvertData<T>(object value, T defaultValue)
    451         {
    452             if (Convert.IsDBNull(value) || value == null)
    453             {
    454                 return defaultValue;
    455             }
    456             if (value is T)
    457             {
    458                 return (T)value;
    459             }
    460             return (T)Convert.ChangeType(value, typeof(T));
    461         }
    462 
    463         #endregion
    464     }
    465 
    466 
    467     /// <summary>
    468     ///     批量SQL定义
    469     /// </summary>
    470     public sealed class BatchCmdEntity
    471     {
    472         //参数列表
    473         private readonly List<SqlParameter> _mParas;
    474 
    475         public BatchCmdEntity()
    476         {
    477             _mParas = new List<SqlParameter>();
    478         }
    479 
    480         /// <summary>
    481         ///     SQL语句
    482         /// </summary>
    483         public string Sql { get; set; }
    484 
    485         /// <summary>
    486         ///     参数数组属性
    487         /// </summary>
    488         public SqlParameter[] Parameter => _mParas.ToArray();
    489 
    490         /// <summary>
    491         ///     添加参数
    492         /// </summary>
    493         /// <param name="name">参数名称</param>
    494         /// <param name="value">参数值</param>
    495         public void AddParameter(string name, object value)
    496         {
    497             _mParas.Add(new SqlParameter(name, value));
    498         }
    499 
    500         /// <summary>
    501         ///     添加参数数组
    502         /// </summary>
    503         /// <param name="paras">参数数组</param>
    504         public void AddParameter(SqlParameter[] paras)
    505         {
    506             _mParas.AddRange(paras);
    507         }
    508     }
    509 }
    View Code
  • 相关阅读:
    【图像分割】:使用全卷积神经网络FCN,进行图像语义分割详解(附代码实现)
    阿里天池文本分类竞赛task2:初始数据分析
    阿里天池文本分类竞赛task1: 赛题理解
    threejs在建筑学上的应用:《Learning Threejs》
    threejs官网教程geometry有哪些?可以自定义自己的geometry吗?
    cesium如何让模型贴地?
    cesium添加OSM建筑物
    threejs与tubegeometry
    cesium建模&加载3dsmax模型
    cesium与三维管线
  • 原文地址:https://www.cnblogs.com/yuzk/p/5145533.html
Copyright © 2020-2023  润新知