001通用数据库访问帮助类DbHelper.cs
002// 文 件: DbHelper.cs
003// 作 者: yangdeyong
004// 时 间: 2012年4月10日 10:12:45
005// 摘 要: .NET通用数据库操作帮助类,可支持Odbc、OleDb、OracleClient、SqlClient、SqlServerCe等多种数据库提供程序操作
006
007using System;
008using System.Collections.Generic;
009using System.Data;
010using System.Data.Common;
011using System.Linq;
012using System.Text;
013
014namespace DbHelper
015{
016///
017/// 说 明: .NET通用数据库操作帮助类,可支持Odbc、OleDb、OracleClient、SqlClient、SqlServerCe等多种数据库提供程序操作
018/// 作 者: yangdeyong
019/// 时 间: 2012-04-10 10:12:45
020///
021///
022/// 作 者: yangdeyong
023/// 时 间: 2012-04-10 10:12:45
024///
025public sealed class DbHelper
026{
027#region 字段属性
028
029#region 静态公有字段
030///
031/// 获取当前数据库配置的提供程序名称值DbProviderName
032///
033public static readonly string DbProviderName = System.Configuration.ConfigurationManager.AppSettings["DbProviderName"];
034
035///
036/// 获取当前数据库配置的连接字符串值DbConnectionString
037///
038public static readonly string DbConnectionString = System.Configuration.ConfigurationManager.AppSettings["DbConnectionString"];
039#endregion
040
041#region 私有字段
042///
043/// 当前默认配置的数据库提供程序DbProviderFactory
044///
045private DbProviderFactory _dbFactory =null;
046
047///
048/// 当前数据库链接DbConnection对象
049///
050private DbConnection _dbConnection =null;
051
052///
053/// 当前的数据库提供程序
054///
055private string _dbProviderName =null;
056
057///
058/// 当前的数据库连接字符串
059///
060private string _dbConnectionString =null;
061#endregion
062
063#endregion
064
065#region 构造函数
066///
067/// 根据配置的数据库提供程序和链接串进行初始化此对象实例
068///
069public DbHelper()
070:this(DbHelper.DbConnectionString, DbHelper.DbProviderName)
071{
072}
073
074///
075/// 根据数据库链接串和数据库提供程序名称两个参数进行初始化此对象实例
076///
077/// 数据库连接配置字符串
078/// 数据库提供程序的名称
079public DbHelper(string connectionString,string providerName)
080{
081if (!string.IsNullOrEmpty(providerName))
082{
083this._dbFactory = DbHelper.CreateDbProviderFactory(providerName);//创建默认配置的数据库提供程序
084}
085else
086{
087throw new ArgumentNullException("providerName","数据库提供程序名称参数值不能为空,请在配置文件中配置该项值!");
088}
089
090if (!string.IsNullOrEmpty(connectionString))
091{
092this._dbConnection = DbHelper.CreateDbConnection(connectionString, providerName);//创建当前数据库链接对象
093}
094else
095{
096throw new ArgumentNullException("connectionString","数据库链接串参数值不能为空,请在配置文件中配置该项值!");
097}
098
099//保存当前连接字符串和数据库提供程序名称
100this._dbConnectionString = connectionString;
101this._dbProviderName = providerName;
102}
103#endregion
104
105#region 方法函数
106
107#region 创建DbProviderFactory对象(静态方法)
108///
109/// 根据配置的数据库提供程序的DbProviderName名称来创建一个数据库配置的提供程序DbProviderFactory对象
110///
111public static DbProviderFactory CreateDbProviderFactory()
112{
113DbProviderFactory dbFactory = DbHelper.CreateDbProviderFactory(DbHelper.DbProviderName);
114
115return dbFactory;
116}
117
118///
119/// 根据参数名称创建一个数据库提供程序DbProviderFactory对象
120///
121/// 数据库提供程序的名称
122public static DbProviderFactory CreateDbProviderFactory(string dbProviderName)
123{
124DbProviderFactory dbFactory = DbProviderFactories.GetFactory(dbProviderName);
125
126return dbFactory;
127}
128#endregion
129
130#region 创建DbConnection对象(静态方法)
131///
132/// 根据配置的数据库提供程序和链接串来创建数据库链接.
133///
134public static DbConnection CreateDbConnection()
135{
136DbConnection dbConn = DbHelper.CreateDbConnection(DbHelper.DbConnectionString, DbHelper.DbProviderName);
137
138return dbConn;
139}
140
141///
142/// 根据数据库连接字符串参数来创建数据库链接.
143///
144/// 数据库连接配置字符串
145/// 数据库提供程序的名称
146///
147public static DbConnection CreateDbConnection(string connectionString,string dbProviderName)
148{
149DbProviderFactory dbFactory = DbHelper.CreateDbProviderFactory(dbProviderName);
150
151DbConnection dbConn = dbFactory.CreateConnection();
152dbConn.ConnectionString = connectionString;
153
154return dbConn;
155}
156#endregion
157
158#region 获取DbCommand对象
159///
160/// 根据存储过程名称来构建当前数据库链接的DbCommand对象
161///
162/// 存储过程名称
163public DbCommand GetStoredProcedureCommond(string storedProcedure)
164{
165DbCommand dbCmd =this._dbConnection.CreateCommand();
166
167dbCmd.CommandText = storedProcedure;
168dbCmd.CommandType = CommandType.StoredProcedure;
169
170return dbCmd;
171}
172
173///
174/// 根据SQL语句来构建当前数据库链接的DbCommand对象
175///
176/// SQL查询语句
177public DbCommand GetSqlStringCommond(string sqlQuery)
178{
179DbCommand dbCmd =this._dbConnection.CreateCommand();
180
181dbCmd.CommandText = sqlQuery;
182dbCmd.CommandType = CommandType.Text;
183
184return dbCmd;
185}
186#endregion
187
188#region 添加DbCommand参数
189///
190/// 把参数集合添加到DbCommand对象中
191///
192/// 数据库命令操作对象
193/// 数据库操作集合
194public void AddParameterCollection(DbCommand cmd, DbParameterCollection dbParameterCollection)
195{
196if (cmd !=null)
197{
198foreach (DbParameter dbParameterin dbParameterCollection)
199{
200cmd.Parameters.Add(dbParameter);
201}
202}
203}
204
205///
206/// 把输出参数添加到DbCommand对象中
207///
208/// 数据库命令操作对象
209/// 参数名称
210/// 参数的类型
211/// 参数的大小
212public void AddOutParameter(DbCommand cmd,string parameterName, DbType dbType,int size)
213{
214if (cmd !=null)
215{
216DbParameter dbParameter = cmd.CreateParameter();
217
218dbParameter.DbType = dbType;
219dbParameter.ParameterName = parameterName;
220dbParameter.Size = size;
221dbParameter.Direction = ParameterDirection.Output;
222
223cmd.Parameters.Add(dbParameter);
224}
225}
226
227///
228/// 把输入参数添加到DbCommand对象中
229///
230/// 数据库命令操作对象
231/// 参数名称
232/// 参数的类型
233/// 参数值
234public void AddInParameter(DbCommand cmd,string parameterName, DbType dbType,object value)
235{
236if (cmd !=null)
237{
238DbParameter dbParameter = cmd.CreateParameter();
239
240dbParameter.DbType = dbType;
241dbParameter.ParameterName = parameterName;
242dbParameter.Value = value;
243dbParameter.Direction = ParameterDirection.Input;
244
245cmd.Parameters.Add(dbParameter);
246}
247}
248
249///
250/// 把返回参数添加到DbCommand对象中
251///
252/// 数据库命令操作对象
253/// 参数名称
254/// 参数的类型
255public void AddReturnParameter(DbCommand cmd,string parameterName, DbType dbType)
256{
257if (cmd !=null)
258{
259DbParameter dbParameter = cmd.CreateParameter();
260
261dbParameter.DbType = dbType;
262dbParameter.ParameterName = parameterName;
263dbParameter.Direction = ParameterDirection.ReturnValue;
264
265cmd.Parameters.Add(dbParameter);
266}
267}
268
269///
270/// 根据参数名称从DbCommand对象中获取相应的参数对象
271///
272/// 数据库命令操作对象
273/// 参数名称
274public DbParameter GetParameter(DbCommand cmd,string parameterName)
275{
276if (cmd !=null && cmd.Parameters.Count > 0)
277{
278DbParameter param = cmd.Parameters[parameterName];
279
280return param;
281}
282
283return null;
284}
285#endregion
286
287#region 执行SQL脚本语句
288///
289/// 执行相应的SQL命令,返回一个DataSet数据集合
290///
291/// 需要执行的SQL语句
292/// 返回一个DataSet数据集合
293public DataSet ExecuteDataSet(string sqlQuery)
294{
295DataSet ds =new DataSet();
296
297if (!string.IsNullOrEmpty(sqlQuery))
298{
299DbCommand cmd = GetSqlStringCommond(sqlQuery);
300
301ds = ExecuteDataSet(cmd);
302}
303
304return ds;
305}
306
307///
308/// 执行相应的SQL命令,返回一个DataTable数据集
309///
310/// 需要执行的SQL语句
311/// 返回一个DataTable数据集
312public DataTable ExecuteDataTable(string sqlQuery)
313{
314DataTable dt =new DataTable();
315
316if (!string.IsNullOrEmpty(sqlQuery))
317{
318DbCommand cmd = GetSqlStringCommond(sqlQuery);
319
320dt = ExecuteDataTable(cmd);
321}
322
323return dt;
324}
325
326///
327/// 执行相应的SQL命令,返回一个DbDataReader数据对象,如果没有则返回null值
328///
329/// 需要执行的SQL命令
330/// 返回一个DbDataReader数据对象,如果没有则返回null值
331public DbDataReader ExecuteReader(string sqlQuery)
332{
333if (!string.IsNullOrEmpty(sqlQuery))
334{
335DbCommand cmd = GetSqlStringCommond(sqlQuery);
336
337DbDataReader reader = ExecuteReader(cmd);
338
339return reader;
340}
341
342return null;
343}
344
345///
346/// 执行相应的SQL命令,返回影响的数据记录数,如果不成功则返回-1
347///
348/// 需要执行的SQL命令
349/// 返回影响的数据记录数,如果不成功则返回-1
350public int ExecuteNonQuery(string sqlQuery)
351{
352if (!string.IsNullOrEmpty(sqlQuery))
353{
354DbCommand cmd = GetSqlStringCommond(sqlQuery);
355
356int retVal = ExecuteNonQuery(cmd);
357
358return retVal;
359}
360
361return -1;
362}
363
364///
365/// 执行相应的SQL命令,返回结果集中的第一行第一列的值,如果不成功则返回null值
366///
367/// 需要执行的SQL命令
368/// 返回结果集中的第一行第一列的值,如果不成功则返回null值
369public object ExecuteScalar(string sqlQuery)
370{
371if (!string.IsNullOrEmpty(sqlQuery))
372{
373DbCommand cmd = GetSqlStringCommond(sqlQuery);
374
375object retVal = ExecuteScalar(cmd);
376
377return retVal;
378}
379
380return null;
381}
382
383#endregion
384
385#region 执行DbCommand命令
386///
387/// 执行相应的命令,返回一个DataSet数据集合
388///
389/// 需要执行的DbCommand命令对象
390/// 返回一个DataSet数据集合
391public DataSet ExecuteDataSet(DbCommand cmd)
392{
393DataSet ds =new DataSet();
394
395if (cmd !=null)
396{
397DbDataAdapter dbDataAdapter =this._dbFactory.CreateDataAdapter();
398dbDataAdapter.SelectCommand = cmd;
399
400dbDataAdapter.Fill(ds);
401}
402
403return ds;
404}
405
406///
407/// 执行相应的命令,返回一个DataTable数据集合
408///
409/// 需要执行的DbCommand命令对象
410/// 返回一个DataTable数据集合
411public DataTable ExecuteDataTable(DbCommand cmd)
412{
413DataTable dataTable =new DataTable();
414
415if (cmd !=null)
416{
417DbDataAdapter dbDataAdapter =this._dbFactory.CreateDataAdapter();
418dbDataAdapter.SelectCommand = cmd;
419
420dbDataAdapter.Fill(dataTable);
421}
422
423return dataTable;
424}
425
426///
427/// 执行相应的命令,返回一个DbDataReader数据对象,如果没有则返回null值
428///
429/// 需要执行的DbCommand命令对象
430/// 返回一个DbDataReader数据对象,如果没有则返回null值
431public DbDataReader ExecuteReader(DbCommand cmd)
432{
433if (cmd !=null && cmd.Connection !=null)
434{
435if (cmd.Connection.State != ConnectionState.Open)
436{
437cmd.Connection.Open();
438}
439
440DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);//当reader读取结束时自动关闭数据库链接
441
442return reader;
443}
444
445return null;
446}
447
448///
449/// 执行相应的命令,返回影响的数据记录数,如果不成功则返回-1
450///
451/// 需要执行的DbCommand命令对象
452/// 返回影响的数据记录数,如果不成功则返回-1
453public int ExecuteNonQuery(DbCommand cmd)
454{
455if (cmd !=null && cmd.Connection !=null)
456{
457if (cmd.Connection.State != ConnectionState.Open)
458{
459cmd.Connection.Open();
460}
461
462int retVal = cmd.ExecuteNonQuery();
463
464cmd.Connection.Close();
465
466return retVal;
467}
468
469return -1;
470}
471
472///
473/// 执行相应的命令,返回结果集中的第一行第一列的值,如果不成功则返回null值
474///
475/// 需要执行的DbCommand命令对象
476/// 返回结果集中的第一行第一列的值,如果不成功则返回null值
477public object ExecuteScalar(DbCommand cmd)
478{
479if (cmd !=null && cmd.Connection !=null)
480{
481if (cmd.Connection.State != ConnectionState.Open)
482{
483cmd.Connection.Open();
484}
485
486object retVal = cmd.ExecuteScalar();
487
488cmd.Connection.Close();
489
490return retVal;
491}
492
493return null;
494}
495#endregion
496
497#region 执行DbTransaction事务
498///
499/// 以事务的方式执行相应的命令,返回一个DataSet数据集合
500///
501/// 需要执行的DbCommand命令对象
502/// 数据库事务对象
503/// 返回一个DataSet数据集合
504public DataSet ExecuteDataSet(DbCommand cmd, Trans trans)
505{
506DataSet ds =new DataSet();
507
508if (cmd !=null)
509{
510cmd.Connection = trans.Connection;
511cmd.Transaction = trans.Transaction;
512
513DbDataAdapter dbDataAdapter =this._dbFactory.CreateDataAdapter();
514dbDataAdapter.SelectCommand = cmd;
515
516dbDataAdapter.Fill(ds);
517}
518
519return ds;
520}
521
522///
523/// 以事务的方式执行相应的命令,返回一个DataTable数据集合
524///
525/// 需要执行的DbCommand命令对象
526/// 数据库事务对象
527/// 返回一个DataTable数据集合
528public DataTable ExecuteDataTable(DbCommand cmd, Trans trans)
529{
530DataTable dataTable =new DataTable();
531
532if (cmd !=null)
533{
534cmd.Connection = trans.Connection;
535cmd.Transaction = trans.Transaction;
536
537DbDataAdapter dbDataAdapter =this._dbFactory.CreateDataAdapter();
538dbDataAdapter.SelectCommand = cmd;
539
540dbDataAdapter.Fill(dataTable);
541}
542
543return dataTable;
544}
545
546///
547/// 以事务的方式执行相应的命令,返回一个DbDataReader数据对象,如果没有则返回null值
548///
549/// 需要执行的DbCommand命令对象
550/// 数据库事务对象
551/// 返回一个DbDataReader数据对象,如果没有则返回null值
552public DbDataReader ExecuteReader(DbCommand cmd, Trans trans)
553{
554if (cmd !=null)
555{
556cmd.Connection.Close();
557
558cmd.Connection = trans.Connection;
559cmd.Transaction = trans.Transaction;
560
561DbDataReader reader = cmd.ExecuteReader();
562
563return reader;
564}
565
566return null;
567}
568
569///
570/// 以事务的方式执行相应的命令,返回影响的数据记录数,如果不成功则返回-1
571///
572/// 需要执行的DbCommand命令对象
573/// 数据库事务对象
574/// 返回影响的数据记录数,如果不成功则返回-1
575public int ExecuteNonQuery(DbCommand cmd, Trans trans)
576{
577if (cmd !=null)
578{
579cmd.Connection.Close();
580
581cmd.Connection = trans.Connection;
582cmd.Transaction = trans.Transaction;
583
584int retVal = cmd.ExecuteNonQuery();
585
586return retVal;
587}
588
589return -1;
590}
591
592///
593/// 以事务的方式执行相应的命令,返回结果集中的第一行第一列的值,如果不成功则返回null值
594///
595/// 需要执行的DbCommand命令对象
596/// 数据库事务对象
597/// 返回结果集中的第一行第一列的值,如果不成功则返回null值
598public object ExecuteScalar(DbCommand cmd, Trans trans)
599{
600if (cmd !=null)
601{
602cmd.Connection.Close();
603
604cmd.Connection = trans.Connection;
605cmd.Transaction = trans.Transaction;
606
607object retVal = cmd.ExecuteScalar();
608
609return retVal;
610}
611
612return null;
613}
614#endregion
615
616#endregion
617}
618
619///
620/// 说 明: 数据库事务操作对象
621/// 作 者: yangdeyong
622/// 时 间: 2012-04-10 10:19:23
623///
624///
625/// 作 者: yangdeyong
626/// 时 间: 2012-04-10 10:12:45
627///
628public sealed class Trans : IDisposable
629{
630#region 字段属性
631private DbConnection connection =null;
632///
633/// 获取当前数据库链接对象
634///
635public DbConnection Connection
636{
637get
638{
639return this.connection;
640}
641}
642
643private DbTransaction transaction =null;
644///
645/// 获取当前数据库事务对象
646///
647public DbTransaction Transaction
648{
649get
650{
651return this.transaction;
652}
653}
654#endregion
655
656#region 构造函数
657///
658/// 根据配置的数据库提供程序和连接字符串来创建此事务对象
659///
660public Trans()
661:this(DbHelper.DbConnectionString, DbHelper.DbProviderName)
662{
663}
664
665///
666/// 根据数据库连接字符串来创建此事务对象
667///
668/// 数据库连接字符串
669/// 数据库提供程序的名称
670public Trans(string connectionString,string dbProviderName)
671{
672if (!string.IsNullOrEmpty(connectionString))
673{
674this.connection = DbHelper.CreateDbConnection(connectionString, dbProviderName);
675this.Connection.Open();
676
677this.transaction =this.Connection.BeginTransaction();
678}
679else
680{
681throw new ArgumentNullException("connectionString","数据库链接串参数值不能为空!");
682}
683}
684#endregion
685
686#region 方法函数
687///
688/// 提交此数据库事务操作
689///
690public void Commit()
691{
692this.Transaction.Commit();
693
694this.Close();
695}
696
697///
698/// 回滚此数据库事务操作
699///
700public void RollBack()
701{
702this.Transaction.Rollback();
703
704this.Close();
705}
706
707///
708/// 关闭此数据库事务链接
709///
710public void Close()
711{
712if (this.Connection.State != System.Data.ConnectionState.Closed)
713{
714this.Connection.Close();
715}
716}
717#endregion
718
719#region IDisposable 成员
720///
721/// 执行与释放或重置非托管资源相关的应用程序定义的任务。
722///
723public void Dispose()
724{
725this.Close();
726}
727#endregion
728}
729}