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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    PHP extract() 函数
    PHP end() 函数
    PHP each() 函数
    PHP current() 函数
  • 原文地址:https://www.cnblogs.com/yelaiju/p/1832916.html
Copyright © 2011-2022 走看看