DotNet(C#)中对数据库的访问

自己认为访问数据库比较好的方式供大家参考,若大家有更好的方式可以一起学习。

首先要完成数据库访问的接口IDBAccess:
#region 数据库访问接口
/// <summary>
/// 名称: IDBAccess
/// 功能: 数据库访问接口
/// 作者:
/// 版本: V1.0
/// 时间: 2007年12月2日
/// 修改人:
/// 修改时间:
/// 修改描述:
/// </summary>
public interface IDBAccess
{
    #region 打开数据库连接
    /// <summary>
    /// 打开数据库连接
    /// </summary>
    /// <returns>打开数据库连接是否成功。true:打开成功;false:打开失败</returns>
    bool OpenConnection();
    #endregion

    #region 关闭数据库连接
    /// <summary>
    /// 关闭数据库连接
    /// </summary>
    /// <returns>关闭数据库连接是否成功。true:关闭成功;false:关闭失败</returns>
    bool CloseConnection();

    #endregion

    #region 执行命令字符串返回影响的行数(适合于执行Update、Delete和Insert T_SQL语句)
    /// <summary>
    /// 执行命令字符串返回影响的行数(适合于执行Update、Delete和Insert T_SQL语句)
    /// </summary>
    /// <param name="commandText">要执行的T_SQL语句字符串</param>
    /// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>执行命令字符串后影响的行数</returns>
    int ExecuteNonQueryByText(string commandText, IDataParameter[] paraList);
    #endregion

    #region 执行命令字符串返回数据读取器(DataReader,适合于执行Select T_SQL语句)
    /// <summary>
    /// 执行命令字符串返回数据读取器(DataReader,适合于执行Select T_SQL语句)
    /// </summary>
    /// <param name="selectCommandText">要执行的T_SQL语句字符串</param>
    /// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>执行命令字符串后返回数据读取器</returns>
    IDataReader ExecuteReaderByText(string selectCommandText, IDataParameter[] paraList);
    #endregion

    #region 执行命令字符串返回首行首列的值(适合于执行Select语句中包含聚合函数的T_SQL语句)
    /// <summary>
    /// 执行命令字符串返回首行首列的值(适合于执行Select语句中包含聚合函数的T_SQL语句)
    /// </summary>
    /// <param name="selectCommandText">要执行Select语句中包含聚合函数的T_SQL语句字符串</param>
    /// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>执行命令字符串后返回首行首列的值</returns>
    object ExecuteScalarByText(string selectCommandText, IDataParameter[] paraList);
    #endregion

    #region 执行存储过程返回影响的行数(适合于执行Update、Delete和Insert T_SQL存储过程)
    /// <summary>
    /// 执行存储过程返回影响的行数(适合于执行Update、Delete和Insert T_SQL存储过程)
    /// </summary>
    /// <param name="procName">要执行的T_SQL语句的存储过程名称</param>
    /// <param name="paraList">T_SQL语句存储过程中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>执行存储过程后影响的行数</returns>
    int ExecuteNonQueryByProc(string procName, IDataParameter[] paraList);
    #endregion

    #region 执行存储过程返回数据读取器(DataReader,适合于执行Select T_SQL存储过程)
    /// <summary>
    /// 执行存储过程返回数据读取器(DataReader,适合于执行Select T_SQL语句)
    /// </summary>
    /// <param name="selectProcName">要执行的T_SQL存储过程名</param>
    /// <param name="paraList">T_SQL存储过程中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>执行存储过程后返回数据读取器</returns>
    IDataReader ExecuteReaderByProc(string selectProcName, IDataParameter[] paraList);
    #endregion

    #region 执行存储过程返回首行首列的值(适合于执行Select语句中包含聚合函数的T_SQL存储过程)
    /// <summary>
    /// 执行存储过程返回首行首列的值(适合于执行Select语句中包含聚合函数的T_SQL存储过程)
    /// </summary>
    /// <param name="selectProcName">要执行Select语句中包含聚合函数的T_SQL语句存储过程名</param>
    /// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>执行命令字符串后返回首行首列的值</returns>
    object ExecuteScalarByProc(string selectProcName, IDataParameter[] paraList);
    #endregion

    #region 执行命令字符串返回数据记录集(DataTable)
    /// <summary>
    /// 执行命令字符串返回数据记录集(DataTable)
    /// </summary>
    /// <param name="selectCommandText">要执行Select语句中包含聚合函数的T_SQL语句字符串</param>
    /// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>数据记录集(DataTable)</returns>
    DataTable ExecuteDataTableByText(string selectCommandText, IDataParameter[] paraList);
    #endregion


    #region 执行存储过程返回数据记录集(DataTable)
    /// <summary>
    /// 执行存储过程返回数据记录集(DataTable)
    /// </summary>
    /// <param name="selectProcName">要执行Select语句中包含聚合函数的T_SQL语句存储过程名</param>
    /// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>数据记录集(DataTable)</returns>
    DataTable ExecuteDataTableByProc(string selectProcName, IDataParameter[] paraList);
    #endregion
}
#endregion

其次实现数据库访问类,DBAccess从IDBAccess接口派生而来。另外,为了使类能够以任何形式访问数据库,故使用了泛型。
#region 数据库访问类(从IDBAccess接口派生出来)
/// <summary>
/// 名称: DBAccess<DBConnection, DBCommand, DBDataAdapter>
/// 功能: 数据库访问类(从IDBAccess接口派生出来)
/// 作者:
/// 版本: V1.0
/// 时间: 2007年12月2日
/// 修改人:
/// 修改时间:
/// 修改描述:
/// <typeparam name="DBConnection">数据库连接数据类型</typeparam>
/// <typeparam name="DBCommand">数据库命令数据类型</typeparam>
/// <typeparam name="DBDataAdapter">数据库数据适配器数据类型</typeparam>
class DBAccess<DBConnection, DBCommand, DBDataAdapter> : IDBAccess
    where DBConnection : System.Data.IDbConnection, new()
    where DBCommand : System.Data.IDbCommand, new()
    where DBDataAdapter : System.Data.IDbDataAdapter, new()
{
    private DBConnection connection;

    public DBAccess(string connectionString)
    {
        this.connection = new DBConnection();
        this.connection.ConnectionString = connectionString;
    }

    #region IDBAccess 成员

    public bool OpenConnection()
    {
        bool bIsSucceed = true;
        try
        {
            if (this.connection.State != ConnectionState.Open)
            {
                this.connection.Open();
            }
        }
        catch (Exception exp)
        {
            bIsSucceed = false;
            throw new Exception("打开数据库失败!信息:" + exp.Message);
        }

        return bIsSucceed;
    }

    public bool CloseConnection()
    {
        bool bIsSucceed = true;
        try
        {
            if (this.connection.State != ConnectionState.Closed)
            {
                this.connection.Close();
            }
        }
        catch (Exception exp)
        {
            bIsSucceed = false;
            throw new Exception("关闭数据库失败!信息:" + exp.Message);
        }

        return bIsSucceed;
    }

    private DBCommand CreateCommand(string commandText, CommandType type, IDataParameter[] paraList)
    {
        DBCommand command = default(DBCommand);

        try
        {
            command = new DBCommand();
            command.CommandText = commandText;
            command.CommandType = type;
            command.Connection = this.connection;

            if (paraList != null)
            {
                foreach (IDataParameter para in paraList)
                {
                    command.Parameters.Add(para);
                }
            }
        }
        catch (Exception exp)
        {
            throw new Exception("创建数据库操作的命令对象失败!信息:" + exp.Message);
        }
        return command;
    }

    public int ExecuteNonQueryByText(string commandText, IDataParameter[] paraList)
    {
        int rowCount = 0;
        try
        {
            DBCommand command = CreateCommand(commandText, CommandType.Text, paraList);

            OpenConnection();
            rowCount = command.ExecuteNonQuery();

        }
        catch (Exception exp)
        {
            throw new Exception("执行命令字符串返回影响的行数失败!信息:" + exp.Message);
        }
        finally
        {
            CloseConnection();
        }

        return rowCount;
    }

    public IDataReader ExecuteReaderByText(string selectCommandText, IDataParameter[] paraList)
    {
        IDataReader dataReader = null;
        try
        {
            DBCommand command = CreateCommand(selectCommandText, CommandType.Text, paraList);
            OpenConnection();
            dataReader = command.ExecuteReader();
        }
        catch (Exception exp)
        {
            CloseConnection();
            throw new Exception("执行命令字符串返回数据读取器失败!信息:" + exp.Message);
        }

        return dataReader;
    }

    public object ExecuteScalarByText(string selectCommandText, IDataParameter[] paraList)
    {
        object obj = null;
        try
        {
            DBCommand command = CreateCommand(selectCommandText, CommandType.Text, paraList);
            OpenConnection();
            obj = command.ExecuteScalar();
        }
        catch (Exception exp)
        {
            throw new Exception("执行命令字符串返回首行首列失败!信息:" + exp.Message);
        }
        finally
        {
            CloseConnection();
        }

        return obj;
    }

    public int ExecuteNonQueryByProc(string procName, IDataParameter[] paraList)
    {
        int rowCount = 0;
        try
        {
            DBCommand command = CreateCommand(procName, CommandType.StoredProcedure, paraList);

            OpenConnection();
            rowCount = command.ExecuteNonQuery();

        }
        catch (Exception exp)
        {
            throw new Exception("执行存储过程返回影响的行数失败!信息:" + exp.Message);
        }
        finally
        {
            CloseConnection();
        }

        return rowCount;
    }

    public IDataReader ExecuteReaderByProc(string selectProcName, IDataParameter[] paraList)
    {
        IDataReader dataReader = null;
        try
        {
            DBCommand command = CreateCommand(selectProcName, CommandType.StoredProcedure, paraList);
            OpenConnection();
            dataReader = command.ExecuteReader();
        }
        catch (Exception exp)
        {
            CloseConnection();
            throw new Exception("执行存储过程返回数据读取器失败!信息:" + exp.Message);
        }

        return dataReader;
    }

    public object ExecuteScalarByProc(string selectProcName, IDataParameter[] paraList)
    {
        object obj = null;
        try
        {
            DBCommand command = CreateCommand(selectProcName, CommandType.StoredProcedure, paraList);
            OpenConnection();
            obj = command.ExecuteScalar();
        }
        catch (Exception exp)
        {
            throw new Exception("执行存储过程返回首行首列失败!信息:" + exp.Message);
        }
        finally
        {
            CloseConnection();
        }

        return obj;
    }

    #endregion

    #region 执行命令字符串返回数据记录集(DataTable)
    /// <summary>
    /// 执行命令字符串返回数据记录集(DataTable)
    /// </summary>
    /// <param name="selectCommandText">要执行Select语句中包含聚合函数的T_SQL语句字符串</param>
    /// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>数据记录集(DataTable)</returns>
    public DataTable ExecuteDataTableByText(string selectCommandText, IDataParameter[] paraList)
    {
        DataSet ds = new DataSet();

        try
        {
            DBCommand command = CreateCommand(selectCommandText, CommandType.Text, paraList);
            DBDataAdapter da = new DBDataAdapter();
            da.SelectCommand = command;

            da.Fill(ds);
        }
        catch (Exception exp)
        {
            throw new Exception("执行命令字符串返回数据记录集异常!信息:" + exp.Message);
        }
        finally
        {
            CloseConnection();
        }

        return ds.Tables[0];
    }
    #endregion


    #region 执行存储过程返回数据记录集(DataTable)
    /// <summary>
    /// 执行存储过程返回数据记录集(DataTable)
    /// </summary>
    /// <param name="selectProcName">要执行Select语句中包含聚合函数的T_SQL语句存储过程名</param>
    /// <param name="paraList">T_SQL语句字符串中所代的参数数组(无参数是paraList为null)</param>
    /// <returns>数据记录集(DataTable)</returns>
    public DataTable ExecuteDataTableByProc(string selectProcName, IDataParameter[] paraList)
    {
        DataSet ds = new DataSet();

        try
        {
            DBCommand command = CreateCommand(selectProcName, CommandType.StoredProcedure, paraList);
            DBDataAdapter da = new DBDataAdapter();
            da.SelectCommand = command;

            da.Fill(ds);
        }
        catch (Exception exp)
        {
            throw new Exception("执行存储过程返回数据记录集!信息:" + exp.Message);
        }
        finally
        {
            CloseConnection();
        }

        return ds.Tables[0];
    }
    #endregion
}
#endregion

接着要实现数据库访问的形式的枚举:
#region 访问数据库类型的枚举
/// <summary>
/// 名称: DBAccessType
/// 功能: 访问数据库类型的枚举
/// 作者:
/// 版本: V1.0
/// 时间: 2007年12月2日
/// 修改人:
/// 修改时间:
/// 修改描述:
/// </summary>
public enum DBAccessType
{
    Sql,    // 以Sql形式访问数据库
    Odbc,   // 以Odbc形式访问数据库
    OleDb,  // 以OleDb形式访问数据库
    Oracle  // 以Oracle形式访问数据库
}
#endregion

最后实现数据库访问的工厂:
#region 数据库访问工厂类
/// <summary>
/// 名称: DBAccessFactory
/// 功能: 数据库访问工厂类
/// 作者:
/// 版本: V1.0
/// 时间: 2007年12月2日
/// 修改人:
/// 修改时间:
/// 修改描述:
/// </summary>
public class DBAccessFactory
{
    #region 获取数据库访问对象
    /// <summary>
    /// 获取数据库访问对象
    /// </summary>
    /// <param name="type">数据库访问的形式</param>
    /// <param name="connectionString">访问数据库的连接字符串</param>
    /// <returns>数据库访问对象</returns>
    public static IDBAccess GetDBAccess(DBAccessType type, string connectionString)
    {
        IDBAccess dbAccess = null;
        switch (type)
        {
            case DBAccessType.Sql:
                dbAccess = new DBAccess<SqlConnection, SqlCommand, SqlDataAdapter>(connectionString);
                break;
            case DBAccessType.Odbc:
                dbAccess = new DBAccess<OdbcConnection, OdbcCommand, OdbcDataAdapter>(connectionString);
                break;
            case DBAccessType.OleDb:
                dbAccess = new DBAccess<OleDbConnection, OleDbCommand, OleDbDataAdapter>(connectionString);
                break;
            case DBAccessType.Oracle:
                dbAccess = new DBAccess<OracleConnection, OracleCommand, OracleDataAdapter>(connectionString);
                break;
            default:
                break;
        }

        return dbAccess;
    }
    #endregion
}
#endregion 

转载于:https://www.cnblogs.com/SomkeOldLi/archive/2007/12/08/DatabaseAccess.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值