轻量级DbHelper同时支持多个不同的数据库
2012-07-03 16:02
176 查看
1.配置文件:
2.代码:
View Code
<system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite" /> <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.81.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /> </DbProviderFactories> </system.data> <connectionStrings> <!--<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>--> <add name="MSIDB" connectionString="Data Source=|DataDirectory|\sqlitedb.db3;Pooling=true;FailIfMissing=false" providerName="System.Data.SQLite" /> </connectionStrings>
2.代码:
View Code
/// <summary> /// common sql database (eg: sqlserver, oracle, mysql, sqlite) access helper /// </summary> /// <remarks> /// database configuration: /// <connectionStrings> /// <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> /// <add name="MSIDB" connectionString="Data Source=|DataDirectory|\sqlitedb;Pooling=true;FailIfMissing=false" providerName="System.Data.SQLite" /> /// </connectionStrings> /// </remarks> internal sealed class DBHelper { private readonly static Hashtable CachedFactories = Hashtable.Synchronized(new Hashtable()); private readonly DbProviderFactory _factory = null; private readonly string _connectionString = null; private DbConnection _connection = null; private DbTransaction _transaction; private bool _connectionIsOpen = false; public DBHelper(DataSources dataSource) : this(dataSource.ToString()) { } /// <summary> /// /// </summary> /// <param name="dbConfigName">database config name</param> public DBHelper(string dbConfigName) { var setting = ConfigurationManager.ConnectionStrings[dbConfigName]; if (setting == null) throw new ArgumentException("dbConfigName"); _factory = GetFactory(setting.ProviderName); _connectionString = setting.ConnectionString; } ~DBHelper() { Close(); } #region private properties/methods private DbConnection Connection { get { if (_connection == null) { _connection = _factory.CreateConnection(); _connection.ConnectionString = _connectionString; } return _connection; } } private static DbProviderFactory GetFactory(string providerName) { DbProviderFactory factory = CachedFactories[providerName] as DbProviderFactory; if (factory == null) { lock (CachedFactories.SyncRoot) { factory = DbProviderFactories.GetFactory(providerName); CachedFactories.Add(providerName, factory); } } return factory; } #endregion #region public methods /// <summary> /// /// </summary> public void Open() { if (Connection.State != ConnectionState.Open) { Connection.Open(); _connectionIsOpen = true; } } /// <summary> /// /// </summary> public void Close() { if (_connectionIsOpen && _transaction == null) { if (Connection != null && Connection.State != ConnectionState.Closed) { _connectionIsOpen = false; Connection.Close(); } } } /// <summary> /// /// </summary> public void BeginTransaction() { if (_transaction == null) { Open(); _transaction = Connection.BeginTransaction(); } } /// <summary> /// /// </summary> public void Rollback() { if (_transaction != null) { _transaction.Rollback(); _transaction.Dispose(); _transaction = null; } Close(); } /// <summary> /// /// </summary> public void Commit() { if (_transaction != null) { _transaction.Commit(); _transaction.Dispose(); _transaction = null; } Close(); } #endregion #region CreateCommand /// <summary> /// create new sql command /// </summary> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <param name="commandParams"></param> /// <param name="mustCloseConnection"></param> /// <returns></returns> private DbCommand CreateCommand(CommandType commandType, string commandText, IEnumerable<DbParameter> commandParams, out bool mustCloseConnection) { if (Connection == null) throw new ArgumentNullException("_connection"); if (string.IsNullOrEmpty(commandText)) throw new ArgumentNullException("commandText"); // If the provided Connection is not open, we will open it if (Connection.State != ConnectionState.Open) { mustCloseConnection = true; Connection.Open(); } else { mustCloseConnection = false; } DbCommand command = Connection.CreateCommand(); command.CommandText = commandText; if (_transaction != null) { if (_transaction.Connection == null) { throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); } command.Transaction = _transaction; } command.CommandType = commandType; if (commandParams != null) { foreach (DbParameter p in commandParams) { if (p != null) { if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) && (p.Value == null)) { p.Value = DBNull.Value; } command.Parameters.Add(p); } } } return command; } #endregion #region ExecuteNonQuery /// <summary> /// ExecuteNonQuery /// </summary> /// <param name="commandText"></param> /// <returns></returns> public int ExecuteNonQuery(string commandText) { return ExecuteNonQuery(CommandType.Text, commandText, null); } /// <summary> /// ExecuteNonQuery /// </summary> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <returns></returns> public int ExecuteNonQuery(CommandType commandType, string commandText) { return ExecuteNonQuery(commandType, commandText, null); } /// <summary> /// ExecuteNonQuery /// </summary> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <param name="cmdParams"></param> /// <returns></returns> public int ExecuteNonQuery(CommandType commandType, string commandText, IEnumerable<DbParameter> cmdParams) { bool mustCloseConnection = false; DbCommand cmd = CreateCommand(commandType, commandText, cmdParams, out mustCloseConnection); int ret = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); if (mustCloseConnection) { Connection.Close(); } return ret; } #endregion #region ExecuteDataset /// <summary> /// ExecuteDataset /// </summary> /// <param name="commandText"></param> /// <returns></returns> public DataSet ExecuteDataset(string commandText) { return ExecuteDataset(CommandType.Text, commandText, null); } /// <summary> /// ExecuteDataset /// </summary> /// <param name="spName">store procedure name</param> /// <param name="cmdParams"></param> /// <returns></returns> public DataSet ExecuteDataset(string spName, IEnumerable<DbParameter> cmdParams) { return ExecuteDataset(CommandType.StoredProcedure, spName, cmdParams); } /// <summary> /// ExecuteDataset /// </summary> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <returns></returns> public DataSet ExecuteDataset(CommandType commandType, string commandText) { return ExecuteDataset(commandType, commandText, null); } /// <summary> /// ExecuteDataset /// </summary> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <param name="cmdParams"></param> /// <returns></returns> public DataSet ExecuteDataset(CommandType commandType, string commandText, IEnumerable<DbParameter> cmdParams) { bool mustCloseConnection = false; DbCommand cmd = CreateCommand(commandType, commandText, cmdParams, out mustCloseConnection); using (DbDataAdapter adapter = _factory.CreateDataAdapter()) { adapter.SelectCommand = cmd; DataSet ds = new DataSet(); adapter.Fill(ds); cmd.Parameters.Clear(); if (mustCloseConnection) { Connection.Close(); } return ds; } } #endregion #region ExecuteReader /// <summary> /// ExecuteReader /// </summary> /// <param name="commandText"></param> /// <returns></returns> public DbDataReader ExecuteReader(string commandText) { return ExecuteReader(CommandType.Text, commandText, null); } /// <summary> /// ExecuteReader /// </summary> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <returns></returns> public DbDataReader ExecuteReader(CommandType commandType, string commandText) { return ExecuteReader(commandType, commandText, null); } /// <summary> /// ExecuteReader /// </summary> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <param name="cmdParams"></param> /// <returns></returns> public DbDataReader ExecuteReader(CommandType commandType, string commandText, IEnumerable<DbParameter> cmdParams) { bool mustCloseConnection = false; DbCommand cmd = CreateCommand(commandType, commandText, cmdParams, out mustCloseConnection); DbDataReader reader = null; if (mustCloseConnection) { reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } else { reader = cmd.ExecuteReader(); } // cmd.Parameters.Clear(); return reader; } #endregion #region ExecuteScalar /// <summary> /// ExecuteScalar /// </summary> /// <param name="commandText"></param> /// <returns></returns> public object ExecuteScalar(string commandText) { return ExecuteScalar(CommandType.Text, commandText, null); } /// <summary> /// ExecuteScalar /// </summary> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <returns></returns> public object ExecuteScalar(CommandType commandType, string commandText) { return ExecuteScalar(commandType, commandText, null); } /// <summary> /// ExecuteScalar /// </summary> /// <param name="commandType"></param> /// <param name="commandText"></param> /// <param name="cmdParams"></param> /// <returns></returns> public object ExecuteScalar(CommandType commandType, string commandText, IEnumerable<DbParameter> cmdParams) { bool mustCloseConnection = false; DbCommand cmd = CreateCommand(commandType, commandText, cmdParams, out mustCloseConnection); object ret = cmd.ExecuteScalar(); cmd.Parameters.Clear(); if (mustCloseConnection) { Connection.Close(); } return ret; } #endregion #region create parameter /// <summary> /// /// </summary> /// <param name="paramName"></param> /// <param name="dbType"></param> /// <param name="paramValue"></param> /// <returns></returns> public DbParameter MakeInParam(string paramName, DbType dbType, object paramValue) { return MakeParam(paramName, dbType, 0, ParameterDirection.Input, paramValue); } /// <summary> /// /// </summary> /// <param name="paramName"></param> /// <param name="dbType"></param> /// <param name="size"></param> /// <param name="paramValue"></param> /// <returns></returns> public DbParameter MakeInParam(string paramName, DbType dbType, int size, object paramValue) { return MakeParam(paramName, dbType, size, ParameterDirection.Input, paramValue); } /// <summary> /// /// </summary> /// <param name="paramName"></param> /// <param name="dbType"></param> /// <returns></returns> public DbParameter MakeOutParam(string paramName, DbType dbType) { return MakeParam(paramName, dbType, 0, ParameterDirection.Output, null); } /// <summary> /// /// </summary> /// <param name="paramName"></param> /// <param name="dbType"></param> /// <param name="size"></param> /// <returns></returns> public DbParameter MakeOutParam(string paramName, DbType dbType, int size) { return MakeParam(paramName, dbType, size, ParameterDirection.Output, null); } /// <summary> /// /// </summary> /// <param name="paramName"></param> /// <param name="dbType"></param> /// <param name="size"></param> /// <param name="direction"></param> /// <param name="paramValue"></param> /// <returns></returns> public DbParameter MakeParam(string paramName, DbType dbType, Int32 size, ParameterDirection direction, object paramValue) { DbParameter param = _factory.CreateParameter(); param.ParameterName = paramName; param.DbType = dbType; param.Size = size; param.Direction = direction; if (!(direction == ParameterDirection.Output && paramValue == null)) { param.Value = paramValue; } return param; } #endregion }
相关文章推荐
- COM+事务应用,在分布式应用程序中,同时操作多个不同数据库
- 同时连接两个不同服务器的数据库查询
- 安装和部署,同时支持多个数据库安装.
- 原创的轻量级ORM,支持Lambda进行数据库操作
- Java Spring中同时访问多种不同数据库(代码整理)
- ASP.NET站点的同时部署给不同的客户。通过数据库配置站点的Top、版权、站点名称
- C#-继承IDbConnection连接不同数据库,通用的DbHelper(1)
- CI框架同时连接不同的数据库(或不同表前缀)
- [置顶] PHPWAMP内置IIS管理器一键搭建PHP网站,支持无限个不同PHP版本同时运行
- 安装和部署,同时支持多个数据库安装.
- DBHelper (支持事务与数据库变更) z
- C#-继承IDbConnection连接不同数据库,通用的DbHelper(2)
- 根据不同的数据库调用不同的DBHelper(反射机制)
- 在Spring中同时访问多种不同数据库
- Mybatis同时支持多种数据库(oracle 和MySQL)
- 不同数据库对树状数据递归查询支持
- 让mybatis支持管理和操作多个不同的业务数据库实例
- 超强PHP集成环境,支持800多个不同PHP版本同时运行,无限自定义添加mysql与php版本
- 基于ShareKit2.0的版本,修改了Sina和Twitter的实现,支持同时发送URL和IMAGE,由于和原来的接口有所不同,所以开个分支。特别感谢icyleaf的工作基础
- 在Spring中同时访问多种不同数据库