SqlHelper include Transaction

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Data.Common;
  6 using System.Data;
  7 using System.Collections;
  8 using System.Reflection;
  9 using System.Collections.Specialized;
 10 using System.Configuration;
 11 using System.ComponentModel;
 12 using System.IO;
 13 using System.Text.RegularExpressions;
 14 using CP.Utility;
 15 
 16 namespace CP.DBService
 17 {
 18 public class DBHelper
 19 {
 20 protected string ConnectionString { get; set; }
 21 protected DataBaseType DBType { get; set; }
 22 private static DBHelper helper;
 23 private static bool hasRead = false;
 24 private static DBHelper gpmHelper;
 25 protected DBHelper() { }
 26 /// <summary>
 27 /// 创建单例模式
 28 /// </summary>
 29 /// <param name="connectionString"></param>
 30 /// <param name="dbType"></param>
 31 /// <returns></returns>
 32 public static DBHelper CreateInstance()
 33 {
 34 if (helper == null)
 35 {
 36 helper = new DBHelper();
 37 helper.ConnectionString = EncryptHelper.DecryptDES(ConfigurationManager.ConnectionStrings["BizConnectionString"].ConnectionString, "masicsyc");
 38 //helper.ConnectionString = ConfigurationManager.ConnectionStrings["BizConnectionString"].ConnectionString;
 39 helper.DBType = DataBaseType.Oracle;
 40 }
 41 return helper;
 42 }
 43 
 44 public static DBHelper GPMCreateInstance()
 45 {
 46 if (gpmHelper == null)
 47 {
 48 gpmHelper = new DBHelper();
 49 gpmHelper.ConnectionString = EncryptHelper.DecryptDES(ConfigurationManager.ConnectionStrings["GPMConnectionString"].ConnectionString, "masicgpm");
 50 //helper.ConnectionString = ConfigurationManager.ConnectionStrings["GPMConnectionString"].ConnectionString;
 51 gpmHelper.DBType = DataBaseType.Oracle;
 52 }
 53 return gpmHelper;
 54 }
 55 
 56 public static DBHelper CreateNonSingleTonInstance()
 57 {
 58 helper = new DBHelper();
 59 helper.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
 60 helper.DBType = DataBaseType.Oracle;
 61 return helper;
 62 
 63 }
 64 
 65 DbTransaction transaction = null;
 66 public DbTransaction Transaction
 67 {
 68 get { return transaction; }
 69 set { transaction = value; }
 70 }
 71 public void Commit()
 72 {
 73 Transaction.Commit();
 74 Transaction = null;
 75 GC.Collect();
 76 }
 77 public void Rollback()
 78 {
 79 Transaction.Rollback();
 80 Transaction = null;
 81 GC.Collect();
 82 }
 83 public virtual void BeginTransaction()
 84 {
 85 DbConnection transConnection = CreateConnection();
 86 DbTransaction transaction = transConnection.BeginTransaction();
 87 Transaction = transaction;
 88 }
 89 public virtual void CloseConnection(DbConnection connection)
 90 {
 91 if (Transaction == null)
 92 connection.Close();
 93 }
 94 /// <summary>
 95 /// 创建连接
 96 /// </summary>
 97 /// <returns></returns>
 98 protected DbConnection CreateConnection()
 99 {
100 if (Transaction != null) return Transaction.Connection;
101 DbConnection connection = null;
102 switch (DBType)
103 {
104 case DataBaseType.Access:
105 connection = new System.Data.OleDb.OleDbConnection(ConnectionString);
106 break;
107 case DataBaseType.MySql:
108 connection = new System.Data.OleDb.OleDbConnection(ConnectionString);
109 break;
110 case DataBaseType.Oracle:
111 connection = new System.Data.OracleClient.OracleConnection(ConnectionString);
112 break;
113 case DataBaseType.SqlServer:
114 connection = new System.Data.SqlClient.SqlConnection(ConnectionString);
115 break;
116 }
117 connection.Open();
118 return connection;
119 }
120 public DbCommand CreateCommand()
121 {
122 DbCommand command = CreateConnection().CreateCommand();
123 command.Transaction = Transaction;
124 return command;
125 }
126 /// <summary>
127 /// 创建命令
128 /// </summary>
129 /// <param name="connection"></param>
130 /// <param name="sqlSegment"></param>
131 /// <param name="parameters"></param>
132 /// <returns></returns>
133 protected DbCommand CreateCommand(DbConnection connection, string sqlSegment, IDataParameter[] parameters, CommandType commandType)
134 {
135 DbCommand command = connection.CreateCommand();
136 command.CommandText = sqlSegment;
137 command.CommandType = commandType;
138 if (parameters != null)
139 command.Parameters.AddRange(parameters);
140 command.Transaction = Transaction;
141 return command;
142 }
143 /// <summary>
144 /// 创建适配器
145 /// </summary>
146 /// <param name="connection"></param>
147 /// <param name="sqlSegment"></param>
148 /// <param name="parameters"></param>
149 /// <returns></returns>
150 protected DbDataAdapter CreateAdapter(DbConnection connection, string sqlSegment, IDataParameter[] parameters, CommandType commandType)
151 {
152 DbCommand command = CreateCommand(connection, sqlSegment, parameters, commandType);
153 command.CommandText = sqlSegment;
154 //command.CommandType = commandType;
155 //if (parameters != null)
156 // command.Parameters.AddRange(parameters);
157 
158 DbDataAdapter adapter = null;
159 switch (DBType)
160 {
161 case DataBaseType.Access:
162 adapter = new System.Data.OleDb.OleDbDataAdapter((System.Data.OleDb.OleDbCommand)command);
163 break;
164 case DataBaseType.MySql:
165 adapter = new System.Data.OleDb.OleDbDataAdapter((System.Data.OleDb.OleDbCommand)command);
166 break;
167 case DataBaseType.Oracle:
168 adapter = new System.Data.OracleClient.OracleDataAdapter((System.Data.OracleClient.OracleCommand)command);
169 break;
170 case DataBaseType.SqlServer:
171 adapter = new System.Data.SqlClient.SqlDataAdapter((System.Data.SqlClient.SqlCommand)command);
172 break;
173 }
174 return adapter;
175 }
176 
177 public virtual T ExecuteScalar<T>(string sqlSegment)
178 {
179 return ExecuteScalar<T>(sqlSegment, null);
180 }
181 public virtual T ExecuteScalar<T>(string sqlSegment, IDataParameter[] parameters)
182 {
183 return ExecuteScalar<T>(sqlSegment, null, CommandType.Text);
184 }
185 public virtual T ExecuteScalar<T>(string sqlSegment, CommandType commandType)
186 {
187 return ExecuteScalar<T>(sqlSegment, null, commandType);
188 }
189 public virtual T ExecuteScalar<T>(string sqlSegment, IDataParameter[] parameters, CommandType commandType)
190 {
191 T result = default(T);
192 object value = ExecuteScalar(sqlSegment, parameters, commandType);
193 
194 if (value != null && value != DBNull.Value)
195 {
196 result = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value.ToString());
197 }
198 return result;
199 }
200 
201 public virtual object ExecuteScalar(string sqlSegment)
202 {
203 return ExecuteScalar(sqlSegment, null);
204 }
205 public virtual object ExecuteScalar(string sqlSegment, IDataParameter[] parameters)
206 {
207 return ExecuteScalar(sqlSegment, null, CommandType.Text);
208 }
209 public virtual object ExecuteScalar(string sqlSegment, CommandType commandType)
210 {
211 return ExecuteScalar(sqlSegment, null, commandType);
212 }
213 public virtual object ExecuteScalar(string sqlSegment, IDataParameter[] parameters, CommandType commandType)
214 {
215 DbConnection connection = CreateConnection();
216 DbCommand command = CreateCommand(connection, sqlSegment, parameters, commandType);
217 
218 object result = command.ExecuteScalar();
219 command.Parameters.Clear();
220 CloseConnection(connection);
221 return result;
222 }
223 
224 /// <summary>
225 /// 执行SQL语句,返回影响的记录数,用于增/删/改数据
226 /// </summary>
227 /// <param name="sqlSegment"></param>
228 /// <param name="parameters"></param>
229 /// <returns></returns>
230 public virtual int ExecuteNonQuery(string sqlSegment)
231 {
232 return ExecuteNonQuery(sqlSegment, null, CommandType.Text);
233 }
234 public virtual int ExecuteNonQuery(string sqlSegment, IDataParameter[] parameters)
235 {
236 return ExecuteNonQuery(sqlSegment, null, CommandType.Text);
237 }
238 public virtual int ExecuteNonQuery(string sqlSegment, CommandType commandType)
239 {
240 return ExecuteNonQuery(sqlSegment, null, commandType);
241 }
242 public virtual int ExecuteNonQuery(string sqlSegment, IDataParameter[] parameters, CommandType commandType)
243 {
244 DbConnection connection = CreateConnection();
245 DbCommand command = CreateCommand(connection, sqlSegment, parameters, commandType);
246 int result = command.ExecuteNonQuery();
247 command.Parameters.Clear();
248 CloseConnection(connection);
249 return result;
250 }
251 
252 /// <summary>
253 /// 执行SQL语句,返回一张表,用于查询数据
254 /// </summary>
255 /// <param name="sqlSegment"></param>
256 /// <param name="parameters"></param>
257 /// <returns></returns>
258 public virtual DataTable ExecuteDataTable(string sqlSegment)
259 {
260 return ExecuteDataTable(sqlSegment, null);
261 }
262 public virtual DataTable ExecuteDataTable(string sqlSegment, IDataParameter[] parameters)
263 {
264 return ExecuteDataTable(sqlSegment, null, CommandType.Text);
265 }
266 public virtual DataTable ExecuteDataTable(string sqlSegment, IDataParameter[] parameters, CommandType commandType)
267 {
268 
269 DataTable dataTable = new DataTable();
270 DbConnection connection = CreateConnection();
271 DbDataAdapter adapter = CreateAdapter(connection, sqlSegment, parameters, commandType);
272 adapter.Fill(dataTable);
273 adapter.SelectCommand.Parameters.Clear();
274 CloseConnection(connection);
275 return dataTable;
276 
277 }
278 
279 /// <summary>
280 /// 执行SQL语句,返回一个Reader对象,用于查询数据
281 /// </summary>
282 /// <param name="sqlSegment"></param>
283 /// <param name="parameters"></param>
284 /// <returns></returns>
285 //public virtual DbDataReader ExecuteReader(string sqlSegment)
286 //{
287 // return ExecuteReader(sqlSegment, null);
288 //}
289 //public virtual DbDataReader ExecuteReader(string sqlSegment, IDataParameter[] parameters)
290 //{
291 // return ExecuteReader(sqlSegment, null,CommandType.Text);
292 //}
293 //public virtual DbDataReader ExecuteReader(string sqlSegment, IDataParameter[] parameters,CommandType commandType)
294 //{
295 // DbConnection connection = CreateConnection();
296 // DbCommand command = CreateCommand(connection, sqlSegment, parameters,commandType);
297 // DbDataReader reader = command.ExecuteReader();
298 // return reader;
299 //}
300 
301 public virtual IList<T> ExecuteObject<T>(string sqlSegment)
302 {
303 return ExecuteObject<T>(sqlSegment, null);
304 }
305 public virtual IList<T> ExecuteObject<T>(string sqlSegment, IDataParameter[] parameters)
306 {
307 return ExecuteObject<T>(sqlSegment, parameters, CommandType.Text);
308 }
309 public virtual IList<T> ExecuteObject<T>(string sqlSegment, IDataParameter[] parameters, CommandType commandType)
310 {
311 return ExecuteObject<T>(sqlSegment, parameters, commandType, null);
312 }
313 public virtual IList<T> ExecuteObject<T>(string sqlSegment, IDataParameter[] parameters, CommandType commandType, string entity_type)
314 {
315 DbConnection connection = CreateConnection();
316 DbCommand command = CreateCommand(connection, sqlSegment, parameters, commandType);
317 
318 IList<T> entities = new List<T>();
319 try
320 {
321 using (DbDataReader reader = command.ExecuteReader())
322 {
323 while (reader.Read())
324 {
325 T entity = Activator.CreateInstance<T>();
326 if (!string.IsNullOrEmpty(entity_type))
327 {
328 entity = (T)PortalService.CreateEntity(entity_type);
329 }
330 
331 var properties = entity.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
332 foreach (var property in properties)
333 {
334 object value = reader[property.Name];
335 object new_value = null;
336 if (value == null || value == DBNull.Value)
337 {
338 if (property.PropertyType == typeof(int) ||
339 property.PropertyType == typeof(Int32))
340 new_value = 0;
341 if (property.PropertyType == typeof(decimal))
342 new_value = 0m;
343 if (property.PropertyType == typeof(float))
344 new_value = 0f;
345 if (property.PropertyType == typeof(double))
346 new_value = 0d;
347 if (property.PropertyType == typeof(bool))
348 new_value = false;
349 if (property.PropertyType == typeof(DateTime))
350 new_value = DateTime.MinValue;
351 }
352 else
353 {
354 if (property.PropertyType == value.GetType())
355 new_value = value;
356 else if (property.PropertyType == typeof(DateTime?))
357 new_value = value;
358 else if (property.PropertyType == typeof(bool))
359 new_value = value.ToString() == "0" ? false : true;
360 else if (property.PropertyType == typeof(byte[]))
361 new_value = (byte[])value;
362 else
363 new_value = TypeDescriptor.GetConverter(property.PropertyType).ConvertFrom(value.ToString());
364 
365 //if (new_value != null)
366 //{
367 // //if (new_value.GetType() == typeof(string) && new_value.ToString() == " ")
368 // // new_value = "";
369 // if (new_value.GetType() == typeof(decimal) && (decimal)new_value != 0m && new_value.ToString().IndexOf(".") > 0)
370 // {
371 // string str_new_value = new_value.ToString();
372 // str_new_value = Regex.Replace(str_new_value, "0+$", "");
373 // new_value = decimal.Parse(str_new_value);
374 // }
375 //}
376 }
377 
378 property.SetValue(entity, new_value, null);
379 }
380 entities.Add(entity);
381 }
382 reader.Close();
383 
384 }
385 }
386 catch (Exception ex)
387 {
388 throw new Exception("执行SQL语句发生错误:" + sqlSegment + ".详细描述" + ex.Message, ex);
389 }
390 finally
391 {
392 CloseConnection(connection);
393 }
394 command.Parameters.Clear();
395 return entities;
396 
397 }
398 
399 public virtual T ExecuteSingleObject<T>(string sqlSegment)
400 {
401 return ExecuteSingleObject<T>(sqlSegment, null);
402 }
403 public virtual T ExecuteSingleObject<T>(string sqlSegment, IDataParameter[] parameters)
404 {
405 return ExecuteSingleObject<T>(sqlSegment, parameters, CommandType.Text);
406 }
407 public virtual T ExecuteSingleObject<T>(string sqlSegment, IDataParameter[] parameters, CommandType commandType)
408 {
409 return ExecuteSingleObject<T>(sqlSegment, parameters, commandType, null);
410 }
411 public virtual T ExecuteSingleObject<T>(string sqlSegment, IDataParameter[] parameters, CommandType commandType, string entity_type)
412 {
413 DbConnection connection = CreateConnection();
414 DbCommand command = CreateCommand(connection, sqlSegment, parameters, commandType);
415 
416 T entity = Activator.CreateInstance<T>();
417 try
418 {
419 using (DbDataReader reader = command.ExecuteReader())
420 {
421 if (reader.Read())
422 {
423 if (!string.IsNullOrEmpty(entity_type))
424 {
425 entity = (T)PortalService.CreateEntity(entity_type);
426 }
427 
428 var properties = entity.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
429 foreach (var property in properties)
430 {
431 object value = reader[property.Name];
432 object new_value = null;
433 if (value == DBNull.Value)
434 {
435 if (property.PropertyType == typeof(int) ||
436 property.PropertyType == typeof(Int32))
437 new_value = 0;
438 if (property.PropertyType == typeof(decimal))
439 new_value = 0m;
440 if (property.PropertyType == typeof(float))
441 new_value = 0f;
442 if (property.PropertyType == typeof(double))
443 new_value = 0d;
444 if (property.PropertyType == typeof(bool))
445 new_value = false;
446 if (property.PropertyType == typeof(DateTime))
447 new_value = DateTime.MinValue;
448 }
449 else
450 {
451 if (property.PropertyType == value.GetType())
452 new_value = value;
453 else if (property.PropertyType == typeof(DateTime?))
454 new_value = value;
455 else if (property.PropertyType == typeof(bool))
456 new_value = value.ToString() == "0" ? false : true;
457 else if (property.PropertyType == typeof(byte[]))
458 new_value = (byte[])value;
459 else
460 new_value = TypeDescriptor.GetConverter(property.PropertyType).ConvertFrom(value.ToString());
461 }
462 
463 property.SetValue(entity, new_value, null);
464 }
465 reader.Close();
466 }
467 }
468 }
469 catch (Exception ex)
470 {
471 throw new Exception("执行SQL语句发生错误:" + sqlSegment + ".详细描述" + ex.Message, ex);
472 }
473 finally
474 {
475 CloseConnection(connection);
476 }
477 command.Parameters.Clear();
478 return entity;
479 }
480 
481 public virtual IList<T> ExecuteSimpleTypeList<T>(string sqlSegment)
482 {
483 return ExecuteSimpleTypeList<T>(sqlSegment, null);
484 }
485 public virtual IList<T> ExecuteSimpleTypeList<T>(string sqlSegment, IDataParameter[] parameters)
486 {
487 return ExecuteSimpleTypeList<T>(sqlSegment, parameters, CommandType.Text);
488 }
489 public virtual IList<T> ExecuteSimpleTypeList<T>(string sqlSegment, IDataParameter[] parameters, CommandType commandType)
490 {
491 DbConnection connection = CreateConnection();
492 DbCommand command = CreateCommand(connection, sqlSegment, parameters, commandType);
493 
494 IList<T> entities = new List<T>();
495 try
496 {
497 using (DbDataReader reader = command.ExecuteReader())
498 {
499 while (reader.Read())
500 {
501 T result = default(T);
502 object value = reader[0];
503 if (value == null || value == DBNull.Value)
504 continue;
505 result = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value.ToString());
506 entities.Add(result);
507 }
508 reader.Close();
509 }
510 }
511 catch (Exception ex)
512 {
513 throw new Exception("执行SQL语句发生错误:" + sqlSegment + ".详细描述" + ex.Message, ex);
514 }
515 finally
516 {
517 CloseConnection(connection);
518 }
519 command.Parameters.Clear();
520 return entities;
521 }
522 
523 }
524 
525 public enum DataBaseType
526 {
527 Access,
528 SqlServer,
529 Oracle,
530 MySql
531 }
532 }
533   
原文地址:https://www.cnblogs.com/asingna/p/5011894.html