zoukankan      html  css  js  c++  java
  • 通用数据库操作辅助类DbHelper

    有问题或者建议,请回复.
    如果懒得看的话,那么直接下载dll来用吧.https://files.cnblogs.com/yelaiju/System.Data.DbHelper.rar
     
    使用方式
    DbHelper db;
    OpenFileDialog ofd 
    = new OpenFileDialog();
    ofd.Filter 
    = "SQLite数据文件(*.db3;*.db;*.sqlite)|*.db3;*.db;*.sqlite";
    if (ofd.ShowDialog() == DialogResult.OK)
    {
        txtDataSource.Text 
    = ofd.FileName;
        db 
    = new DbHelper("data source=" + txtDataSource.Text, DbProvider.Sqlite);
    }
    db.ReExNum(txtSql.Text); 

    接口
    using System.Data;
    using System.Collections.Generic;
    using System.Data.Common;

    /// <summary>
    /// 该类用于对数据库进行操作
    /// Design by 火地晋
    /// </summary>
    namespace System.Data
    {
        
    public interface IDbObject
        {
            
    /// <summary>
            
    /// 定义一个DataReader的列表,已备检索
            
    /// </summary>
            List<DbDataReader> DataReaderList { getset; }
            
    /// <summary>
            
    /// 
            
    /// </summary>
            DbConnection Connection { getset; }
            
    string ConnectionString { getset; }
            DbProvider DbProviderType { 
    getset; }
            
            
    /// <summary>
            
    /// 返回执行操作成功的数目,使用注意,如果是存储过程,必须在存储过程后加上:select @@ROWCOUNT
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            int ReExNum(string strSql, params DbParameter[] parameters);
            
    /// <summary>
            
    /// 返回结果的存储过程
            
    /// </summary>
            
    /// <param name="strSql">任何SQL语句</param>
            
    /// <param name="parameters">参数值</param>
            
    /// <returns></returns>
            DbDataReader ReSelectdr(string strSql, params DbParameter[] parameters);
            
    /// <summary>
            
    /// 返回dateSet
            
    /// </summary>
            
    /// <param name="strSql"></param>
            
    /// <param name="parameters"></param>
            
    /// <param name="tableName"></param>
            
    /// <returns></returns>
            DataSet ReSelectds(string strSql, string tableName, params DbParameter[] parameters);
            DataTable ReSelectdtb(
    string strSql, params DbParameter[] parameters);
            
    /// <summary>
            
    /// 通過存儲過程及自定義參數組查詢返回SqlDataAdapter對象
            
    /// </summary>
            DbDataAdapter ReSelectdat(string strSql, params DbParameter[] parameters);

            
    void ExSQL(string strSql, params DbParameter[] parameters);
            
    /// <summary>
            
    ///     執行SQL查詢語句,返回記錄條數
            
    /// </summary>
            
    /// <param name="strSql">Select語句(在select语句中,使用Count(*)函数)</param>
            
    /// <returns>返回查詢到之記錄條數</returns>
            int ReSelectNum(string strSql, params DbParameter[] parameters);
            
    /// <summary>
            
    /// 使用SqlDataAdapter返回指定范围的数据
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数名</param>
            
    /// <param name="start">起始行</param>
            
    /// <param name="maxRecord">记录数</param>
            
    /// <param name="tableName">表名</param>
            
    /// <returns></returns>
            DataSet ReSelectds(string strSql, DbParameter[] parameters, int start, int maxRecord, string tableName);
            
    /// <summary>
            
    /// 返回执行操作成功的数目,不关闭连接
            
    /// </summary>
            
    /// <param name="strSql">执行的查询语句或存储过程</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            int ReExNumNoClose(string strSql, params DbParameter[] parameters);
            
    /// <summary>
            
    /// 返回执行操作成功的数目,不关闭连接,并返回出现的错误信息。
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            int ReExNumNoClose(string strSql, out string error, params DbParameter[] parameters);

            
    /// <summary>
            
    /// 返回执行操作成功的数目,并返回发生的错误信息
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            int ReExNum(string strSql, out string error, params DbParameter[] parameters);

            
    /// <summary>
            
    /// 返回执行操作结果的信息,如果返回为空则表示没错误,否则返回错误的信息。
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            string ReExStr(string strSql, params DbParameter[] parameters);
            
    /// <summary>
            
    /// 如果数据库连接已关闭,则打开
            
    /// </summary>
            
    /// <returns></returns>
            bool OpenConnection();
            
    /// <summary>
            
    /// 关闭数据库连接
            
    /// </summary>
            void CloseConnection();
        }
        
    public enum DbProvider
        {
            Sql
    =0,
            Sqlite
    =1,
            OleDb
    =2,
            Oracle
    =3,
            MySql
    =4
        }
    }
     

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data.Common;

    namespace System.Data
    {
        
    public class DbHelper : IDbObject
        {
            
    #region 属性
            
    public List<DbDataReader> DataReaderList { getset; }
            
    public DbConnection Connection { getset; }
            
    public string ConnectionString { getset; }
            
    public DbProvider DbProviderType { getset; }
            
    private DbProviderFactory dbFactory;
            
    #endregion

            
    #region 构造函数
            
    public DbHelper()
            {
                DbHelperInstance(System.Configuration.ConfigurationManager.AppSettings[
    "ConnectionString"], DbProvider.Sql);
            }
            
    public DbHelper(string connectionString)
            {
                DbHelperInstance(connectionString, DbProvider.Sql);
            }
            
    public DbHelper(DbProvider dbProviderType)
            {
                DbHelperInstance(System.Configuration.ConfigurationManager.AppSettings[
    "ConnectionString"], dbProviderType);
            }
            
    public DbHelper(string connectionString, DbProvider dbProviderType)
            {
                DbHelperInstance(connectionString, dbProviderType);
            }
            
    /// <summary>
            
    /// 初始化
            
    /// </summary>
            
    /// <param name="connectionString"></param>
            
    /// <param name="dbProviderType"></param>
            public void DbHelperInstance(string connectionString, DbProvider dbProviderType)
            {
                
    this.DbProviderType = dbProviderType;
                
    this.ConnectionString = connectionString;
                DataReaderList 
    = new List<DbDataReader>();
                CreateFactory();
                
    this.Connection = this.dbFactory.CreateConnection();
                
    this.Connection.ConnectionString = this.ConnectionString;
            }
            
    #endregion
            
    /// <summary>
            
    /// 创建数据操作工厂
            
    /// </summary>
            private void CreateFactory()
            {
                
    switch (DbProviderType)
                {
                    
    case DbProvider.Sql:
                        
    this.dbFactory = System.Data.SqlClient.SqlClientFactory.Instance;
                        
    break;
                    
    case DbProvider.Sqlite:
                        
    this.dbFactory = System.Data.SQLite.SQLiteFactory.Instance;
                        
    break;
                    
    case DbProvider.OleDb:
                        
    this.dbFactory = System.Data.OleDb.OleDbFactory.Instance;
                        
    break;
                    
    case DbProvider.Oracle:
                        
    this.dbFactory = System.Data.OracleClient.OracleClientFactory.Instance;
                        
    break;
                    
    case DbProvider.MySql:
                        
    this.dbFactory = MySql.Data.MySqlClient.MySqlClientFactory.Instance;
                        
    break;
                }
            }
            
    /// <summary>
            
    /// 创建操作对象
            
    /// </summary>
            
    /// <param name="procNameOrExText">如果包含@,则采用CommandType.Text</param>
            
    /// <param name="parameters"></param>
            
    /// <returns></returns>
            private DbCommand BuilderQueryCommand(string procNameOrExText, params DbParameter[] parameters)
            {
                
    if (parameters == null || parameters.Length == 0)
                {
                    DbCommand command 
    = this.dbFactory.CreateCommand();
                    command.CommandText 
    = procNameOrExText;
                    command.Connection 
    = this.Connection;
                    
    return command;
                }
                
    if (procNameOrExText.IndexOf('@'> 0)//存储过程
                {
                    
    return BuilderQueryCommandText(procNameOrExText, parameters);
                }
                
    else
                {
                    
    return BuilderQueryCommandStorPro(procNameOrExText, parameters);
                }
            }

            
    /// <summary>
            
    /// 根据存储过程名称和参数生成对应的SQL命令对象
            
    /// </summary>
            
    /// <param name="strSql">存储过程名或者</param>
            
    /// <param name="parameters">存储过程参数</param>
            
    /// <returns></returns>
            private DbCommand BuilderQueryCommandStorPro(string strSql, params DbParameter[] parameters)
            {
                DbCommand command 
    = this.dbFactory.CreateCommand();
                command.CommandText 
    = strSql;
                command.CommandType 
    = CommandType.StoredProcedure;
                command.Connection 
    = this.Connection;
                
    if (parameters != null)
                {
                    
    foreach (DbParameter p in parameters)
                    {
                        command.Parameters.Add(p);
                    }
                }
                
    return command;
            }
            
    private DbCommand BuilderQueryCommandText(string strSql, params DbParameter[] parameters)
            {
                DbCommand command 
    = this.dbFactory.CreateCommand();
                command.CommandText 
    = strSql;
                command.Connection 
    = this.Connection;
                
    if (parameters != null)
                {
                    
    foreach (DbParameter p in parameters)
                    {
                        command.Parameters.Add(p);
                    }
                }
                
    return command;
            }
            
    public DbParameter CreateDbParameter(string parameterName)
            {
                
    return CreateDbParameter(parameterName, DBNull.Value, DbType.Object, 0, ParameterDirection.Input);
            }
            
    public DbParameter CreateDbParameter(string parameterName, object value)
            {
                
    return CreateDbParameter(parameterName, value, DbType.Object, 0, ParameterDirection.Input);
            }
            
    public DbParameter CreateDbParameter(string parameterName, object value, DbType dbType)
            {
                
    return CreateDbParameter(parameterName,value,dbType,0,ParameterDirection.Input);
            }
            
    public DbParameter CreateDbParameter(string parameterName, object value, DbType dbType, int size)
            {
                
    return CreateDbParameter(parameterName,value,dbType,size,ParameterDirection.Input);
            }
            
    public DbParameter CreateDbParameter(string parameterName, object value, DbType dbType, int size, ParameterDirection parameterDirection)
            {
                DbParameter pat 
    = this.dbFactory.CreateParameter();
                pat.ParameterName 
    = parameterName;
                pat.Value 
    = value;
                pat.DbType 
    = dbType;
                pat.Size 
    = size;
                pat.Direction 
    = parameterDirection;
                
    return pat;
            }
            
    /// <summary>
            
    /// 返回执行操作成功的数目,使用注意,如果是存储过程,必须在存储过程后加上:select @@ROWCOUNT
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            public int ReExNum(string strSql, params DbParameter[] parameters)
            {
                
    int effect = 0;
                
    if (!OpenConnection()) return -1;
                DbTransaction trans 
    = Connection.BeginTransaction();
                
    try
                {
                    DbCommand cmd 
    = BuilderQueryCommand(strSql, parameters);
                    cmd.Transaction 
    = trans;
                    
    //根据是否为存储过程来执行不同的处理
                    if (cmd.CommandType == CommandType.StoredProcedure)
                    {
                        
    object result = cmd.ExecuteScalar();
                        effect 
    = result == null ? -1 : Convert.ToInt16(result);
                    }
                    
    else
                    {
                        effect 
    = cmd.ExecuteNonQuery();
                    }
                    trans.Commit();
                    
    return effect;
                }
                
    catch
                {
                    trans.Rollback();
                    Connection.Close();
                    
    return -1;
                }
                
    finally
                {
                    Connection.Close();
                }
            }
            
    /// <summary>
            
    /// 返回结果的存储过程
            
    /// </summary>
            
    /// <param name="strSql">任何SQL语句</param>
            
    /// <param name="parameters">参数值</param>
            
    /// <returns></returns>
            public DbDataReader ReSelectdr(string strSql, params DbParameter[] parameters)
            {
                
    try
                {
                    DbDataReader reader;
                    
    if (!OpenConnection()) return null;
                    DbCommand cmd 
    = BuilderQueryCommand(strSql, parameters);
                    reader 
    = cmd.ExecuteReader(CommandBehavior.CloseConnection);//在dr关闭之后,就不需要进行cnn的关闭操作了
                    DataReaderList.Add(reader);//添加进dr列表,已备检索
                    return reader;
                }
                
    catch
                {
                    
    return null;
                }
            }
            
    /// <summary>
            
    /// 返回dateSet
            
    /// </summary>
            
    /// <param name="strSql"></param>
            
    /// <param name="parameters"></param>
            
    /// <param name="tableName"></param>
            
    /// <returns></returns>
            public DataSet ReSelectds(string strSql, string tableName, params DbParameter[] parameters)
            {
                
    try
                {
                    DataSet ds 
    = new DataSet();
                    
    if (!OpenConnection()) return null;
                    DbDataAdapter myDa 
    = this.dbFactory.CreateDataAdapter();
                    myDa.SelectCommand 
    = BuilderQueryCommand(strSql, parameters);
                    myDa.Fill(ds, tableName);
                    
    return ds;
                }
                
    catch
                {
                    
    return null;
                }
                
    finally
                {
                    Connection.Close();
                }
            }
            
    public DataTable ReSelectdtb(string strSql, params DbParameter[] parameters)
            {
                
    try
                {
                    DataTable dt 
    = new DataTable();
                    
    if (!OpenConnection()) return null;
                    DbDataAdapter myDa 
    = this.dbFactory.CreateDataAdapter();
                    myDa.SelectCommand 
    = BuilderQueryCommand(strSql, parameters);
                    myDa.Fill(dt);
                    
    return dt;
                }
                
    catch
                {
                    
    return null;
                }
                
    finally
                {
                    Connection.Close();
                }
            }
            
    /// <summary>
            
    /// 通過存儲過程及自定義參數組查詢返回SqlDataAdapter對象
            
    /// </summary>
            public DbDataAdapter ReSelectdat(string strSql, params DbParameter[] parameters)
            {
                
    if (!OpenConnection()) return null;
                
    try
                {
                    DbCommand cmd 
    = BuilderQueryCommand(strSql, parameters);
                    DbDataAdapter myDa 
    = this.dbFactory.CreateDataAdapter();
                    myDa.SelectCommand 
    = cmd;
                    
    return myDa;
                }
                
    catch
                {
                    Connection.Close();
                    
    return null;
                }
            }

            
    public void ExSQL(string strSql, params DbParameter[] parameters)
            {
                
    if (!OpenConnection()) return;
                DbTransaction trans 
    = Connection.BeginTransaction();
                
    try
                {
                    DbCommand cmd 
    = BuilderQueryCommand(strSql, parameters);
                    cmd.Transaction 
    = trans;
                    cmd.ExecuteNonQuery();
                    trans.Commit();
                }
                
    catch
                {
                    trans.Rollback();
                    Connection.Close();
                    
    return;
                }
                
    finally
                {
                    Connection.Close();
                }
            }
            
    /// <summary>
            
    ///  執行SQL查詢語句,返回記錄條數
            
    /// </summary>
            
    /// <param name="strSql">Select語句(在select语句中,使用Count(*)函数)</param>
            
    /// <returns>返回查詢到之記錄條數</returns>
            public int ReSelectNum(string strSql, params DbParameter[] parameters)
            {
                
    int effect = 0;
                
    try
                {
                    
    using (DbDataReader dr = ReSelectdr(strSql, parameters))
                    {
                        if (dr.Read())
                        {
                            effect = Convert.ToInt32(dr.GetValue(0));
                        }
                        return effect;
                    }                
                }
                
    catch
                {
                    
    return effect;

                }
            }
            
    /// <summary>
            
    /// 使用SqlDataAdapter返回指定范围的数据
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数名</param>
            
    /// <param name="start">起始行</param>
            
    /// <param name="maxRecord">记录数</param>
            
    /// <param name="tableName">表名</param>
            
    /// <returns></returns>
            public DataSet ReSelectds(string strSql, DbParameter[] parameters, int start, int maxRecord, string tableName)
            {
                
    try
                {
                    DataSet ds 
    = new DataSet();
                    OpenConnection();
                    DbDataAdapter myDa 
    = this.dbFactory.CreateDataAdapter();
                    myDa.SelectCommand 
    = BuilderQueryCommand(strSql, parameters);
                    myDa.Fill(ds, start, maxRecord, tableName);
                    
    return ds;
                }
                
    catch
                {
                    Connection.Close();
                    
    return null;
                }
                
    finally
                {
                    Connection.Close();
                }
            }
            
    /// <summary>
            
    /// 返回执行操作成功的数目,不关闭连接
            
    /// </summary>
            
    /// <param name="strSql">执行的查询语句或存储过程</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            public int ReExNumNoClose(string strSql, params DbParameter[] parameters)
            {
                
    int effect = 0;
                
    if (!OpenConnection()) return -1;
                DbTransaction trans 
    = Connection.BeginTransaction();
                
    try
                {
                    DbCommand cmd 
    = BuilderQueryCommand(strSql, parameters);
                    cmd.Transaction 
    = trans;
                    
    //根据是否为存储过程来执行不同的处理
                    if (cmd.CommandType == CommandType.StoredProcedure)
                    {
                        
    object result = cmd.ExecuteScalar();
                        effect 
    = result == null ? -1 : Convert.ToInt16(result);
                    }
                    
    else
                    {
                        effect 
    = cmd.ExecuteNonQuery();
                    }
                    trans.Commit();
                    
    return effect;
                }
                
    catch
                {
                    trans.Rollback();
                    
    return effect;
                }
            }
            
    /// <summary>
            
    /// 返回执行操作成功的数目,不关闭连接,并返回出现的错误信息。
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            public int ReExNumNoClose(string strSql, out string error, params DbParameter[] parameters)
            {
                
    int effect = 0;
                error 
    = "";
                
    if (!OpenConnection()) return -1;
                DbTransaction trans 
    = Connection.BeginTransaction();
                
    try
                {
                    DbCommand cmd 
    = BuilderQueryCommand(strSql, parameters);
                    cmd.Transaction 
    = trans;
                    
    if (cmd.CommandType == CommandType.StoredProcedure)
                    {
                        
    object result = cmd.ExecuteScalar();
                        effect 
    = result == null ? -1 : Convert.ToInt16(result);
                    }
                    
    else
                    {
                        effect 
    = cmd.ExecuteNonQuery();
                    }
                    effect 
    = cmd.ExecuteNonQuery();
                    trans.Commit();
                    
    return effect;
                }
                
    catch (Exception ex)
                {
                    trans.Rollback();
                    error 
    = ex.Message;
                    
    return effect;
                }
            }

            
    /// <summary>
            
    /// 返回执行操作成功的数目,并返回发生的错误信息
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            public int ReExNum(string strSql, out string error, params DbParameter[] parameters)
            {
                
    int effect = 0;
                error 
    = "";
                
    if (!OpenConnection()) return -1;
                DbTransaction trans 
    = Connection.BeginTransaction();
                
    try
                {
                    DbCommand cmd 
    = BuilderQueryCommand(strSql, parameters);
                    cmd.Transaction 
    = trans;
                    
    if (cmd.CommandType == CommandType.StoredProcedure)
                    {
                        
    object result = cmd.ExecuteScalar();
                        effect 
    = result == null ? -1 : Convert.ToInt16(result);
                    }
                    
    else
                    {
                        effect 
    = cmd.ExecuteNonQuery();
                    }
                    trans.Commit();
                    
    return effect;
                }
                
    catch (Exception ex)
                {
                    trans.Rollback();
                    error 
    = ex.Message;
                    
    return effect;
                }
                
    finally
                {
                    Connection.Close();
                }
            }

            
    /// <summary>
            
    /// 返回执行操作结果的信息,如果返回为空则表示没错误,否则返回错误的信息。
            
    /// </summary>
            
    /// <param name="strSql">存储过程名</param>
            
    /// <param name="parameters">参数组</param>
            
    /// <returns></returns>
            public string ReExStr(string strSql, params DbParameter[] parameters)
            {
                
    string error = string.Empty;
                
    int effect = 0;
                
    if (!OpenConnection()) return null;
                DbTransaction trans 
    = Connection.BeginTransaction();
                
    try
                {
                    DbCommand cmd 
    = BuilderQueryCommand(strSql, parameters);
                    cmd.Transaction 
    = trans;
                    effect 
    = cmd.ExecuteNonQuery();
                    trans.Commit();
                    
    if (effect == 0)
                    {
                        error 
    = "操作成功记录数为0,请检查意外的错误。" + " sql语句:" + strSql;
                    }
                    
    else
                    {
                        error 
    = "";
                    }
                }
                
    catch (Exception ex)
                {
                    trans.Rollback();
                    error 
    = "sql语句:" + strSql + " 错误信息:" + ex.Message;
                }
                
    finally
                {
                    Connection.Close();
                }
                
    return error;
            }
            
    /// <summary>
            
    /// 如果数据库连接已关闭,则打开
            
    /// </summary>
            
    /// <returns></returns>
            public bool OpenConnection()
            {
                
    if (Connection.State == ConnectionState.Closed)
                {
                    
    try
                    {
                        Connection.Open();
                    }
                    
    catch
                    {
                        
    return false;
                    }
                }
                
    return true;
            }
            
    public void CloseConnection()
            {
                Connection.Close();
            }
        }
    }


     
    作者: 火地晋
    出处: http://yelaiju.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    [zt]VisualStudio2005技巧集合你真的会使用断点吗?
    轻松掌握Windows窗体间的数据交互
    Real Multithreading in .NET 2.0
    [zt]petshop4.0 详解之八(PetShop表示层设计)
    9.6 english log
    浅谈“三层结构”原理与用意
    [zt]petshop4.0 详解之四(PetShop之ASP.NET缓存)
    [虚拟技术]你会选谁:Red Hat还是Ubuntu KVM虚拟化?
    [虚拟技术]Linux KVM与Xen,QEMU的性能比较
    [虚拟化平台技术]选择哪一种虚拟化平台 KVM还是Xen?
  • 原文地址:https://www.cnblogs.com/yelaiju/p/1832916.html
Copyright © 2011-2022 走看看