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