zoukankan      html  css  js  c++  java
  • 自己写ORM框架 SqlHelper_DG C#(java的写在链接里)

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。 当你开发一个应用程序的时候(不使用O/R MAPPING),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。

    现在流行的ORM框架有:
    JAVA系列:APACHE OJB,CAYENNE,JAXOR,JPA,HIBERNATE,IBATIS/MYBATIS,JRELATIONALFRAMEWORK,SMYLE,TOPLINK等
    其中 TOPLINK 是 ORACLE 的商业产品,其他均为开源项目。其中 HIBERNATE的轻量级 ORM 模型逐步确立了在 JAVA ORM 架构中领导地位,甚至取代复杂而又繁琐的 EJB 模型而成为事实上的 JAVA ORM 工业标准。
    .NET系列:EF(ENTITY FRAMWORK),NHIBERNATE,Ibits,ENTITYSCODEGENERATE,LINQ TOSQL,GROVE,RUNGOO.ENTERPRISEORM,FIRECODE CREATOR,MYGENERATION,CODESMITH PRO,CODEAUTO等
    微软VS中自带的有EF(ENTITY FRAMWORK)框架。

    你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。我们可不可以写一个类来封装这些重复的劳动呢?

    想必大家都有曾经想过写SqlHelper吧,实际上,从SqlHelper一步步写下来,封装到足够好之后,就会成为一个自己专属的ORM框架了。

    在这里,小编写了一个很基础的类ORM的SqlHelper里面仅仅对Select查询语句进行了封装,由于考虑到了反射机制的诟病(这里不再讨论,关于反射效率问题有大多数的讨论,利与弊总是同时存在的,我们不纠结于这点)。对于常见的CRUD来说,CUD通常一个方法可以实现,并且Sql语句可以得到更大的封装结合配置文件和反射机制进行操作。小编这里采用的模式是SqlServer+SqlHelper+代码生成器(需要代码生成器的可以联系本人,不定期更新)来完成的代码编写工作,因此没有对CUD进行大量的封装,同时也提高了执行效率(你懂的)。

    接下来我贴上我的代码(里面注释采用中文注释,比较完善有不懂的可以咨询本人):

    1 public static readonly string ConnString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;

    这里的读取数据库连接字符串采用在配置文件中读取的方式,需要在配置文件中进行配置一个连接名称为"ConStr"的连接字符串。如下Appconfig.XML:(这里配置为本机)

    1 <connectionStrings>
    2     <add name="ConStr" connectionString="Data Source=.;Initial Catalog=db_Test;Integrated Security=True"/>
    3 </connectionStrings>

    内部的一些主要方法介绍:

    ExecuteNonQuery 执行sql命令,返回受影响的行数。 一般用作CUD操作

    ExecuteScalar 执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)不带参数

    ExecuteReader 执行sql语句或存储过程 返回DataReader

    ExecuteDataSet 执行sql语句或存储过程,返回DataSet

    public static List<T> ReturnListByModels<T>(DataSet ds) 反射返回一个List T 类型的结果集 如List<User> 用于Reader操作

    public static T ReturnModelByModels<T>(SqlDataReader reader) 反射返回一个T类型的结果 如User 用于Reader操作

    SqlHelper_DG代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Configuration;
      5 using System.Data;
      6 using System.Data.SqlClient;
      7 using System.Reflection;
      8 
      9 
     10 namespace SqlHelper_Framework4_5_DG
     11 {
     12     /// <summary>
     13     /// SqlHelper
     14     /// 此类为抽象类,不允许实例化,在应用时直接调用即可;
     15     /// author qixiao(DG);
     16     /// release Time :20160506;
     17     /// </summary>
     18     public abstract class SqlHelper_DG
     19     {
     20         #region ConStr链接字符串---ConStr链接字符串声明
     21         /// <summary>
     22         /// 连接字符串 ConnString 公共静态只读 不允许进行修改 在后续调用中目前不支持代码修改链接字符串--DG
     23         /// </summary>
     24         public static readonly string ConnString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
     25         #endregion
     26 
     27         #region ExcuteNonQuery 执行sql语句或者存储过程,返回影响的行数---ExcuteNonQuery
     28         /// <summary>
     29         /// 执行sql语句或存储过程,返回受影响的行数,不带参数。--DG
     30         /// </summary>
     31         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
     32         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
     33         /// <param name="commandType">命令类型 有默认值CommandType.Text</param>
     34         /// <returns>返回受影响的行数</returns>
     35         public static int ExecuteNonQuery(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text)
     36         {
     37             try
     38             {
     39                 using (SqlConnection conn = new SqlConnection(ConnString))
     40                 {
     41                     using (SqlCommand cmd = new SqlCommand())
     42                     {
     43                         PreparCommand(conn, cmd, commandTextOrSpName, commandType);//参数增加了commandType 可以自己编辑执行方式
     44                         return cmd.ExecuteNonQuery();
     45                     }
     46                 }
     47             }
     48             catch (Exception)
     49             {
     50                 return default(int);
     51             }
     52         }
     53         /// <summary>
     54         /// 执行sql语句或存储过程,返回受影响的行数。--DG
     55         /// </summary>
     56         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
     57         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
     58         /// <param name="commandType">命令类型 t</param>
     59         /// <param name="parms">SqlParameter[]参数数组,允许空</param>
     60         /// <returns>返回受影响的行数</returns>
     61         public static int ExecuteNonQuery(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
     62         {
     63             try
     64             {
     65                 using (SqlConnection conn = new SqlConnection(ConnString))
     66                 {
     67                     using (SqlCommand cmd = new SqlCommand())
     68                     {
     69                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms);//参数增加了commandType 可以自己编辑执行方式
     70                         return cmd.ExecuteNonQuery();
     71                     }
     72                 }
     73             }
     74             catch (Exception)
     75             {
     76                 return default(int);
     77             }
     78 
     79 
     80         }
     81         /// <summary>
     82         /// 执行sql命令,返回受影响的行数。--DG
     83         /// </summary>
     84         /// <param name="ConnString">连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString</param>
     85         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
     86         /// <param name="commandType">命令类型</param>
     87         /// <param name="obj">object[]参数数组,允许空</param>
     88         /// <returns>返回受影响的行数</returns>
     89         public static int ExecuteNonQuery(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj)
     90         {
     91             try
     92             {
     93                 using (SqlConnection conn = new SqlConnection(ConnString))
     94                 {
     95                     using (SqlCommand cmd = new SqlCommand())
     96                     {
     97                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj);//参数增加了commandType 可以自己编辑执行方式
     98                         return cmd.ExecuteNonQuery();
     99                     }
    100                 }
    101             }
    102             catch (Exception)
    103             {
    104                 return default(int);
    105             }
    106 
    107 
    108         }
    109         #endregion
    110 
    111         #region ExecuteScalar 执行sql语句或者存储过程,执行单条语句,返回自增的id---ScalarExecuteScalar
    112         /// <summary>
    113         /// 执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)不带参数--DG
    114         /// </summary>
    115         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
    116         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    117         /// <param name="commandType">命令类型 有默认值CommandType.Text</param>
    118         /// <returns></returns>
    119         public static object ExecuteScalar(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text)
    120         {
    121             try
    122             {
    123                 using (SqlConnection conn = new SqlConnection(ConnString))
    124                 {
    125                     using (SqlCommand cmd = new SqlCommand())
    126                     {
    127                         PreparCommand(conn, cmd, commandTextOrSpName, commandType);
    128                         return cmd.ExecuteScalar();
    129                     }
    130 
    131                 }
    132             }
    133             catch (Exception)
    134             {
    135                 return default(int);
    136             }
    137         }
    138         /// <summary>
    139         /// 执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)--DG
    140         /// </summary>
    141         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
    142         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    143         /// <param name="commandType">命令类型</param>
    144         /// <param name="parms">SqlParameter[]参数数组,允许空</param>
    145         /// <returns></returns>
    146         public static object ExecuteScalar(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
    147         {
    148             try
    149             {
    150                 using (SqlConnection conn = new SqlConnection(ConnString))
    151                 {
    152                     using (SqlCommand cmd = new SqlCommand())
    153                     {
    154                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms);
    155                         return cmd.ExecuteScalar();
    156                     }
    157 
    158                 }
    159             }
    160             catch (Exception)
    161             {
    162                 return default(int);
    163             }
    164         }
    165         /// <summary>
    166         /// 执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)--DG
    167         /// </summary>
    168         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
    169         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    170         /// <param name="commandType">命令类型</param>
    171         /// <param name="obj">object[]参数数组,允许空</param>
    172         /// <returns></returns>
    173         public static object ExecuteScalar(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj)
    174         {
    175             try
    176             {
    177                 using (SqlConnection conn = new SqlConnection(ConnString))
    178                 {
    179                     using (SqlCommand cmd = new SqlCommand())
    180                     {
    181                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj);
    182                         return cmd.ExecuteScalar();
    183                     }
    184                 }
    185             }
    186             catch (Exception)
    187             {
    188 
    189                 return default(int);
    190             }
    191         }
    192         #endregion
    193 
    194         #region ExecuteReader 执行sql语句或者存储过程,返回DataReader---DaataReader
    195         /// <summary>
    196         /// 执行sql语句或存储过程 返回DataReader 不带参数--DG
    197         /// </summary>
    198         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
    199         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    200         /// <param name="commandType">命令类型 有默认值CommandType.Text</param>
    201         /// <returns></returns>
    202         public static SqlDataReader ExecuteReader(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text)
    203         {
    204             //sqlDataReader不能用using 会关闭conn 导致不能获取到返回值。注意:DataReader获取值时必须保持连接状态
    205             try
    206             {
    207                 SqlConnection conn = new SqlConnection(ConnString);
    208                 SqlCommand cmd = new SqlCommand();
    209                 PreparCommand(conn, cmd, commandTextOrSpName, commandType);
    210                 return cmd.ExecuteReader(CommandBehavior.CloseConnection);
    211             }
    212             catch (Exception)
    213             {
    214                 return null;
    215             }
    216         }
    217         /// <summary>
    218         /// 执行sql语句或存储过程 返回DataReader--DG
    219         /// </summary>
    220         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
    221         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    222         /// <param name="commandType">命令类型</param>
    223         /// <param name="parms">SqlParameter[]参数数组,允许空</param>
    224         /// <returns></returns>
    225         public static SqlDataReader ExecuteReader(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
    226         {
    227             //sqlDataReader不能用using 会关闭conn 导致不能获取到返回值。注意:DataReader获取值时必须保持连接状态
    228             try
    229             {
    230                 SqlConnection conn = new SqlConnection(ConnString);
    231                 SqlCommand cmd = new SqlCommand();
    232                 PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms);
    233                 return cmd.ExecuteReader(CommandBehavior.CloseConnection);
    234             }
    235             catch (Exception)
    236             {
    237                 return null;
    238             }
    239         }
    240         /// <summary>
    241         /// 执行sql语句或存储过程 返回DataReader--DG
    242         /// </summary>
    243         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
    244         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    245         /// <param name="commandType">命令类型</param>
    246         /// <param name="obj">object[]参数数组,允许空</param>
    247         /// <returns></returns>
    248         public static SqlDataReader ExecuteReader(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj)
    249         {
    250             //sqlDataReader不能用using 会关闭conn 导致不能获取到返回值。注意:DataReader获取值时必须保持连接状态
    251             try
    252             {
    253                 SqlConnection conn = new SqlConnection(ConnString);
    254                 SqlCommand cmd = new SqlCommand();
    255                 PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj);
    256                 return cmd.ExecuteReader(CommandBehavior.CloseConnection);
    257             }
    258             catch (Exception)
    259             {
    260                 return null;
    261             }
    262         }
    263         #endregion
    264 
    265         #region ExecuteDataset 执行sql语句或者存储过程,返回一个DataSet---DataSet
    266         /// <summary>
    267         /// 执行sql语句或存储过程,返回DataSet 不带参数--DG
    268         /// </summary>
    269         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
    270         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    271         /// <param name="commandType">命令类型 有默认值CommandType.Text</param>
    272         /// <returns></returns>
    273         public static DataSet ExecuteDataSet(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text)
    274         {
    275             try
    276             {
    277                 using (SqlConnection conn = new SqlConnection(ConnString))
    278                 {
    279                     using (SqlCommand cmd = new SqlCommand())
    280                     {
    281                         PreparCommand(conn, cmd, commandTextOrSpName, commandType);
    282                         using (SqlDataAdapter da = new SqlDataAdapter(cmd))
    283                         {
    284                             DataSet ds = new DataSet();
    285                             da.Fill(ds);
    286                             return ds;
    287                         }
    288                     }
    289                 }
    290             }
    291             catch (Exception)
    292             {
    293                 return null;
    294             }
    295         }
    296         /// <summary>
    297         /// 执行sql语句或存储过程,返回DataSet--DG
    298         /// </summary>
    299         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
    300         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    301         /// <param name="commandType">命令类型</param>
    302         /// <param name="parms">SqlParameter[]参数数组,允许空</param>
    303         /// <returns></returns>
    304         public static DataSet ExecuteDataSet(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
    305         {
    306             try
    307             {
    308                 using (SqlConnection conn = new SqlConnection(ConnString))
    309                 {
    310                     using (SqlCommand cmd = new SqlCommand())
    311                     {
    312                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms);
    313                         using (SqlDataAdapter da = new SqlDataAdapter(cmd))
    314                         {
    315                             DataSet ds = new DataSet();
    316                             da.Fill(ds);
    317                             return ds;
    318                         }
    319                     }
    320                 }
    321             }
    322             catch (Exception)
    323             {
    324                 return null;
    325             }
    326         }
    327         /// <summary>
    328         /// 执行sql语句或存储过程,返回DataSet--DG
    329         /// </summary>
    330         /// <param name="ConnString">连接字符串,可以自定义,可以使用SqlHelper_DG.ConnString</param>
    331         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    332         /// <param name="commandType">命令类型 </param>
    333         /// <param name="obj">object[]参数数组,允许空</param>
    334         /// <returns></returns>
    335         public static DataSet ExecuteDataSet(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj)
    336         {
    337             try
    338             {
    339                 using (SqlConnection conn = new SqlConnection(ConnString))
    340                 {
    341                     using (SqlCommand cmd = new SqlCommand())
    342                     {
    343                         PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj);
    344                         using (SqlDataAdapter da = new SqlDataAdapter(cmd))
    345                         {
    346                             DataSet ds = new DataSet();
    347                             da.Fill(ds);
    348                             return ds;
    349                         }
    350                     }
    351                 }
    352             }
    353             catch (Exception)
    354             {
    355                 return null;
    356             }
    357         }
    358         #endregion
    359 
    360         #region ---PreparCommand 构建一个通用的command对象供内部方法进行调用---
    361         /// <summary>
    362         /// 不带参数的设置sqlcommand对象--DG
    363         /// </summary>
    364         /// <param name="conn">sqlconnection对象</param>
    365         /// <param name="cmd">sqlcommmand对象</param>
    366         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    367         /// <param name="commandType">语句的类型</param>
    368         private static void PreparCommand(SqlConnection conn, SqlCommand cmd, string commandTextOrSpName, CommandType commandType)
    369         {
    370             //打开连接
    371             if (conn.State != ConnectionState.Open)
    372             {
    373                 conn.Open();
    374             }
    375 
    376             //设置SqlCommand对象的属性值
    377             cmd.Connection = conn;
    378             cmd.CommandType = commandType;
    379             cmd.CommandText = commandTextOrSpName;
    380             cmd.CommandTimeout = 20;
    381         }
    382         /// <summary>
    383         /// 设置一个等待执行的SqlCommand对象--DG
    384         /// </summary>
    385         /// <param name="conn">sqlconnection对象</param>
    386         /// <param name="cmd">sqlcommmand对象</param>
    387         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    388         /// <param name="commandType">语句的类型</param>
    389         /// <param name="parms">参数,sqlparameter类型,需要指出所有的参数名称</param>
    390         private static void PreparCommand(SqlConnection conn, SqlCommand cmd, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms)
    391         {
    392             //打开连接
    393             if (conn.State != ConnectionState.Open)
    394             {
    395                 conn.Open();
    396             }
    397 
    398             //设置SqlCommand对象的属性值
    399             cmd.Connection = conn;
    400             cmd.CommandType = commandType;
    401             cmd.CommandText = commandTextOrSpName;
    402             cmd.CommandTimeout = 20;
    403 
    404             cmd.Parameters.Clear();
    405             if (parms != null)
    406             {
    407                 cmd.Parameters.AddRange(parms);
    408             }
    409         }
    410         /// <summary>
    411         /// PreparCommand方法,可变参数为object需要严格按照参数顺序传参--DG
    412         /// </summary>
    413         /// <param name="conn">sqlconnection对象</param>
    414         /// <param name="cmd">sqlcommmand对象</param>
    415         /// <param name="commandTextOrSpName">sql语句或存储过程名称</param>
    416         /// <param name="commandType">语句的类型</param>
    417         /// <param name="parms">参数,object类型,需要按顺序赋值</param>
    418         private static void PreparCommand(SqlConnection conn, SqlCommand cmd, string commandTextOrSpName, CommandType commandType, params object[] parms)
    419         {
    420 
    421             //打开连接
    422             if (conn.State != ConnectionState.Open)
    423             {
    424                 conn.Open();
    425             }
    426 
    427             //设置SqlCommand对象的属性值
    428             cmd.Connection = conn;
    429             cmd.CommandType = commandType;
    430             cmd.CommandText = commandTextOrSpName;
    431             cmd.CommandTimeout = 20;
    432 
    433             cmd.Parameters.Clear();
    434             if (parms != null)
    435             {
    436                 cmd.Parameters.AddRange(parms);
    437             }
    438         }
    439         //之所以会用object参数方法是为了我们能更方便的调用存储过程,不必去关系存储过程参数名是什么,知道它的参数顺序就可以了 sqlparameter必须指定每一个参数名称
    440         #endregion
    441 
    442         #region 通过Model反射返回结果集 Model为 T 泛型变量的真实类型---反射返回结果集Private
    443         /// <summary>
    444         /// 反射返回一个List T 类型的结果集--DG
    445         /// </summary>
    446         /// <typeparam name="T">Model中对象类型</typeparam>
    447         /// <param name="ds">DataSet结果集</param>
    448         /// <returns></returns>
    449         public static List<T> ReturnListByModels<T>(DataSet ds)
    450         {
    451             try
    452             {
    453                 List<T> list = new List<T>();//实例化一个list对象
    454                 T model = System.Activator.CreateInstance<T>();                     //实例化一个T类型对象
    455                 PropertyInfo[] propertyInfos = model.GetType().GetProperties();     //获取T对象的所有公共属性
    456 
    457                 DataTable dt = ds.Tables[0];    // 获取到ds的dt
    458                 if (dt.Rows.Count > 0)
    459                 {
    460                     //判断读取的行是否>0 即数据库数据已被读取
    461                     foreach (DataRow row in dt.Rows)
    462                     {
    463                         T model1 = System.Activator.CreateInstance<T>();//实例化一个对象,便于往list里填充数据
    464                         foreach (PropertyInfo propertyInfo in propertyInfos)
    465                         {
    466                             //遍历模型里所有的字段
    467                             if (row[propertyInfo.Name] != System.DBNull.Value)
    468                             {
    469                                 //判断值是否为空,如果空赋值为null见else
    470                                 if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
    471                                 {
    472                                     //如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
    473                                     NullableConverter nullableConverter = new NullableConverter(propertyInfo.PropertyType);
    474                                     //将convertsionType转换为nullable对的基础基元类型
    475                                     propertyInfo.SetValue(model1, Convert.ChangeType(row[propertyInfo.Name], nullableConverter.UnderlyingType), null);
    476                                 }
    477                                 else
    478                                 {
    479                                     propertyInfo.SetValue(model1, Convert.ChangeType(row[propertyInfo.Name], propertyInfo.PropertyType), null);
    480                                 }
    481                             }
    482                             else
    483                             {
    484                                 propertyInfo.SetValue(model1, null, null);//如果数据库的值为空,则赋值为null
    485                             }
    486                         }
    487                         list.Add(model1);//将对象填充到list中
    488                     }
    489                 }
    490                 return list;
    491             }
    492             catch (Exception)
    493             {
    494                 return null;
    495             }
    496         }
    497         /// <summary>
    498         /// 反射返回一个T类型的结果--DG
    499         /// </summary>
    500         /// <typeparam name="T">Model中对象类型</typeparam>
    501         /// <param name="reader">SqlDataReader结果集</param>
    502         /// <returns></returns>
    503         public static T ReturnModelByModels<T>(SqlDataReader reader)
    504         {
    505             try
    506             {
    507                 T model = System.Activator.CreateInstance<T>();                     //实例化一个T类型对象
    508                 PropertyInfo[] propertyInfos = model.GetType().GetProperties();     //获取T对象的所有公共属性
    509                 using (reader)
    510                 {
    511                     if (reader.Read())
    512                     {
    513                         foreach (PropertyInfo propertyInfo in propertyInfos)
    514                         {
    515                             //遍历模型里所有的字段
    516                             if (reader[propertyInfo.Name] != System.DBNull.Value)
    517                             {
    518                                 //判断值是否为空,如果空赋值为null见else
    519                                 if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
    520                                 {
    521                                     //如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
    522                                     NullableConverter nullableConverter = new NullableConverter(propertyInfo.PropertyType);
    523                                     //将convertsionType转换为nullable对的基础基元类型
    524                                     propertyInfo.SetValue(model, Convert.ChangeType(reader[propertyInfo.Name], nullableConverter.UnderlyingType), null);
    525                                 }
    526                                 else
    527                                 {
    528                                     propertyInfo.SetValue(model, Convert.ChangeType(reader[propertyInfo.Name], propertyInfo.PropertyType), null);
    529                                 }
    530                             }
    531                             else
    532                             {
    533                                 propertyInfo.SetValue(model, null, null);//如果数据库的值为空,则赋值为null
    534                             }
    535                         }
    536                         return model;//返回T类型的赋值后的对象 model
    537                     }
    538                 }
    539                 return default(T);//返回引用类型和值类型的默认值0或null
    540             }
    541             catch (Exception)
    542             {
    543                 return default(T);//返回引用类型和值类型的默认值0或null
    544             }
    545         }
    546         #endregion
    547     }
    548 }
    SqlHelper_DG

    接下来我们介绍一下使用方法 :

    这里写的一个tb_TestService数据访问层(用本人的代码生成器自动生成的),实现的是一个简单的增删改查CRUD操作,里面包含了大部分的SqlHelper_DG的使用方法,大家自己在里面找吧!本人就不在具体说明了。

      1 using Model;
      2 using SqlHelper_Framework4_5_DG;
      3 using System;
      4 using System.Collections.Generic;
      5 using System.Data;
      6 using System.Data.SqlClient;
      7 using System.Text;
      8 
      9 namespace DAL
     10 {
     11     /// <summary>
     12     ///七小代码生成器
     13     ///版本号:2.0.0
     14     ///Author:EnglishName:Qixiao,中文名:七小(東哥) 
     15     ///生成器编写时间:20160507,地点:亚洲中国天津
     16     ///代码标准:東哥的SqlHelper_DG
     17     /// </summary>
     18 
     19     /// <summary>
     20     /// 实体类tb_TestService(可添加属性说明)
     21     /// </summary>
     22     public class tb_TestService
     23     {
     24         /// <summary>
     25         /// 计算当前表内的符合条件的所有数据的数量
     26         /// </summary>
     27         /// <param name="safeSqlConditionInBLL">安全的sql条件语句,从BLL层获取</param>
     28         /// <returns></returns>
     29         public int DataCount(string safeSqlConditionInBLL = "")
     30         {
     31             try
     32             {
     33                 string commandText = "select count(0) from tb_Test WHERE " + safeSqlConditionInBLL;
     34                 return Convert.ToInt32(SqlHelper_DG.ExecuteScalar(SqlHelper_DG.ConnString, commandText));
     35             }
     36             catch (Exception)
     37             {
     38                 return default(int);
     39             }
     40         }
     41         /// <summary>
     42         /// 检测是否存在条件所指示的数据------------这个方法需要按需求来修改条件,不能盲目使用!!!
     43         /// </summary>
     44         /// <param name="tb_TestObject">从对象中提取中要查找的字段是否存在(对象方式是防止数据注入!)</param>
     45         /// <returns></returns>
     46         public Boolean IsExistWhereFeild(tb_Test tb_TestObject)
     47         {
     48             try
     49             {
     50                 string commandText = "select count(0) from tb_Test WHERE Str1=@Str1";
     51                 SqlParameter[] parms = new SqlParameter[]{
     52                 new SqlParameter("@Str1",tb_TestObject.Str1),
     53                 };
     54                 return Convert.ToInt32(SqlHelper_DG.ExecuteScalar(SqlHelper_DG.ConnString, commandText,CommandType.Text,parms)) > 0 ? true : false;
     55             }
     56             catch (Exception)
     57             {
     58                 return false;
     59             }
     60         }
     61         /// <summary>
     62         /// Insert插入语句,返回插入的结果:成功true,失败false
     63         /// </summary>
     64         /// <param name="tb_TestObject">要插入的对象,屏蔽掉自增的字段</param>
     65         /// <returns></returns>
     66         public Boolean IsInsert(tb_Test tb_TestObject)
     67         {
     68             try
     69             {
     70                 string commandText = "INSERT INTO tb_Test ( Str1,Id2,Str2) VALUES (@Str1,@Id2,@Str2)";
     71                 SqlParameter[] parms = new SqlParameter[]{
     72                 new SqlParameter("@Str1",tb_TestObject.Str1),
     73                 new SqlParameter("@Id2",tb_TestObject.Id2),
     74                 new SqlParameter("@Str2",tb_TestObject.Str2),
     75                 };
     76                 return SqlHelper_DG.ExecuteNonQuery(SqlHelper_DG.ConnString, commandText, CommandType.Text, parms) > 0 ? true : false;
     77             }
     78             catch (Exception)
     79             {
     80                 return false;
     81             }
     82         }
     83         /// <summary>
     84         /// Update修改语句,返回修改的结果:成功true,失败false
     85         /// </summary>
     86         /// <param name="tb_TestObject">要修改的结果对象,屏蔽掉自增的列,条件可修改</param>
     87         /// <returns></returns>
     88         public Boolean IsUpdate(tb_Test tb_TestObject)
     89         {
     90             try
     91             {
     92                 string commandText = "UPDATE tb_Test SET Str1=@Str1,Id2=@Id2,Str2=@Str2 WHERE Id=@Id";
     93                 SqlParameter[] parms = new SqlParameter[]{
     94                     new SqlParameter("@Id",tb_TestObject.Id),
     95                     new SqlParameter("@Str1",tb_TestObject.Str1),
     96                     new SqlParameter("@Id2",tb_TestObject.Id2),
     97                     new SqlParameter("@Str2",tb_TestObject.Str2),
     98                 };
     99                 return SqlHelper_DG.ExecuteNonQuery(SqlHelper_DG.ConnString, commandText, CommandType.Text, parms) > 0 ? true : false;
    100             }
    101             catch (Exception)
    102             {
    103                 return false;
    104             }
    105         }
    106         /// <summary>
    107         /// Delete删除语句,返回删除的结果:成功true,失败false
    108         /// </summary>
    109         /// <param name="tb_TestObject">条件对象,唯一字段或者自定义删除条件</param>
    110         /// <returns></returns>
    111         public Boolean IsDelete(tb_Test tb_TestObject)
    112         {
    113             try
    114             {
    115                 string commandText = "DELETE FROM tb_Test WHERE Id=@Id";
    116                 SqlParameter[] parms = new SqlParameter[]{
    117                 new SqlParameter("@Id",tb_TestObject.Id),
    118                 };
    119                 return SqlHelper_DG.ExecuteNonQuery(SqlHelper_DG.ConnString, commandText, CommandType.Text, parms) > 0 ? true : false;
    120             }
    121             catch (Exception)
    122             {
    123                 return false;
    124             }
    125         }
    126         /// <summary>
    127         /// Select Model语句,返回查询的Model结果
    128         /// </summary>
    129         /// <param name="tb_TestObject">条件对象,按需求来确定查找的条件</param>
    130         /// <returns></returns>
    131         public T SelectSingleLine_RTModel<T>(tb_Test tb_TestObject)
    132         {
    133             try
    134             {
    135                 string commandText = "SELECT TOP (1) * FROM tb_Test WHERE Id=@Id";//这里需要按需求来确定需要查找的是哪个参数 因为要返回一行数据,所以搜索的条件值必须是唯一的,主键是最佳选择!
    136                 SqlParameter[] parms = new SqlParameter[]{
    137                 new SqlParameter("@Id",tb_TestObject.Id),
    138                 };
    139                 return SqlHelper_DG.ReturnModelByModels<T>(SqlHelper_DG.ExecuteReader(SqlHelper_DG.ConnString, commandText, CommandType.Text, parms));
    140             }
    141             catch (Exception)
    142             {
    143                 return default(T);
    144             }
    145         }
    146         /// <summary>
    147         /// Select List语句,返回查询的List结果集
    148         /// </summary>
    149         /// <param name="safeSqlCondition">查询的条件,从BLL层传来的安全的sql语句</param>
    150         /// <returns></returns>
    151         public List<T> SelectALL<T>(string safeSqlCondition = " 1=1 ")
    152         {
    153             try
    154             {
    155                 string commandText = "SELECT * FROM tb_Test WHERE " + safeSqlCondition;//这里修改条件语句 默认全部
    156                 return SqlHelper_DG.ReturnListByModels<T>(SqlHelper_DG.ExecuteDataSet(SqlHelper_DG.ConnString, commandText));
    157             }
    158             catch (Exception)
    159             {
    160                 return null;
    161             }
    162         }
    163         /// <summary>
    164         /// 用RowNumber方法进行分页处理返回List结果集,效率最佳但不支持低版本SqlServer
    165         /// </summary>
    166         /// <param name="PageSize">int页大小,每页容纳的行数</param>
    167         /// <param name="PageNumber">int页码,第几页</param>
    168         /// <param name="DataOrderBy">object表中按这个字段顺序排序,可以是任意字段,可以加修饰符如DESC</param>
    169         /// <param name="safeSqlCondition">所有集合中先找出符合这个条件的结果再进行分页处理 查询的条件,从BLL层传来的安全的sql语句</param>
    170         /// <returns></returns>
    171         public List<T> SelectALLPaginByRowNumber<T>(int PageSize, int PageNumber, string DataOrderBy,string safeSqlCondition="1=1")
    172         {
    173             try
    174             {
    175                 StringBuilder commandText=new StringBuilder ();
    176                 commandText.Append("SELECT TOP " + PageSize + " * FROM (SELECT ROW_NUMBER() OVER (ORDER BY " + DataOrderBy + ") AS RowNumber,* FROM tb_Test ");
    177                 commandText.Append(" WHERE " + safeSqlCondition + " ");//这里修改条件语句
    178                 commandText.Append(" ) AS T  WHERE RowNumber > (" + PageSize + "*(" + PageNumber + "-1))");
    179                 return SqlHelper_DG.ReturnListByModels<T>(SqlHelper_DG.ExecuteDataSet(SqlHelper_DG.ConnString, commandText.ToString()));
    180             }
    181             catch (Exception)
    182             {
    183                 return null;
    184             }
    185         }
    186     }
    187 }
    tb_TestService

    写到这里,相信大家都已经对ORM框架的实现机制有一定的了解,并且能完美的实现一个SqlHelper来进行对自己数据访问代码的封装!如果喜欢,大家可以进一步对Service层的代码进行封装放到一个类里面,更加方便自己对数据库的访问,可以更加简便地访问数据库,有朝一日写出一个属于自己的ORM框架!


    有关于 Java 的 DBUtils 介绍详情请参考:http://www.cnblogs.com/qixiaoyizhan/p/5818599.html

    2016-08-29 16:44:12

    本文为七小站主原创作品,转载请注明出处:http://www.cnblogs.com/qixiaoyizhan/

    本文为七小站主原创作品,转载请注明出处:http://www.cnblogs.com/7tiny/ 且在文章页面明显位置给出原文链接。

    作者信息(详情):

    QiXiao_柒小(東)
    Software Development
    北京市海淀区 Haidian Area Beijing 100089,P.R.China
    郵箱Email : seventiny@foxmail.com  
    網址Http: http://www.7tiny.com
    QQ:1124999434 , WeChat: wd8622088 (尽量加微信)
    (专好结交天下英雄好汉,可聊天,可谈技,可约饭,可..嗯,原则是要有的~) 更多联系方式点我哦~


    Best Regard ~
  • 相关阅读:
    matlab中 数据保留有效位数
    matlab的m程序转执行文件exe
    MFC创建好的对话框如何移植到新程序中
    STM32 ADC转换时间
    MFC修改窗口无标题和标题信息,修改执执行文件图标
    兔子慢的原因
    core2.1独立布署,报错的原因。
    修复安卓的bug
    2018-11-21 ko.pureComputed的使用
    2018-11-17 js的this引起的血案
  • 原文地址:https://www.cnblogs.com/7tiny/p/5818298.html
Copyright © 2011-2022 走看看