一个通用的数据库访问类(sql server数据库)

我在开发中小型WEB网站或者WEB应用程序通常使用三层架构。有一个比较好的通用的数据访问类往往能大大加快项目的进度,并且如果以后维护,二次开发将相当的方便。

下面是一个通用的访问sql server数据库的访问类。它用到了微软企业开发库的组件Microsoft.Practices.EnterpriseLibrary.Data.dll。这个组件可以从网上下。

下面是详细的代码。我已经加了注释。

using System;

using System.Collections;

using System.Data;

using System.Web;

using System.Configuration;

using System.Data.Common;

using System.Data.SqlClient;

using Microsoft.Practices.EnterpriseLibrary.Data;

using Microsoft.Practices.EnterpriseLibrary.Data.Sql;

using System.Xml;

namespace DAL

{

    #region 实际客户端调用部分

    /// <summary>

    /// 提供通用的数据库访问操作,通过提供相应的存储过程名和参数集,来完成数据的SIUD操作.

    /// </summary>

    public class DataAccess

    {

        /// <summary>

        /// 私有构造函数以阻止客户端的new DataAccess()形式调用

        /// </summary>

        private DataAccess() { }

 

        #region 查询执行部分

        /// <summary>

        /// 执行查询,返回数据集

        /// </summary>

        /// <param name="connectionName">连接字符串名</param>

        /// <param name="commandType">命令类型(存储过程或T-SQL查询语句)</param>

        /// <param name="command">存储过程名或T-Sql查询语句</param>

        /// <param name="parameters">参数集合(不需要参数则为null)</param>

        /// <returns>数据集</returns>

        public static DataSet ExecuteDataSet(string connectionString, QueryType commandType, string command, SqlParameter[] parameters)

        {

            SqlDatabase database = new SqlDatabase(connectionString);

            SqlCommand sqlCommand = new SqlCommand();

            switch (commandType)

            {

                case QueryType.StorageProcedure:

                    sqlCommand = (SqlCommand)database.GetStoredProcCommand(command);

                    break;

                case QueryType.Text:

                    sqlCommand = (SqlCommand)database.GetSqlStringCommand(command);

                    break;

            }

            AttachParameters(ref sqlCommand, parameters);

            return database.ExecuteDataSet((DbCommand)sqlCommand);

 

        }

 

        /// <summary>

        /// 执行查询,返回受影响的行数

        /// </summary>

        /// <param name="connectionName">连接字符串名</param>

        /// <param name="commandType">命令类型(存储过程或T-SQL查询语句)</param>

        /// <param name="command">存储过程名或T-Sql查询语句</param>

        /// <param name="parameters">参数集合(不需要参数则为null)</param>

        /// <returns>受影响的行数</returns>

        public static int ExecuteNonQuery(string connectionString, QueryType commandType, string command, SqlParameter[] parameters)

        {

            SqlDatabase database = new SqlDatabase(connectionString);

            SqlCommand sqlCommand = new SqlCommand();

            switch (commandType)

            {

                case QueryType.StorageProcedure:

                    sqlCommand = (SqlCommand)database.GetStoredProcCommand(command);

                    break;

                case QueryType.Text:

                    sqlCommand = (SqlCommand)database.GetSqlStringCommand(command);

                    break;

            }

            AttachParameters(ref sqlCommand, parameters);

            return database.ExecuteNonQuery((DbCommand)sqlCommand);

        }

 

        /// <summary>

        /// 执行查询,返回SqlDataReader对象

        /// </summary>

        /// <param name="connectionName">连接字符串名</param>

        /// <param name="commandType">命令类型(存储过程或T-SQL查询语句)</param>

        /// <param name="command">存储过程名或T-Sql查询语句</param>

        /// <param name="parameters">参数集合(不需要参数则为null)</param>

        /// <returns>SqlDataReader对象</returns>

        public static SqlDataReader ExecuteReader(string connectionString, QueryType commandType, string command, SqlParameter[] parameters)

        {

            SqlDatabase database = new SqlDatabase(connectionString);

            SqlCommand sqlCommand = new SqlCommand();

            switch (commandType)

            {

                case QueryType.StorageProcedure:

                    sqlCommand = (SqlCommand)database.GetStoredProcCommand(command);

                    break;

                case QueryType.Text:

                    sqlCommand = (SqlCommand)database.GetSqlStringCommand(command);

                    break;

            }

            AttachParameters(ref sqlCommand, parameters);

            return (SqlDataReader)database.ExecuteReader((DbCommand)sqlCommand);

        }

 

        /// <summary>

        /// 执行查询,返回结果集中第一行第一列

        /// </summary>

        /// <param name="connectionName">连接字符串名</param>

        /// <param name="commandType">命令类型(存储过程或T-SQL查询语句)</param>

        /// <param name="command">存储过程名或T-Sql查询语句</param>

        /// <param name="parameters">参数集合(不需要参数则为null)</param>

        /// <returns>object对象</returns>

        public static object ExecuteScalar(string connectionString, QueryType commandType, string command, SqlParameter[] parameters)

        {

            SqlDatabase database = new SqlDatabase(connectionString);

            SqlCommand sqlCommand = new SqlCommand();

            switch (commandType)

            {

                case QueryType.StorageProcedure:

                    sqlCommand = (SqlCommand)database.GetStoredProcCommand(command);

                    break;

                case QueryType.Text:

                    sqlCommand = (SqlCommand)database.GetSqlStringCommand(command);

                    break;

            }

            AttachParameters(ref sqlCommand, parameters);

            return database.ExecuteScalar((DbCommand)sqlCommand);

        }

 

        /// <summary>

        /// 执行查询,返回XmlReader对象

        /// </summary>

        /// <param name="connectionName">连接字符串名</param>

        /// <param name="commandType">命令类型(存储过程或T-SQL查询语句)</param>

        /// <param name="command">存储过程名或T-Sql查询语句</param>

        /// <param name="parameters">参数集合(不需要参数则为null)</param>

        /// <returns>XmlReader对象</returns>

        public static XmlReader ExecuteXmlReader(string connectionString, QueryType commandType, string command, SqlParameter[] parameters)

        {

            SqlDatabase database = new SqlDatabase(connectionString);

            SqlCommand sqlCommand = new SqlCommand();

            switch (commandType)

            {

                case QueryType.StorageProcedure:

                    sqlCommand = (SqlCommand)database.GetStoredProcCommand(command);

                    break;

                case QueryType.Text:

                    sqlCommand = (SqlCommand)database.GetSqlStringCommand(command);

                    break;

            }

            AttachParameters(ref sqlCommand, parameters);

            return database.ExecuteXmlReader((DbCommand)sqlCommand);

        }

 

        /// <summary>

        /// 将参数关联到查询命令上

        /// </summary>

        /// <param name="sqlCommand">待添加查询参数的SqlCommand对象</param>

        /// <param name="parameters">SqlParameter对象集合</param>

        private static void AttachParameters(ref SqlCommand sqlCommand, SqlParameter[] parameters)

        {

            if (null == parameters)

                return;

            sqlCommand.Parameters.Clear();

            foreach (SqlParameter parameter in parameters)

            {

                sqlCommand.Parameters.Add(parameter);

            }

        }

 

        #endregion

 

        #region 获取连接字符串或SqlConnection对象,在新项目中修改连接字符串名称

        /// <summary>

        /// 获取连接字符串,默认节点名 "POConnectionString"

        /// </summary>

        /// <returns></returns>

        public static string GetConnectionString()

        {

            return ConnectionConfiguration.GetConnectionString("POConnectionString");

        }

 

        /// <summary>

        /// 获取连接字符串,支持 ASP.NET 2.0 程序

        /// </summary>

        /// <param name="nodeName">节点中的name属性的值</param>

        /// <returns>连接字符串</returns>

        private static string GetConnectionString(string NodeName)

        {

            return ConnectionConfiguration.GetConnectionString(NodeName);

        }

 

        /// <summary>

        /// 获取Sql连接对象,默认节点名 "POConnectionString"

        /// </summary>

        /// <returns></returns>

        public static SqlConnection GetSqlConnectionObject()

        {

            return ConnectionConfiguration.GetSqlConnectionObject("POConnectionString");

        }

 

        /// <summary>

        /// 获取SqlConnection对象,支持 ASP.NET 2.0程序

        /// </summary>

        /// <param name="nodeName">节点中的name属性的值</param>

        /// <returns>SqlConnection对象</returns>

        private static SqlConnection GetSqlConnectionObject(string NodeName)

        {

            return ConnectionConfiguration.GetSqlConnectionObject(NodeName);

        }

 

        #endregion

 

        #region 参数生成器

        /// <summary>

        /// 返回一个具有给定属性的SqlParameter对象

        /// </summary>

        /// <param name="parameterName">参数名</param>

        /// <param name="parameterType">参数Sql类型</param>

        /// <param name="ParameterLength">参数长度</param>

        /// <param name="parameterValue">参数值</param>

        /// <returns>SqlParameter 对象</returns>

        public static SqlParameter ParameterMaker(string parameterName, SqlDbType parameterType, int ParameterLength, object parameterValue)

        {

            return ParameterFactory.Make(parameterName, parameterType, ParameterLength, parameterValue);

        }

 

        /// <summary>

        /// 返回一个具有给定属性的SqlParameter对象

        /// </summary>

        /// <param name="parameterName">参数名</param>

        /// <param name="parameterValue">参数值</param>

        /// <returns>SqlParameter 对象</returns>

        public static SqlParameter ParameterMaker(string parameterName, object parameterValue)

        {

            return ParameterFactory.Make(parameterName, parameterValue);

        }

        #endregion

 

    }

    #endregion

 

    #region QueryType 枚举

    /// <summary>

    /// 查询类型

    /// </summary>

    public enum QueryType

    {

        /// <summary>

        /// 文本查询语句

        /// </summary>

        Text,

        /// <summary>

        /// 存储过程查询

        /// </summary>

        StorageProcedure

    }

    #endregion

 

    #region 获取连接字符串或SqlConnection连接对象

    /// <summary>

    /// 提供获取连接字符串或连接对象的静态方法

    /// </summary>

    internal class ConnectionConfiguration

    {

        /// <summary>

        /// 私有构造函数用来阻止客户端的new ConnectionConfiguration()调用

        /// </summary>

        private ConnectionConfiguration() { }

 

        /// <summary>

        /// 获取连接字符串,用于ASP.NET 2.0 程序

        /// </summary>

        /// <param name="nodeName">节点中的name属性的值</param>

        /// <returns>连接字符串</returns>

        public static string GetConnectionString(string nodeName)

        {

            return ConfigurationManager.ConnectionStrings[nodeName].ConnectionString;

        }

 

        /// <summary>

        /// 获取SqlConnection连接对象,用于ASP.NET 2.0 程序

        /// </summary>

        /// <param name="nodeName">节点中的name属性的值</param>

        /// <returns>SqlConnection对象</returns>

        public static SqlConnection GetSqlConnectionObject(string nodeName)

        {

            return new SqlConnection(GetConnectionString(nodeName));

        }

    }

 

    #endregion

 

    #region 参数生成器

    /// <summary>

    /// 参数生成器

    /// </summary>

    internal class ParameterFactory

    {

        /// <summary>

        /// 私有构造函数用来阻止客户端的new ParameterMaker调用

        /// </summary>

        private ParameterFactory() { }

 

        /// <summary>

        /// 返回一个具有给定属性的SqlParameter对象

        /// </summary>

        /// <param name="parameterName">参数名</param>

        /// <param name="parameterType">参数Sql类型</param>

        /// <param name="ParameterLength">参数长度</param>

        /// <param name="parameterValue">参数值</param>

        /// <returns>SqlParameter 对象</returns>

        public static SqlParameter Make(string parameterName, SqlDbType parameterType, int ParameterLength, object parameterValue)

        {

            SqlParameter parameter = new SqlParameter(parameterName, parameterType, ParameterLength);

            parameter.Value = parameterValue;

            return parameter;

        }

 

        /// <summary>

        /// 返回一个具有给定属性的SqlParameter对象

        /// </summary>

        /// <param name="parameterName">参数名</param>

        /// <param name="parameterValue">参数值</param>

        /// <returns>SqlParameter 对象</returns>

        public static SqlParameter Make(string parameterName, object parameterValue)

        {

            SqlParameter parameter = new SqlParameter(parameterName, parameterValue);

            return parameter;

        }

    }

    #endregion

 

}

 

这么多的代码是不是看起来有点晕。其实使用起来非常方便。我给大家将下使用方法。

1,  从网上下载Microsoft.Practices.EnterpriseLibrary.Data.dll组件。并添加引用到你的项目中。

2,  建立一个类文件DataAccess.cs,将上述代码copy到此类文件中。注意修改类名和命名空间。

3,  关于连接字符串你可以在网站的config配置文件中增加名称为. POConnectionString的connectionStrings节点。(获取连接字符串要用GetSqlConnectionObject()函数)。你也可以用自己的节点名称(获取连接字符串要用GetConnectionString(string nodeName)函数。nodeName为你自己取的节点名称)。

4,  手动添加System.Configuration的引用。方法是右键点击项目名称选择添加引用。在弹出的对话框中选择.net标签。然后找到System.Configuration点击确定。

大功告成。如何使用那。举几个简单的类子。

下面是一个函数。根据教师ID,学期ID返回教师的教授的课程。

        /// <summary>

        ///根据教师ID,学期ID返回教师的教授的课程

        /// </summary>

        /// <param name="teaid"></param>

        /// <param name="termid"></param>

        /// <returns></returns>

        public static DataTable SelectByTeaidTerm(string teaid, string termid)

        {

            string strSql = "select * from T_Tea_Course where TeaId = @teaid and TermId = @termid";  //构建的查询语句。@teaid,@termid是要传递的参数。

            SqlParameter[] paras =                                  // 构建参数队列

                {

                    DataAccess.ParameterMaker("@teaid",teaid),      //调用DataAccess类的参数构造

                    DataAccess.ParameterMaker("@termid",termid)

                };

            return DataAccess.ExecuteDataSet(DataAccess.GetConnectionString(), QueryType.Text, strSql, paras).Tables[0];     //调用DataAccess类的函数,返回一个datatable对象 其中第一个参数为获取连接字符串,第二个参数为查询命令的类型,QueryType.Text为文本,QueryType.StorageProcedure为存储过程。第三个参数为sql查询文本或者存储过程名称。第四个参数为要传递的参数列表,没有就写null.

        }

 

这个数据库访问类只能访问sql server数据库。但是前段时间我调到软件实验室开发一个军用保密项目,其中要使用oracle数据库。我想微软企业库肯定有oracledatabase。我试着把数据访问类中SqlParameter,SqlCommand,SqlDatabase...等全替换成OracleParameter,OracleCommand,OracleDataBase...然后调试运行,竟然成功了。大家可以照此把它改成连接oracle,access等数据库的数据访问类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值