两个半成品的ORM

  • A+
所属分类:.NET技术
摘要

只要是有点结构化的思想,不可能项目里一个sqlHelper 满天飞 到处写 ,最终你的c#代码还是得返回一个Class 才好操作,sqlhelper, datatable这种东西也只是临时将就一下,稍微先进一点的思想会用一种结构化的思想把数据访问用面向对象的方式包装成一个层,比如普创 都把各个表名字 字段名字 专门用Columbus类定义了,普创的数据访问层确实是个糟糕的设计 通过Columns 反而增加了复杂度 ,不过好歹还有那么点意识在 好歹定义了列名 不会语句写乱了分不清东南西北,当然这个东西看你怎么权衡 ,比如我以前一直都是一个sqlHelper 满天飞 ,容我做个悲伤的表情。

只要是有点结构化的思想,不可能项目里一个sqlHelper 满天飞 到处写 ,最终你的c#代码还是得返回一个Class 才好操作,sqlhelper, datatable这种东西也只是临时将就一下,稍微先进一点的思想会用一种结构化的思想把数据访问用面向对象的方式包装成一个层,比如普创 都把各个表名字 字段名字 专门用Columbus类定义了,普创的数据访问层确实是个糟糕的设计 通过Columns 反而增加了复杂度 ,不过好歹还有那么点意识在 好歹定义了列名 不会语句写乱了分不清东南西北,当然这个东西看你怎么权衡 ,比如我以前一直都是一个sqlHelper 满天飞 ,容我做个悲伤的表情。

分享两个以前项目刀耕火种的ORM半成品

一个是08年的时候 记得是一个李远志的朋友 推的 ,不知他是哪里抄的还是自创的,当时心智没这么成熟 没考虑到什么
面向对象设计 和通用 ,现在看到现公司的数据库访问设计 感觉好像 天下思想殊途同归。当时08年.net3.5都还刚推出 好多都是以前那种晦涩的C++开发方式 。EntityFramework也还没推出 好多都还没有结构 和面向对象这个概念在脑子里 泛型都还少有人用 ,这在当时感觉还是一种表面上蛮新进的一种结构设计方式,至少表面上充分的利用到了面向对象 和继承 ,以及泛型这些特性。这么多年我一直到今天才把翻出来看。

第一个(08年的):

开始当然是实体的定义

 1 public class Clazz  2 {  3     private long classId;  4   5     public long ClassId  6     {  7         get { return classId; }  8         set { classId = value; }  9     } 10  11     private string className; 12  13     public string ClassName 14     { 15         get { return className; } 16         set { className = value; } 17     } 18 }

接着自然是DAL层,巧妙的利用了继承两个接口的特性 ,一个接口封装了sqlhelper实现 另外一个接口 定义了相关数据访问有哪些通用方法

SQL helper封装:

  1 internal abstract class AbstractDAL   2 {   3     private IDbConnection con;   4    5     private IDbTransaction tran;   6    7     #region 构造方法   8    9     protected AbstractDAL()  10     {  11         this.con = ADOHlper.CreateIDbConnection();  12     }  13   14     protected AbstractDAL(IDbConnection con)  15     {  16         if ((this.con = con) == null)  17             this.con = ADOHlper.CreateIDbConnection();  18     }  19   20     protected AbstractDAL(IDbTransaction tran)  21     {  22         if ((this.tran = tran) == null)  23         {  24             this.con = ADOHlper.CreateIDbConnection();  25         }  26         else  27         {  28             this.con = this.tran.Connection;  29             if (this.con == null || this.con.State != ConnectionState.Open)  30                 throw new ArgumentException("非法的事务参数,其连接必须存在且处于被打开状态");  31         }  32     }  33   34     #endregion  35   36     #region 创建 SQL 命令  37   38     protected IDbCommand CreateIDbCommand(string commandText, CommandType commandType)  39     {  40         IDbCommand cmd = this.con.CreateCommand();  41         cmd.Transaction = this.tran;  42         cmd.CommandText = commandText;  43         cmd.CommandType = commandType;  44         return cmd;  45     }  46   47     protected IDbCommand CreateIDbCommand(string commandText)  48     { return CreateIDbCommand(commandText, CommandType.Text); }  49   50     protected IDbCommand CreateIDbCommand(CommandType commandType)  51     { return CreateIDbCommand(null, commandType); }  52   53     protected IDbCommand CreateIDbCommand()  54     { return CreateIDbCommand(null, CommandType.Text); }  55   56     #endregion  57   58     #region 执行委托  59   60     protected T Execute<T>(ExecuteHandler<T> handler)  61     {  62         if (handler == null)  63             throw new ArgumentNullException("handler<T>参数不能为空");  64   65         if (this.tran != null && this.con.State != ConnectionState.Open)  66             throw new InvalidOperationException("非法操作,当前存在事务,但其连接不处于被打开状态");  67         if (this.con.State == ConnectionState.Open)  68         {  69             return handler();  70         }  71         else  72         {  73             this.con.Open();  74             try  75             {  76                 return handler();  77             }  78             finally  79             {  80                 this.con.Close();  81             }  82         }  83     }  84   85     protected void Execute(ExecuteHandler handler)  86     {  87         if (handler == null)  88             throw new ArgumentNullException("handler参数不能为空");  89   90         if (this.tran != null && this.con.State != ConnectionState.Open)  91             throw new InvalidOperationException("非法操作,当前存在事务,但其连接不处于被打开状态");  92   93         if (this.con.State == ConnectionState.Open)  94         {  95             handler();  96         }  97         else  98         {  99             this.con.Open(); 100             try 101             { 102                 handler(); 103             } 104             finally 105             { 106                 this.con.Close(); 107             } 108         } 109     } 110  111     #endregion 112 }

sqlhelper:

 1 public static class ADOHlper  2 {  3     private const string CONFING_KEY = "DBconnection";  4   5     private static string connectionString;  6   7     static ADOHlper()  8     {  9         connectionString = WebConfigurationManager.ConnectionStrings[CONFING_KEY].ConnectionString; 10         if (connectionString == null) 11             throw new InvalidOperationException("从配置文件读取连接字符串异常"); 12     } 13  14     //创建连接 15     public static IDbConnection CreateIDbConnection() 16     { return new SqlConnection(connectionString); } 17  18     //创建数据适配器 19     public static IDbDataAdapter CreateIDbDataAdapter() 20     { return new SqlDataAdapter(); } 21  22     #region 添加参数方法 23  24     public static void AddInPrameter(IDbCommand cmd, string prameterName, DbType dbType, int size, object value) 25     { 26         IDbDataParameter parameter = cmd.CreateParameter(); 27         parameter.ParameterName = prameterName; 28         parameter.DbType = dbType; 29         parameter.Size = size; 30         parameter.Value = value != null ? value : DBNull.Value; 31         cmd.Parameters.Add(parameter); 32     } 33  34     public static void AddInPrameter(IDbCommand cmd, string prameterName, DbType dbType, object value) 35     { 36         AddInPrameter(cmd, prameterName, dbType, 0, value); 37     } 38  39     #endregion 40 }

特定类的数据访问定义:

1 public interface IClassDAL 2 { 3     DataSet GetClasses(); 4     void SaveClass(Clazz clazz); 5     void UpdateClass(Clazz clazz); 6     void DeleteClass(long classId); 7 }

最后的主角 通过接口泛化到最终的 数据访问实现 ,运用泛型委托 让底层去执行数据操作

 1 internal class ClassDALImpl : AbstractDAL, IClassDAL  2 {  3     public ClassDALImpl() { }  4     public ClassDALImpl(IDbConnection con) : base(con) { }  5     public ClassDALImpl(IDbTransaction tran) : base(tran) { }  6     public DataSet GetClasses()  7     {  8         ExecuteHandler<DataSet> handler =  9             delegate 10             { 11                 IDbCommand cmd = this.CreateIDbCommand("SELECT * FROM Class"); 12                 IDbDataAdapter dapter = ADOHlper.CreateIDbDataAdapter(); 13                 dapter.SelectCommand = cmd; 14                 dapter.TableMappings.Add("Table", "Class"); 15                 DataSet dataSet = new DataSet(); 16                 dapter.Fill(dataSet); 17                 return dataSet; 18             }; 19         return this.Execute(handler); 20     } 21  22     public void SaveClass(Clazz clazz) 23     { 24         ExecuteHandler handler = 25             delegate 26             { 27                 IDbCommand cmd = this.CreateIDbCommand("INSERT INTO Class VALUES(@ClassName)"); 28                 ADOHlper.AddInPrameter(cmd, "@ClassName", DbType.AnsiString, 50, clazz.ClassName); 29                 cmd.ExecuteNonQuery(); 30  31                 IDbCommand ideCmd = this.CreateIDbCommand("SELECT @@IDENTITY"); 32                 clazz.ClassId = (int)ideCmd.ExecuteScalar(); 33             }; 34         this.Execute(handler); 35     } 36  37     public void UpdateClass(Clazz clazz) 38     { 39         ExecuteHandler handler = 40            delegate 41            { 42                IDbCommand cmd = this.CreateIDbCommand("UPDATE Class SET ClassName = @ClassName"); 43                ADOHlper.AddInPrameter(cmd, "@ClassName", DbType.AnsiString, 50, clazz.ClassName); 44                cmd.ExecuteNonQuery(); 45            }; 46         this.Execute(handler); 47     } 48  49     public void DeleteClass(long classId) 50     { 51         ExecuteHandler handler = 52            delegate 53            { 54                IDbCommand cmd = this.CreateIDbCommand("DELETE Class WHERE ClassId = @ClassId"); 55                ADOHlper.AddInPrameter(cmd, "@ClassId", DbType.Int64, classId); 56                cmd.ExecuteNonQuery(); 57            }; 58         this.Execute(handler); 59     } 60 }

最终通过工厂模式 统一给出实例

1 public static class FactoryDAL 2 { 3     public static IClassDAL CreateClassDAL() 4     { return new test.DAL.Impl.ClassDALImpl(); } 5 }

但是最终还是让各种数据操作溢出到了最终实现,没有良好的利用继承实现高内聚,跟用SQLhelper差别不大,所以算不得一个好的实现。

 

第二个(应该是大约2017年的):

这种才是稍微靠谱的方式:

首先是列定义 也可理解为实体定义

 1 public class Ht_autoprint_Column  2 {  3     public static string HColName_ID = "ID";  4     public static string HColName_CardNo = "CardNo";  5     protected string _tableName = "t_autoprint";  6     private string _id;  7     private string _cardno;  8     public string ID  9     { 10         get 11         { 12             return _id; 13         } 14         set 15         { 16             _id = value; 17         } 18     } 19  20     public string CardNo 21     { 22         get 23         { 24             return _cardno; 25         } 26         set 27         { 28             _cardno = value; 29         } 30     } 31 }    

 

主要的机关是 利用了 BaseTableDB的类 ,利用反射列属性完成增删改查 ,可以理解为一种灵活的sqlhelper:

  1 public class baseTableDB<T> where T : new()   2 {   3     private string _connString;   4    5     private string _tableName;   6    7     private Exception _errorInfo;   8    9     public Exception ErrorInfo => _errorInfo;  10   11     public bool Init(string connString, string tbleName)  12     {  13         _connString = connString;  14         _tableName = tbleName;  15         return true;  16     }  17   18     public bool Init(string ip, string port, string datebase, string user, string pwd)  19     {  20         try  21         {  22             _connString = $"Server={ip};Port={port};Database={datebase}; User={user};Password={pwd};";  23             return true;  24         }  25         catch (Exception errorInfo)  26         {  27             Exception ex = _errorInfo = errorInfo;  28             return false;  29         }  30     }  31   32     private object GetValue(object o)  33     {  34         if (o.GetType() == typeof(char))  35         {  36             return Convert.ToChar(o);  37         }  38         if (o.GetType() == typeof(int))  39         {  40             return Convert.ToInt32(o);  41         }  42         if (o.GetType() == typeof(double))  43         {  44             return Convert.ToDouble(o);  45         }  46         if (o.GetType() == typeof(float))  47         {  48             return Convert.ToSingle(o);  49         }  50         if (o.GetType() == typeof(DateTime))  51         {  52             return Convert.ToDateTime(o);  53         }  54         if (o.GetType() == typeof(decimal))  55         {  56             return Convert.ToDecimal(o);  57         }  58         return o.ToString();  59     }  60   61     private string GetValue(Type type, object o)  62     {  63         try  64         {  65             if (type == typeof(int) || type == typeof(double) || type == typeof(float) ||   66 type == typeof(decimal) || type == typeof(int?) || type == typeof(double?) ||   67 type == typeof(float?) || type == typeof(decimal?))  68             {  69                 return o.ToString();  70             }  71             return "'" + o.ToString() + "'";  72         }  73         catch  74         {  75             return "null";  76         }  77     }  78   79     public IList<T> baseSelect(string sql)  80     {  81         IList<T> htAutoprintColumnList = new List<T>();  82         MySqlConnection conn = new MySqlConnection(_connString);  83         try  84         {  85             conn.Open();  86             MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(new MySqlCommand(sql, conn));  87             DataTable dataTable = new DataTable();  88             mySqlDataAdapter.Fill(dataTable);  89             foreach (DataRow row in dataTable.Rows)  90             {  91                 T col = new T();  92                 PropertyInfo[] properties = col.GetType().GetProperties();  93                 foreach (PropertyInfo p in properties)  94                 {  95                     if (dataTable.Columns.Contains(p.Name) && row[p.Name] != DBNull.Value)  96                     {  97                         p.SetValue(col, GetValue(row[p.Name]), null);  98                     }  99                 } 100                 htAutoprintColumnList.Add(col); 101             } 102             return htAutoprintColumnList; 103         } 104         catch (Exception errorInfo) 105         { 106             Exception ex = _errorInfo = errorInfo; 107             return htAutoprintColumnList; 108         } 109         finally 110         { 111             conn.Close(); 112         } 113     } 114  115     public IList<T> Select() 116     { 117         IList<T> htAutoprintColumnList = new List<T>(); 118         MySqlConnection conn = new MySqlConnection(_connString); 119         try 120         { 121             conn.Open(); 122             MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(new MySqlCommand($"select * from {_tableName}", conn)); 123             DataTable dataTable = new DataTable(); 124             mySqlDataAdapter.Fill(dataTable); 125             foreach (DataRow row in dataTable.Rows) 126             { 127                 DataRow row2 = row; 128                 T col = new T(); 129                 col.GetType().GetProperties().ToList() 130                     .ForEach(delegate(PropertyInfo u) 131                     { 132                         u.SetValue(col, (row2[u.Name] == DBNull.Value) ? null : GetValue(row2[u.Name]), null); 133                     }); 134                 htAutoprintColumnList.Add(col); 135             } 136             return htAutoprintColumnList; 137         } 138         catch (Exception errorInfo) 139         { 140             Exception ex = _errorInfo = errorInfo; 141             return htAutoprintColumnList; 142         } 143         finally 144         { 145             conn.Close(); 146         } 147     } 148  149     public IList<T> Select(string where) 150     { 151         string sql = $"select * from {_tableName} where {where}"; 152         return baseSelect(sql); 153     } 154  155     public IList<T> Select(T where) 156     { 157         string sql = $"select * from {_tableName} where {GetWhere(where)}"; 158         return baseSelect(sql); 159     } 160  161     public bool InsertInto(T info) 162     { 163         MySqlConnection conn = new MySqlConnection(_connString); 164         try 165         { 166             conn.Open(); 167             string sqlColName = ""; 168             string sqlColValues = ""; 169             int i = 0; 170             info.GetType().GetProperties().ToList() 171                 .ForEach(delegate(PropertyInfo u) 172                 { 173                     if (1 == i) 174                     { 175                         sqlColName += ", "; 176                         sqlColValues += ", "; 177                     } 178                     sqlColName += u.Name; 179                     sqlColValues += GetValue(u.PropertyType, u.GetValue(info, null)); 180                     i = 1; 181                 }); 182             new MySqlCommand($"insert into {_tableName}({sqlColName}) values({sqlColValues})", conn).ExecuteNonQuery(); 183             return true; 184         } 185         catch (Exception errorInfo) 186         { 187             Exception ex = _errorInfo = errorInfo; 188             return false; 189         } 190         finally 191         { 192             conn.Close(); 193         } 194     } 195  196     public bool Update(T set, string where) 197     { 198         MySqlConnection conn = new MySqlConnection(_connString); 199         try 200         { 201             conn.Open(); 202             string sqlSet = ""; 203             int i = 0; 204             set.GetType().GetProperties().ToList() 205                 .ForEach(delegate(PropertyInfo u) 206                 { 207                     if (u.GetValue(set, null) != null) 208                     { 209                         if (1 == i) 210                         { 211                             sqlSet += ", "; 212                         } 213                         sqlSet = sqlSet + u.Name + "=" + GetValue(u.PropertyType, u.GetValue(set, null)); 214                         i = 1; 215                     } 216                 }); 217             return new MySqlCommand($"Update {_tableName} set {sqlSet} where {where}", conn).ExecuteNonQuery() != 0; 218         } 219         catch (Exception errorInfo) 220         { 221             Exception ex = _errorInfo = errorInfo; 222             return false; 223         } 224         finally 225         { 226             conn.Close(); 227         } 228     } 229  230     public bool Update(string set, string where) 231     { 232         MySqlConnection conn = new MySqlConnection(_connString); 233         try 234         { 235             conn.Open(); 236             return new MySqlCommand($"Update {_tableName} set {set} where {where}", conn).ExecuteNonQuery() != 0; 237         } 238         catch (Exception errorInfo) 239         { 240             throw _errorInfo = errorInfo; 241         } 242         finally 243         { 244             conn.Close(); 245         } 246     } 247  248     public bool baseUpdate(string sql) 249     { 250         MySqlConnection conn = new MySqlConnection(_connString); 251         try 252         { 253             conn.Open(); 254             return new MySqlCommand(sql, conn).ExecuteNonQuery() != 0; 255         } 256         catch (Exception errorInfo) 257         { 258             throw new Exception($"sql:{sql}, ex:{(_errorInfo = errorInfo).ToString()}"); 259         } 260         finally 261         { 262             conn.Close(); 263         } 264     } 265  266     public bool Update(string set, T where) 267     { 268         string sql = $"Update {_tableName} set {set} where {GetWhere(where)}"; 269         return baseUpdate(sql); 270     } 271  272     public bool Update(T set, T where) 273     { 274         string sqlSet = ""; 275         int i = 0; 276         set.GetType().GetProperties().ToList() 277             .ForEach(delegate(PropertyInfo u) 278             { 279                 if (u.GetValue(set, null) != null) 280                 { 281                     if (1 == i) 282                     { 283                         sqlSet += ", "; 284                     } 285                     sqlSet = sqlSet + u.Name + "=" + GetValue(u.PropertyType, u.GetValue(set, null)); 286                     i = 1; 287                 } 288             }); 289         string sql = $"Update {_tableName} set {sqlSet} where {GetWhere(where)}"; 290         return baseUpdate(sql); 291     } 292  293     public bool Delete(T where) 294     { 295         string sql = $"delete from {_tableName} where {GetWhere(where)}"; 296         return baseUpdate(sql); 297     } 298  299     public bool Delete(string where) 300     { 301         string sql = $"delete from {_tableName} where {where}"; 302         return baseUpdate(sql); 303     } 304  305     public DataTable ExecuteQuery(string sql) 306     { 307         new List<T>(); 308         MySqlConnection conn = new MySqlConnection(_connString); 309         try 310         { 311             conn.Open(); 312             MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(new MySqlCommand($"select * from {_tableName}", conn)); 313             DataTable dataTable = new DataTable(); 314             mySqlDataAdapter.Fill(dataTable); 315             return dataTable; 316         } 317         catch (Exception errorInfo) 318         { 319             Exception ex = _errorInfo = errorInfo; 320             return null; 321         } 322         finally 323         { 324             conn.Close(); 325         } 326     } 327  328     public bool ExecuteNonQuery(string sql) 329     { 330         return baseUpdate(sql); 331     } 332  333     private string GetWhere(T where) 334     { 335         string sqlWhere = ""; 336         int i = 0; 337         where.GetType().GetProperties().ToList() 338             .ForEach(delegate(PropertyInfo u) 339             { 340                 if (u.GetValue(where, null) != null) 341                 { 342                     if (1 == i) 343                     { 344                         sqlWhere += " and "; 345                     } 346                     sqlWhere = sqlWhere + u.Name + "=" + GetValue(u.PropertyType, u.GetValue(where, null)); 347                     i = 1; 348                 } 349             }); 350         return sqlWhere; 351     } 352 }

最后使用继承实体属性 配合sqlhelper的方式完成增删改查

  1 public class baseTableDB<T> where T : new()   2 {   3     private string _connString;   4    5     private string _tableName;   6    7     private Exception _errorInfo;   8    9     public Exception ErrorInfo => _errorInfo;  10   11     public bool Init(string connString, string tbleName)  12     {  13         _connString = connString;  14         _tableName = tbleName;  15         return true;  16     }  17   18     public bool Init(string ip, string port, string datebase, string user, string pwd)  19     {  20         try  21         {  22             _connString = $"Server={ip};Port={port};Database={datebase}; User={user};Password={pwd};";  23             return true;  24         }  25         catch (Exception errorInfo)  26         {  27             Exception ex = _errorInfo = errorInfo;  28             return false;  29         }  30     }  31   32     private object GetValue(object o)  33     {  34         if (o.GetType() == typeof(char))  35         {  36             return Convert.ToChar(o);  37         }  38         if (o.GetType() == typeof(int))  39         {  40             return Convert.ToInt32(o);  41         }  42         if (o.GetType() == typeof(double))  43         {  44             return Convert.ToDouble(o);  45         }  46         if (o.GetType() == typeof(float))  47         {  48             return Convert.ToSingle(o);  49         }  50         if (o.GetType() == typeof(DateTime))  51         {  52             return Convert.ToDateTime(o);  53         }  54         if (o.GetType() == typeof(decimal))  55         {  56             return Convert.ToDecimal(o);  57         }  58         return o.ToString();  59     }  60   61     private string GetValue(Type type, object o)  62     {  63         try  64         {  65             if (type == typeof(int) || type == typeof(double) || type == typeof(float) ||  66  type == typeof(decimal) || type == typeof(int?) || type == typeof(double?) ||   67 type == typeof(float?) || type == typeof(decimal?))  68             {  69                 return o.ToString();  70             }  71             return "'" + o.ToString() + "'";  72         }  73         catch  74         {  75             return "null";  76         }  77     }  78   79     public IList<T> baseSelect(string sql)  80     {  81         IList<T> htAutoprintColumnList = new List<T>();  82         MySqlConnection conn = new MySqlConnection(_connString);  83         try  84         {  85             conn.Open();  86             MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(new MySqlCommand(sql, conn));  87             DataTable dataTable = new DataTable();  88             mySqlDataAdapter.Fill(dataTable);  89             foreach (DataRow row in dataTable.Rows)  90             {  91                 T col = new T();  92                 PropertyInfo[] properties = col.GetType().GetProperties();  93                 foreach (PropertyInfo p in properties)  94                 {  95                     if (dataTable.Columns.Contains(p.Name) && row[p.Name] != DBNull.Value)  96                     {  97                         p.SetValue(col, GetValue(row[p.Name]), null);  98                     }  99                 } 100                 htAutoprintColumnList.Add(col); 101             } 102             return htAutoprintColumnList; 103         } 104         catch (Exception errorInfo) 105         { 106             Exception ex = _errorInfo = errorInfo; 107             return htAutoprintColumnList; 108         } 109         finally 110         { 111             conn.Close(); 112         } 113     } 114  115     public IList<T> Select() 116     { 117         IList<T> htAutoprintColumnList = new List<T>(); 118         MySqlConnection conn = new MySqlConnection(_connString); 119         try 120         { 121             conn.Open(); 122             MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(new MySqlCommand($"select * from {_tableName}", conn)); 123             DataTable dataTable = new DataTable(); 124             mySqlDataAdapter.Fill(dataTable); 125             foreach (DataRow row in dataTable.Rows) 126             { 127                 DataRow row2 = row; 128                 T col = new T(); 129                 col.GetType().GetProperties().ToList() 130                     .ForEach(delegate(PropertyInfo u) 131                     { 132                         u.SetValue(col, (row2[u.Name] == DBNull.Value) ? null : GetValue(row2[u.Name]), null); 133                     }); 134                 htAutoprintColumnList.Add(col); 135             } 136             return htAutoprintColumnList; 137         } 138         catch (Exception errorInfo) 139         { 140             Exception ex = _errorInfo = errorInfo; 141             return htAutoprintColumnList; 142         } 143         finally 144         { 145             conn.Close(); 146         } 147     } 148  149     public IList<T> Select(string where) 150     { 151         string sql = $"select * from {_tableName} where {where}"; 152         return baseSelect(sql); 153     } 154  155     public IList<T> Select(T where) 156     { 157         string sql = $"select * from {_tableName} where {GetWhere(where)}"; 158         return baseSelect(sql); 159     } 160  161     public bool InsertInto(T info) 162     { 163         MySqlConnection conn = new MySqlConnection(_connString); 164         try 165         { 166             conn.Open(); 167             string sqlColName = ""; 168             string sqlColValues = ""; 169             int i = 0; 170             info.GetType().GetProperties().ToList() 171                 .ForEach(delegate(PropertyInfo u) 172                 { 173                     if (1 == i) 174                     { 175                         sqlColName += ", "; 176                         sqlColValues += ", "; 177                     } 178                     sqlColName += u.Name; 179                     sqlColValues += GetValue(u.PropertyType, u.GetValue(info, null)); 180                     i = 1; 181                 }); 182             new MySqlCommand($"insert into {_tableName}({sqlColName}) values({sqlColValues})", conn).ExecuteNonQuery(); 183             return true; 184         } 185         catch (Exception errorInfo) 186         { 187             Exception ex = _errorInfo = errorInfo; 188             return false; 189         } 190         finally 191         { 192             conn.Close(); 193         } 194     } 195  196     public bool Update(T set, string where) 197     { 198         MySqlConnection conn = new MySqlConnection(_connString); 199         try 200         { 201             conn.Open(); 202             string sqlSet = ""; 203             int i = 0; 204             set.GetType().GetProperties().ToList() 205                 .ForEach(delegate(PropertyInfo u) 206                 { 207                     if (u.GetValue(set, null) != null) 208                     { 209                         if (1 == i) 210                         { 211                             sqlSet += ", "; 212                         } 213                         sqlSet = sqlSet + u.Name + "=" + GetValue(u.PropertyType, u.GetValue(set, null)); 214                         i = 1; 215                     } 216                 }); 217             return new MySqlCommand($"Update {_tableName} set {sqlSet} where {where}", conn).ExecuteNonQuery() != 0; 218         } 219         catch (Exception errorInfo) 220         { 221             Exception ex = _errorInfo = errorInfo; 222             return false; 223         } 224         finally 225         { 226             conn.Close(); 227         } 228     } 229  230     public bool Update(string set, string where) 231     { 232         MySqlConnection conn = new MySqlConnection(_connString); 233         try 234         { 235             conn.Open(); 236             return new MySqlCommand($"Update {_tableName} set {set} where {where}", conn).ExecuteNonQuery() != 0; 237         } 238         catch (Exception errorInfo) 239         { 240             throw _errorInfo = errorInfo; 241         } 242         finally 243         { 244             conn.Close(); 245         } 246     } 247  248     public bool baseUpdate(string sql) 249     { 250         MySqlConnection conn = new MySqlConnection(_connString); 251         try 252         { 253             conn.Open(); 254             return new MySqlCommand(sql, conn).ExecuteNonQuery() != 0; 255         } 256         catch (Exception errorInfo) 257         { 258             throw new Exception($"sql:{sql}, ex:{(_errorInfo = errorInfo).ToString()}"); 259         } 260         finally 261         { 262             conn.Close(); 263         } 264     } 265  266     public bool Update(string set, T where) 267     { 268         string sql = $"Update {_tableName} set {set} where {GetWhere(where)}"; 269         return baseUpdate(sql); 270     } 271  272     public bool Update(T set, T where) 273     { 274         string sqlSet = ""; 275         int i = 0; 276         set.GetType().GetProperties().ToList() 277             .ForEach(delegate(PropertyInfo u) 278             { 279                 if (u.GetValue(set, null) != null) 280                 { 281                     if (1 == i) 282                     { 283                         sqlSet += ", "; 284                     } 285                     sqlSet = sqlSet + u.Name + "=" + GetValue(u.PropertyType, u.GetValue(set, null)); 286                     i = 1; 287                 } 288             }); 289         string sql = $"Update {_tableName} set {sqlSet} where {GetWhere(where)}"; 290         return baseUpdate(sql); 291     } 292  293     public bool Delete(T where) 294     { 295         string sql = $"delete from {_tableName} where {GetWhere(where)}"; 296         return baseUpdate(sql); 297     } 298  299     public bool Delete(string where) 300     { 301         string sql = $"delete from {_tableName} where {where}"; 302         return baseUpdate(sql); 303     } 304  305     public DataTable ExecuteQuery(string sql) 306     { 307         new List<T>(); 308         MySqlConnection conn = new MySqlConnection(_connString); 309         try 310         { 311             conn.Open(); 312             MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(new MySqlCommand($"select * from {_tableName}", conn)); 313             DataTable dataTable = new DataTable(); 314             mySqlDataAdapter.Fill(dataTable); 315             return dataTable; 316         } 317         catch (Exception errorInfo) 318         { 319             Exception ex = _errorInfo = errorInfo; 320             return null; 321         } 322         finally 323         { 324             conn.Close(); 325         } 326     } 327  328     public bool ExecuteNonQuery(string sql) 329     { 330         return baseUpdate(sql); 331     } 332  333     private string GetWhere(T where) 334     { 335         string sqlWhere = ""; 336         int i = 0; 337         where.GetType().GetProperties().ToList() 338             .ForEach(delegate(PropertyInfo u) 339             { 340                 if (u.GetValue(where, null) != null) 341                 { 342                     if (1 == i) 343                     { 344                         sqlWhere += " and "; 345                     } 346                     sqlWhere = sqlWhere + u.Name + "=" + GetValue(u.PropertyType, u.GetValue(where, null)); 347                     i = 1; 348                 } 349             }); 350         return sqlWhere; 351     } 352 }

 什么sugar啊各种ORM之类的也可以看到人类一路走过来都在造这些玩意儿 ,回望过去这些半成品 也算是有一些影子在里面吧。