1 /*********************************************************2 * CopyRight: QIXIAO CODE BUILDER.3 * Version:4.2.04 * Author:qixiao(柒小)5 * Create:2017-9-26 17:41:426 * Update:2017-9-26 17:41:427 * E-mail: dong@qixiao.me | wd8622088@foxmail.com8 * GitHub:https://github.com/dong666
9 * Personal web site:http://qixiao.me
10 * Technical WebSit:http://www.cnblogs.com/qixiaoyizhan/
11 * Description:12 * Thx , Best Regards ~13 *********************************************************/
14 usingMySql.Data.MySqlClient;15 usingOracle.ManagedDataAccess.Client;16 usingQX_Frame.Bantina.Options;17 usingSystem;18 usingSystem.Collections.Generic;19 usingSystem.ComponentModel;20 usingSystem.Data;21 usingSystem.Data.Common;22 usingSystem.Data.SqlClient;23 usingSystem.Linq;24 usingSystem.Reflection;25
26 namespaceQX_Frame.Bantina27 {28 public abstract classDb_Helper_DG29 {30 #region ConnString 链接字符串声明
31
32 ///
33 ///连接字符串 ConnString_Default 默认,且赋值时会直接覆盖掉读写34 ///
35 private static string _connString =Configs.QX_Frame_Helper_DG_Config.ConnectionString_DB_QX_Frame_Default;36 public static stringConnString_Default37 {38 get { return_connString; }39 set
40 {41 _connString =value;42 ConnString_RW =_connString;43 ConnString_R =_connString;44 }45 }46 ///
47 ///连接字符串 ConnString_RW 读写数据库使用48 ///
49 public static string ConnString_RW =_connString;50 ///
51 ///连接字符串 ConnString_R 读数据库使用52 ///
53 public static string ConnString_R =_connString;54 ///
55 ///DataBaseType Select default:sqlserver56 ///
57 public static Opt_DataBaseType dataBaseType =Configs.QX_Frame_Helper_DG_Config.DataBaseType;58
59 #endregion
60
61 staticDb_Helper_DG()62 {63 //if (string.IsNullOrEmpty(ConnString_RW) || string.IsNullOrEmpty(ConnString_R))64 //{65 //throw new ArgumentNullException("ConnString Can Not Be Null !");66 //}
67 }68
69 #region ExcuteNonQuery 执行sql语句或者存储过程,返回影响的行数---ExcuteNonQuery
70 ///
71 ///执行sql语句或存储过程,返回受影响的行数,不带参数。72 ///
73 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
74 /// sql语句或存储过程名称
75 /// 命令类型 有默认值CommandType.Text
76 /// 返回受影响的行数
77 public static int ExecuteNonQuery(string commandTextOrSpName, CommandType commandType =CommandType.Text)78 {79 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_RW))80 {81 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))82 {83 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType);84 returncmd.DbCommand.ExecuteNonQuery();85 }86 }87 }88 ///
89 ///执行sql语句或存储过程,返回受影响的行数。90 ///
91 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
92 /// sql语句或存储过程名称
93 /// 命令类型 t
94 /// SqlParameter[]参数数组,允许空
95 /// 返回受影响的行数
96 public static int ExecuteNonQuery(string commandTextOrSpName, CommandType commandType, paramsDbParameter[] parms)97 {98 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_RW))99 {100 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))101 {102 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, parms);//参数增加了commandType 可以自己编辑执行方式
103 returncmd.DbCommand.ExecuteNonQuery();104 }105 }106 }107 ///
108 ///执行sql命令,返回受影响的行数。109 ///
110 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
111 /// sql语句或存储过程名称
112 /// 命令类型
113 /// object[]参数数组,允许空
114 /// 返回受影响的行数
115 public static int ExecuteNonQuery(string commandTextOrSpName, CommandType commandType, params object[] obj)116 {117 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_RW))118 {119 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))120 {121 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, obj);//参数增加了commandType 可以自己编辑执行方式
122 returncmd.DbCommand.ExecuteNonQuery();123 }124 }125 }126 #endregion
127
128 #region ExecuteScalar 执行sql语句或者存储过程,执行单条语句,返回单个结果---ScalarExecuteScalar
129 ///
130 ///执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)不带参数131 ///
132 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
133 /// sql语句或存储过程名称
134 /// 命令类型 有默认值CommandType.Text
135 ///
136 public static object ExecuteScalar(string commandTextOrSpName, CommandType commandType =CommandType.Text)137 {138 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW))139 {140 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))141 {142 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType);143 returncmd.DbCommand.ExecuteScalar();144 }145 }146 }147 ///
148 ///执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)149 ///
150 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
151 /// sql语句或存储过程名称
152 /// 命令类型
153 /// SqlParameter[]参数数组,允许空
154 ///
155 public static object ExecuteScalar(string commandTextOrSpName, CommandType commandType, paramsDbParameter[] parms)156 {157 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW))158 {159 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))160 {161 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, parms);162 returncmd.DbCommand.ExecuteScalar();163 }164
165 }166 }167 ///
168 ///执行sql语句或存储过程 返回ExecuteScalar (返回自增的ID)169 ///
170 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
171 /// sql语句或存储过程名称
172 /// 命令类型
173 /// object[]参数数组,允许空
174 ///
175 public static object ExecuteScalar(string commandTextOrSpName, CommandType commandType, params object[] obj)176 {177 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW))178 {179 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))180 {181 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, obj);182 returncmd.DbCommand.ExecuteScalar();183 }184 }185 }186 #endregion
187
188 #region ExecuteScalar 执行sql语句或者存储过程,返回DataReader---DaataReader
189 ///
190 ///执行sql语句或存储过程 返回DataReader 不带参数191 ///
192 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
193 /// sql语句或存储过程名称
194 /// 命令类型 有默认值CommandType.Text
195 ///
196 public static DbDataReader ExecuteReader(string commandTextOrSpName, CommandType commandType =CommandType.Text)197 {198 //sqlDataReader不能用using 会关闭conn 导致不能获取到返回值。注意:DataReader获取值时必须保持连接状态
199 SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW);200 DbCommandCommon cmd = newDbCommandCommon(dataBaseType);201 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType);202 returncmd.DbCommand.ExecuteReader(CommandBehavior.CloseConnection);203 }204 ///
205 ///执行sql语句或存储过程 返回DataReader206 ///
207 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
208 /// sql语句或存储过程名称
209 /// 命令类型
210 /// SqlParameter[]参数数组,允许空
211 ///
212 public static DbDataReader ExecuteReader(string commandTextOrSpName, CommandType commandType, paramsDbParameter[] parms)213 {214 //sqlDataReader不能用using 会关闭conn 导致不能获取到返回值。注意:DataReader获取值时必须保持连接状态
215 SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW);216 DbCommandCommon cmd = newDbCommandCommon(dataBaseType);217 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, parms);218 returncmd.DbCommand.ExecuteReader(CommandBehavior.CloseConnection);219 }220 ///
221 ///执行sql语句或存储过程 返回DataReader222 ///
223 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
224 /// sql语句或存储过程名称
225 /// 命令类型
226 /// object[]参数数组,允许空
227 ///
228 public static DbDataReader ExecuteReader(string commandTextOrSpName, CommandType commandType, params object[] obj)229 {230 //sqlDataReader不能用using 会关闭conn 导致不能获取到返回值。注意:DataReader获取值时必须保持连接状态
231 SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW);232 DbCommandCommon cmd = newDbCommandCommon(dataBaseType);233 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, obj);234 returncmd.DbCommand.ExecuteReader(CommandBehavior.CloseConnection);235 }236 #endregion
237
238 #region ExecuteDataTable 执行sql语句或者存储过程,返回一个DataTable---DataTable
239
240 /**241 * Update At 2017-3-2 14:58:45242 * Add the ExecuteDataTable Method into Sql_Helper_DG243 **/
244
245 ///
246 ///执行sql语句或存储过程,返回DataTable不带参数247 ///
248 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
249 /// sql语句或存储过程名称
250 /// 命令类型 有默认值CommandType.Text
251 ///
252 public static DataTable ExecuteDataTable(string commandTextOrSpName, CommandType commandType =CommandType.Text)253 {254 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW))255 {256 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))257 {258 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType);259 using (DbDataAdapterCommon da = newDbDataAdapterCommon(dataBaseType, cmd.DbCommand))260 {261 DataSet ds = newDataSet();262 da.Fill(ds);263 if (ds.Tables.Count > 0)264 {265 return ds.Tables[0];266 }267 return default(DataTable);268 }269 }270 }271 }272 ///
273 ///执行sql语句或存储过程,返回DataTable274 ///
275 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
276 /// sql语句或存储过程名称
277 /// 命令类型
278 /// SqlParameter[]参数数组,允许空
279 ///
280 public static DataTable ExecuteDataTable(string commandTextOrSpName, CommandType commandType, paramsDbParameter[] parms)281 {282 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW))283 {284 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))285 {286 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, parms);287 using (DbDataAdapterCommon da = newDbDataAdapterCommon(dataBaseType, cmd.DbCommand))288 {289 DataSet ds = newDataSet();290 da.Fill(ds);291 if (ds.Tables.Count > 0)292 {293 return ds.Tables[0];294 }295 return default(DataTable);296 }297 }298 }299 }300 ///
301 ///执行sql语句或存储过程,返回DataTable302 ///
303 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
304 /// sql语句或存储过程名称
305 /// 命令类型
306 /// object[]参数数组,允许空
307 ///
308 public static DataTable ExecuteDataTable(string commandTextOrSpName, CommandType commandType, params object[] obj)309 {310 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW))311 {312 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))313 {314 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, obj);315 using (DbDataAdapterCommon da = newDbDataAdapterCommon(dataBaseType, cmd.DbCommand))316 {317 DataSet ds = newDataSet();318 da.Fill(ds);319 if (ds.Tables.Count > 0)320 {321 return ds.Tables[0];322 }323 return default(DataTable);324 }325 }326 }327 }328 #endregion
329
330 #region ExecuteDataSet 执行sql语句或者存储过程,返回一个DataSet---DataSet
331 ///
332 ///执行sql语句或存储过程,返回DataSet 不带参数333 ///
334 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
335 /// sql语句或存储过程名称
336 /// 命令类型 有默认值CommandType.Text
337 ///
338 public static DataSet ExecuteDataSet(string commandTextOrSpName, CommandType commandType =CommandType.Text)339 {340 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW))341 {342 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))343 {344 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType);345 using (DbDataAdapterCommon da = newDbDataAdapterCommon(dataBaseType, cmd.DbCommand))346 {347 DataSet ds = newDataSet();348 da.Fill(ds);349 returnds;350 }351 }352 }353 }354 ///
355 ///执行sql语句或存储过程,返回DataSet356 ///
357 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
358 /// sql语句或存储过程名称
359 /// 命令类型
360 /// SqlParameter[]参数数组,允许空
361 ///
362 public static DataSet ExecuteDataSet(string commandTextOrSpName, CommandType commandType, paramsDbParameter[] parms)363 {364 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW))365 {366 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))367 {368 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, parms);369 using (DbDataAdapterCommon da = newDbDataAdapterCommon(dataBaseType, cmd.DbCommand))370 {371 DataSet ds = newDataSet();372 da.Fill(ds);373 returnds;374 }375 }376 }377 }378 ///
379 ///执行sql语句或存储过程,返回DataSet380 ///
381 /// 连接字符串,可以自定义,可以以使用SqlHelper_DG.ConnString
382 /// sql语句或存储过程名称
383 /// 命令类型
384 /// object[]参数数组,允许空
385 ///
386 public static DataSet ExecuteDataSet(string commandTextOrSpName, CommandType commandType, params object[] obj)387 {388 using (SqlConnection_WR_Safe conn = newSqlConnection_WR_Safe(dataBaseType, ConnString_R, ConnString_RW))389 {390 using (DbCommandCommon cmd = newDbCommandCommon(dataBaseType))391 {392 PreparCommand(conn.DbConnection, cmd.DbCommand, commandTextOrSpName, commandType, obj);393 using (DbDataAdapterCommon da = newDbDataAdapterCommon(dataBaseType, cmd.DbCommand))394 {395 DataSet ds = newDataSet();396 da.Fill(ds);397 returnds;398 }399 }400 }401 }402 #endregion
403
404 #region ExecuteList Entity 执行sql语句或者存储过程,返回一个List---List
405 public static List ExecuteList(string commandTextOrSpName, CommandType commandType = CommandType.Text) where Entity : class
406 {407 return GetListFromDataSet(ExecuteDataSet(commandTextOrSpName, commandType));408 }409 public static List ExecuteList(string commandTextOrSpName, CommandType commandType, params DbParameter[] parms) where Entity : class
410 {411 return GetListFromDataSet(ExecuteDataSet(commandTextOrSpName, commandType, parms));412 }413 public static List ExecuteList(string commandTextOrSpName, CommandType commandType, params object[] obj) where Entity : class
414 {415 return GetListFromDataSet(ExecuteDataSet(commandTextOrSpName, commandType, obj));416 }417 #endregion
418
419 #region ExecuteEntity 执行sql语句或者存储过程,返回一个Entity---Entity
420 public static Entity ExecuteEntity(string commandTextOrSpName, CommandType commandType = CommandType.Text) where Entity : class
421 {422 return GetEntityFromDataSet(ExecuteDataSet(commandTextOrSpName, commandType));423 }424 public static Entity ExecuteEntity(string commandTextOrSpName, CommandType commandType, params DbParameter[] parms) where Entity : class
425 {426 return GetEntityFromDataSet(ExecuteDataSet(commandTextOrSpName, commandType, parms));427 }428 public static Entity ExecuteEntity(string commandTextOrSpName, CommandType commandType, params object[] obj) where Entity : class
429 {430 return GetEntityFromDataSet(ExecuteDataSet(commandTextOrSpName, commandType, obj));431 }432 #endregion
433
434 #region ---PreparCommand 构建一个通用的command对象供内部方法进行调用---
435 ///
436 ///不带参数的设置sqlcommand对象437 ///
438 /// sqlconnection对象
439 /// sqlcommmand对象
440 /// sql语句或存储过程名称
441 /// 语句的类型
442 private static void PreparCommand(DbConnection conn, DbCommand cmd, stringcommandTextOrSpName, CommandType commandType)443 {444 //打开连接
445 if (conn.State !=ConnectionState.Open)446 {447 conn.Open();448 }449
450 //设置SqlCommand对象的属性值
451 cmd.Connection =conn;452 cmd.CommandType =commandType;453 cmd.CommandText =commandTextOrSpName;454 cmd.CommandTimeout = 60;455 }456 ///
457 ///设置一个等待执行的SqlCommand对象458 ///
459 /// sqlconnection对象
460 /// sqlcommmand对象
461 /// sql语句或存储过程名称
462 /// 语句的类型
463 /// 参数,sqlparameter类型,需要指出所有的参数名称
464 private static void PreparCommand(DbConnection conn, DbCommand cmd, string commandTextOrSpName, CommandType commandType, paramsSqlParameter[] parms)465 {466 //打开连接
467 if (conn.State !=ConnectionState.Open)468 {469 conn.Open();470 }471
472 //设置SqlCommand对象的属性值
473 cmd.Connection =conn;474 cmd.CommandType =commandType;475 cmd.CommandText =commandTextOrSpName;476 cmd.CommandTimeout = 60;477
478 if (parms != null)479 {480 cmd.Parameters.Clear();481 cmd.Parameters.AddRange(parms);482 }483 }484 ///
485 ///PreparCommand方法,可变参数为object需要严格按照参数顺序传参486 ///之所以会用object参数方法是为了我们能更方便的调用存储过程,不必去关系存储过程参数名是什么,知道它的参数顺序就可以了 sqlparameter必须指定每一个参数名称487 ///
488 /// sqlconnection对象
489 /// sqlcommmand对象
490 /// sql语句或存储过程名称
491 /// 语句的类型
492 /// 参数,object类型,需要按顺序赋值
493 private static void PreparCommand(DbConnection conn, DbCommand cmd, string commandTextOrSpName, CommandType commandType, params object[] parms)494 {495 //打开连接
496 if (conn.State !=ConnectionState.Open)497 {498 conn.Open();499 }500
501 //设置SqlCommand对象的属性值
502 cmd.Connection =conn;503 cmd.CommandType =commandType;504 cmd.CommandText =commandTextOrSpName;505 cmd.CommandTimeout = 60;506
507 cmd.Parameters.Clear();508 if (parms != null)509 {510 cmd.Parameters.AddRange(parms);511 }512 }513 #endregion
514
515 #region 通过Model反射返回结果集 Model为 Entity 泛型变量的真实类型---反射返回结果集
516 ///
517 ///反射返回一个List T 类型的结果集518 ///
519 /// Model中对象类型
520 /// DataSet结果集
521 ///
522 public static List GetListFromDataSet(DataSet ds) where Entity : class
523 {524 List list = new List();//实例化一个list对象
525 PropertyInfo[] propertyInfos = typeof(Entity).GetProperties(); //获取T对象的所有公共属性
526
527 DataTable dt = ds.Tables[0]; //获取到ds的dt
528 if (dt.Rows.Count > 0)529 {530 //判断读取的行是否>0 即数据库数据已被读取
531 foreach (DataRow row indt.Rows)532 {533 Entity model1 = System.Activator.CreateInstance();//实例化一个对象,便于往list里填充数据
534 foreach (PropertyInfo propertyInfo inpropertyInfos)535 {536 try
537 {538 //遍历模型里所有的字段
539 if (row[propertyInfo.Name] !=System.DBNull.Value)540 {541 //判断值是否为空,如果空赋值为null见else
542 if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))543 {544 //如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
545 NullableConverter nullableConverter = newNullableConverter(propertyInfo.PropertyType);546 //将convertsionType转换为nullable对的基础基元类型
547 propertyInfo.SetValue(model1, Convert.ChangeType(row[propertyInfo.Name], nullableConverter.UnderlyingType), null);548 }549 else
550 {551 propertyInfo.SetValue(model1, Convert.ChangeType(row[propertyInfo.Name], propertyInfo.PropertyType), null);552 }553 }554 else
555 {556 propertyInfo.SetValue(model1, null, null);//如果数据库的值为空,则赋值为null
557 }558 }559 catch(Exception)560 {561 propertyInfo.SetValue(model1, null, null);//如果数据库的值为空,则赋值为null
562 }563 }564 list.Add(model1);//将对象填充到list中
565 }566 }567 returnlist;568 }569 ///
570 ///反射返回一个T类型的结果571 ///
572 /// Model中对象类型
573 /// SqlDataReader结果集
574 ///
575 public static Entity GetEntityFromDataReader(DbDataReader reader) where Entity : class
576 {577 Entity model = System.Activator.CreateInstance(); //实例化一个T类型对象
578 PropertyInfo[] propertyInfos = model.GetType().GetProperties(); //获取T对象的所有公共属性
579 using(reader)580 {581 if(reader.Read())582 {583 foreach (PropertyInfo propertyInfo inpropertyInfos)584 {585 //遍历模型里所有的字段
586 if (reader[propertyInfo.Name] !=System.DBNull.Value)587 {588 //判断值是否为空,如果空赋值为null见else
589 if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))590 {591 //如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
592 NullableConverter nullableConverter = newNullableConverter(propertyInfo.PropertyType);593 //将convertsionType转换为nullable对的基础基元类型
594 propertyInfo.SetValue(model, Convert.ChangeType(reader[propertyInfo.Name], nullableConverter.UnderlyingType), null);595 }596 else
597 {598 propertyInfo.SetValue(model, Convert.ChangeType(reader[propertyInfo.Name], propertyInfo.PropertyType), null);599 }600 }601 else
602 {603 propertyInfo.SetValue(model, null, null);//如果数据库的值为空,则赋值为null
604 }605 }606 return model;//返回T类型的赋值后的对象 model
607 }608 }609 return default(Entity);//返回引用类型和值类型的默认值0或null
610 }611 ///
612 ///反射返回一个T类型的结果613 ///
614 /// Model中对象类型
615 /// DataSet结果集
616 ///
617 public static Entity GetEntityFromDataSet(DataSet ds) where Entity : class
618 {619 return GetListFromDataSet(ds).FirstOrDefault();620 }621 #endregion
622 }623 /**624 * author:qixiao625 * time:2017-9-18 18:02:23626 * description:safe create sqlconnection support627 **/
628 internal classSqlConnection_WR_Safe : IDisposable629 {630 ///
631 ///SqlConnection632 ///
633 public DbConnection DbConnection { get; set; }634
635 public SqlConnection_WR_Safe(Opt_DataBaseType dataBaseType, stringConnString_RW)636 {637 this.DbConnection =GetDbConnection(dataBaseType, ConnString_RW);638 }639 /**640 * if read db disabled,switchover to read write db immediately641 **/
642 public SqlConnection_WR_Safe(Opt_DataBaseType dataBaseType, string ConnString_R, stringConnString_RW)643 {644 try
645 {646 this.DbConnection =GetDbConnection(dataBaseType, ConnString_R);647 }648 catch(Exception)649 {650 this.DbConnection =GetDbConnection(dataBaseType, ConnString_RW);651 }652 }653
654 ///
655 ///GetDataBase ConnectionString by database type and connection string -- private use656 ///
657 ///
658 ///
659 ///
660 private DbConnection GetDbConnection(Opt_DataBaseType dataBaseType, stringConnString)661 {662 switch(dataBaseType)663 {664 caseOpt_DataBaseType.SqlServer:665 return newSqlConnection(ConnString);666 caseOpt_DataBaseType.MySql:667 return newMySqlConnection(ConnString);668 caseOpt_DataBaseType.Oracle:669 return newOracleConnection(ConnString);670 default:671 return newSqlConnection(ConnString);672 }673 }674 ///
675 ///Must Close Connection after use676 ///
677 public voidDispose()678 {679 if (this.DbConnection != null)680 {681 this.DbConnection.Dispose();682 }683 }684 }685 ///
686 ///Common sqlcommand687 ///
688 internal classDbCommandCommon : IDisposable689 {690 ///
691 ///common dbcommand692 ///
693 public DbCommand DbCommand { get; set; }694 publicDbCommandCommon(Opt_DataBaseType dataBaseType)695 {696 this.DbCommand =GetDbCommand(dataBaseType);697 }698
699 ///
700 ///Get DbCommand select database type701 ///
702 ///
703 ///
704 privateDbCommand GetDbCommand(Opt_DataBaseType dataBaseType)705 {706 switch(dataBaseType)707 {708 caseOpt_DataBaseType.SqlServer:709 return newSqlCommand();710 caseOpt_DataBaseType.MySql:711 return newMySqlCommand();712 caseOpt_DataBaseType.Oracle:713 return newOracleCommand();714 default:715 return newSqlCommand();716 }717 }718 ///
719 ///must dispose after use720 ///
721 public voidDispose()722 {723 if (this.DbCommand != null)724 {725 this.DbCommand.Dispose();726 }727 }728 }729 ///
730 ///DbDataAdapterCommon731 ///
732 internal classDbDataAdapterCommon : DbDataAdapter, IDisposable733 {734 public DbDataAdapter DbDataAdapter { get; set; }735 publicDbDataAdapterCommon(Opt_DataBaseType dataBaseType, DbCommand dbCommand)736 {737 //get dbAdapter
738 this.DbDataAdapter =GetDbAdapter(dataBaseType, dbCommand);739 //provid select command
740 this.SelectCommand =dbCommand;741 }742 privateDbDataAdapter GetDbAdapter(Opt_DataBaseType dataBaseType, DbCommand dbCommand)743 {744 switch(dataBaseType)745 {746 caseOpt_DataBaseType.SqlServer:747 return newSqlDataAdapter();748 caseOpt_DataBaseType.MySql:749 return newMySqlDataAdapter();750 caseOpt_DataBaseType.Oracle:751 return newOracleDataAdapter();752 default:753 return newSqlDataAdapter();754 }755 }756 ///
757 ///must dispose after use758 ///
759 public new voidDispose()760 {761 if (this.DbDataAdapter != null)762 {763 this.DbDataAdapter.Dispose();764 }765 }766 }767 }