C#连接层的数据访问类(简单版)

目前只写了与SqlServer的数据处理。

首先是静态工厂类。

using System;
using System.Configuration;

namespace XPSoft.BaseLibrary.DataAccess
{
    /// <summary>
    /// 数据访问对象的静态工厂类,用于创建不同类型的数据访问对象。
    /// </summary>
    public static class DataAccessFactory
    {
        /// <summary>
        /// 通过数据访问类型去实例化一个数据访问对象。
        /// </summary>
        /// <param name="dataAccessType">数据访问类型枚举。</param>
        /// <returns>数据访问对象。</returns>
        public static IDataAccess InstanceDataAccess(DataAccessType dataAccessType)
        {
            //  声明一个数据访问对象,根据枚举参数选择实例化哪种类型。
            IDataAccess dataAccess = null;
            string provideName = ConfigurationManager.ConnectionStrings["SqlServer"].ProviderName;
            string connectionString = ConfigurationManager.ConnectionStrings["SqlServer"].ConnectionString;
            switch (dataAccessType)
            {
                //  创建SqlServer数据访问类。
                case DataAccessType.SqlServer:
                    dataAccess = new SqlServerDataAccess(ConfigurationManager.ConnectionStrings["SqlServer"].ToString());
                    break;
            }
            if (dataAccess == null) { throw new ArgumentNullException("通过传入的枚举值,未能找到合适的数据访问类。"); }
            return dataAccess;
        }
    }
}

接下来定义了一个数据类型枚举。

using System;

namespace XPSoft.BaseLibrary.DataAccess
{
    /// <summary>
    /// 数据访问类型枚举。
    /// </summary>
    public enum DataAccessType : byte
    {
        Oracle = 0,     //  Oracle数据库。
        SqlServer = 1,  //  SqlServer数据库。
        MySql = 2,      //  MySql数据库。
        Oledb = 3       //  其他数据库。
    }
}

接着是数据访问对象的接口。

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

namespace XPSoft.BaseLibrary.DataAccess
{
    public interface IDataAccess
    {
        /// <summary>
        /// 执行不返回数据集的Sql操作。
        /// </summary>
        /// <param name="commandText">要执行的Sql语句。</param>
        /// <returns>受影响的行数。</returns>
        int ExecuteNonQuery(string commandText);

        /// <summary>
        /// 执行不返回数据集的Sql操作。
        /// </summary>
        /// <param name="command">要执行的数据库命令对象。</param>
        /// <returns>受影响的行数。</returns>
        int ExecuteNonQuery(DbCommand command);

        /// <summary>
        /// 执行不返回数据集的Sql操作。
        /// </summary>
        /// <param name="commandTexts">要执行的Sql语句集合。</param>
        /// <returns>受影响的行数。</returns>
        int ExecuteNonQuery(IList<string> commandTexts);

        /// <summary>
        /// 执行不返回数据集的Sql操作。
        /// </summary>
        /// <param name="commands">要执行的DbCommand接口集合。</param>
        /// <returns>受影响的行数。</returns>
        int ExecuteNonQuery(IList<DbCommand> commands);

        /// <summary>
        /// 执行不返回数据集的存储过程。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <returns>受影响的行数。</returns>
        int ExecuteNonQueryByStoredProcedure(string storedProcedureName);

        /// <summary>
        /// 执行不返回数据集的存储过程。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <param name="parameters">存储过程的参数。</param>
        /// <returns>受影响的行数。</returns>
        int ExecuteNonQueryByStoredProcedure(string storedProcedureName, params DbParameter[] parameters);

        /// <summary>
        /// 执行Sql操作,返回数据集的第一行第一列。
        /// </summary>
        /// <param name="commandText">要执行的Sql语句。</param>
        /// <returns>数据集的第一行第一列。</returns>
        object ExecuteScalar(string commandText);

        /// <summary>
        /// 执行Sql操作,返回数据集的第一行第一列。
        /// </summary>
        /// <param name="command">要执行的数据库命令对象。</param>
        /// <returns>数据集的第一行第一列。</returns>
        object ExecuteScalar(DbCommand command);

        /// <summary>
        /// 执行存储过程,返回数据集的第一行第一列。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <returns>数据集的第一行第一列。</returns>
        object ExecuteScalarByStoredProcedure(string storedProcedureName);

        /// <summary>
        /// 执行存储过程,返回数据集的第一行第一列。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <param name="parameters">存储过程的参数。</param>
        /// <returns>数据集的第一行第一列。</returns>
        object ExecuteScalarByStoredProcedure(string storedProcedureName, params DbParameter[] parameters);

        /// <summary>
        /// 执行Sql操作,返回DataSet数据集。
        /// </summary>
        /// <param name="commandText">要执行的Sql语句。</param>
        /// <returns>DataSet数据集。</returns>
        DataSet ExecuteDataSet(string commandText);

        /// <summary>
        /// 执行Sql语句,返回DataSet数据集。
        /// </summary>
        /// <param name="command">要执行的数据库命令对象。</param>
        /// <returns>DataSet数据集。</returns>
        DataSet ExecuteDataSet(DbCommand command);

        /// <summary>
        /// 执行Sql语句,返回DataSet数据集。
        /// </summary>
        /// <param name="commandTexts">要执行的Sql语句集合。</param>
        /// <param name="tableNames">DataSet数据集中Table的名称集合。</param>
        /// <returns>DataSet数据集。</returns>
        DataSet ExecuteDataSet(IList<string> commandTexts, IList<string> tableNames);

        /// <summary>
        /// 执行Sql语句,返回DataSet数据集。
        /// </summary>
        /// <param name="commandTexts">要执行的DbCommand接口集合。</param>
        /// <param name="tableNames">DataSet数据集中Table的名称集合。</param>
        /// <returns>DataSet数据集。</returns>
        DataSet ExecuteDataSet(IList<DbCommand> commands, IList<string> tableNames);

        /// <summary>
        /// 执行存储过程,返回DataSet数据集。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <returns>DataSet数据集。</returns>
        DataSet ExecuteDataSetByStoredProcedure(string storedProcedureName);

        /// <summary>
        /// 执行存储过程,返回DataSet数据集。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <param name="parameters">存储过程的参数。</param>
        /// <returns>DataSet数据集。</returns>
        DataSet ExecuteDataSetByStoredProcedure(string storedProcedureName, params DbParameter[] parameters);

        /// <summary>
        /// 执行Sql语句,返回XmlDocument对象。
        /// </summary>
        /// <param name="commandText">要执行的Sql语句。</param>
        /// <returns>XmlDocument对象。</returns>
        XmlDocument ExecuteDataXml(string commandText);

        /// <summary>
        /// 执行Sql操作,返回XmlDocument对象。
        /// </summary>
        /// <param name="command">要执行的数据库命令对象。</param>
        /// <returns>XmlDocument对象。</returns>
        XmlDocument ExecuteDataXml(DbCommand command);

        /// <summary>
        /// 执行Sql操作,返回XmlDocument对象。
        /// </summary>
        /// <param name="commandTexts">要执行的Sql语句集合。</param>
        /// <param name="tableNames">XmlDocument对象中Element属性的名称集合。</param>
        /// <returns>XmlDocument对象。</returns>
        XmlDocument ExecuteDataXml(IList<string> commandTexts, IList<string> tableNames);

        /// <summary>
        /// 执行存储过程,返回XmlDocument对象。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <returns>XmlDocument对象。</returns>
        XmlDocument ExecuteDataXmlByStoredProcedure(string storedProcedureName);

        /// <summary>
        /// 执行存储过程,返回XmlDocument对象。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <param name="parameters">存储过程的参数。</param>
        /// <returns>XmlDocument对象。</returns>
        XmlDocument ExecuteDataXmlByStoredProcedure(string storedProcedureName, params DbParameter[] parameters);
    }
}

最后就是实现类,目前只做了SqlServer的。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Xml;

namespace XPSoft.BaseLibrary.DataAccess
{
    public class SqlServerDataAccess : IDataAccess
    {
        //  数据库连接对象。
        private static SqlConnection connection = null;

        /// <summary>
        /// 构造函数。
        /// </summary>
        public SqlServerDataAccess() { }

        /// <summary>
        /// 构造函数。
        /// </summary>
        /// <param name="connectionString">数据库连接字符串。</param>
        public SqlServerDataAccess(string connectionString)
        {
            if (connection == null) {
                //  通过字符串实例化SqlConnection对象。
                connection = new SqlConnection(connectionString);
            }
        }

        #region 私有方法

        /// <summary>
        /// 打开数据库连接对象。
        /// </summary>
        /// <exception cref="SqlException、InvalidOperationException"></exception>
        private void OpenConnection()
        {
            //  如果数据连接为关闭状态,那么将打开连接。
            //  否则将抛出异常。
            if (connection.State == ConnectionState.Closed)
            {
                try { connection.Open(); }
                catch (SqlException sqlEx) { throw sqlEx; }
                catch (InvalidOperationException iopEx) { throw iopEx; }
            }
        }

        /// <summary>
        /// 关闭数据库连接对象。
        /// </summary>
        /// <exception cref="SqlException"></exception>
        private void CloseConnection()
        {
            //  如果数据连接不为关闭状态,那么将关闭连接。
            //  否则将抛出异常。
            if (connection.State != ConnectionState.Closed)
            {
                try { connection.Close(); }
                catch (SqlException sqlEx) { throw sqlEx; }
            }
        }

        /// <summary>
        /// 将DataSet中的列映射成XML特性。
        /// </summary>
        /// <param name="ds">DataSet对象。</param>
        private XmlDocument ConvertDataSetToXmlDocument(DataSet ds)
        {
            foreach (DataTable dt in ds.Tables)
            {
                foreach (DataColumn dc in dt.Columns)
                {
                    dc.ColumnMapping = MappingType.Attribute;
                }
            }
            XmlDocument xmlDom = new XmlDocument();
            xmlDom.LoadXml(ds.GetXml());
            return xmlDom;
        }

        #endregion

        /// <summary>
        /// 执行不返回数据集的Sql操作。
        /// </summary>
        /// <param name="commandText">要执行的Sql语句。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>受影响的行数。</returns>
        public int ExecuteNonQuery(string commandText)
        {
            //  如果要执行的Sql语句为空,将抛出ArgumentException异常。
            if (string.IsNullOrWhiteSpace(commandText))
            { throw new ArgumentException("要执行的Sql语句不能为空。"); }
            try
            {
                //  实例化一个SqlCommand对象,并指定要执行的Sql语句。
                using (DbCommand command = new SqlCommand(commandText, connection))
                {
                    //  打开数据库连接对象。
                    this.OpenConnection();
                    //  执行操作并返回受影响的行数。
                    int count = command.ExecuteNonQuery();
                    return count;
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException iopEx) { throw iopEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行不返回数据集的Sql操作。
        /// </summary>
        /// <param name="command">要执行的数据库命令对象。</param>
        /// <exception cref="SqlException、InvalidOperationException"></exception>
        /// <returns>受影响的行数。</returns>
        public int ExecuteNonQuery(DbCommand command)
        {
            try
            {
                //  打开数据库连接对象。
                command.Connection = connection;
                this.OpenConnection();
                //  执行操作并返回受影响的行数。
                int count = command.ExecuteNonQuery();
                return count;
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException iopEx) { throw iopEx; }
            finally
            {
                command.Dispose();
                this.CloseConnection();
            }
        }

        /// <summary>
        /// 执行不返回数据集的Sql操作。
        /// </summary>
        /// <param name="commandTexts">要执行的Sql语句集合。</param>
        /// <exception cref="ArgumentNullException、SqlException、InvalidOperationException"></exception>
        /// <returns>受影响的行数。</returns>
        public int ExecuteNonQuery(IList<string> commandTexts)
        {
            if (commandTexts.Count <= 0)
            { throw new ArgumentNullException("要执行的Sql语句不能为空。"); }
            //  Sql事务。
            SqlTransaction transaction = null;
            try
            {
                //  实例化一个SqlCommand对象,并指定要执行的Sql语句。
                using (DbCommand command = new SqlCommand())
                {
                    int count = 0;
                    //  打开数据库连接对象。
                    this.OpenConnection();
                    command.Connection = connection;
                    //  开始事务。
                    transaction = connection.BeginTransaction();
                    command.Transaction = transaction;
                    foreach (string commandText in commandTexts)
                    {
                        //  执行操作。
                        command.CommandText = commandText;
                        count += command.ExecuteNonQuery();
                    }
                    //  提交事务。
                    transaction.Commit();
                    //  返回受影响的行数。
                    return count;
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException iopEx)
            {
                //  回滚事务。
                transaction.Rollback();
                throw iopEx;
            }
            finally
            {
                transaction.Dispose();
                this.CloseConnection();
            }
        }

        /// <summary>
        /// 执行不返回数据集的Sql操作。
        /// </summary>
        /// <param name="commands">要执行的DbCommand接口集合。</param>
        /// <exception cref="SqlException、InvalidOperationException"></exception>
        /// <returns>受影响的行数。</returns>
        public int ExecuteNonQuery(IList<DbCommand> commands)
        {
            //  受影响的行数。
            int count = 0;
            //  数据库事务对象。
            SqlTransaction transaction = null;
            try
            {
                //  打开数据库连接对象。
                this.OpenConnection();
                //  设置数据库事务对象。
                transaction = connection.BeginTransaction();
                foreach (DbCommand command in commands)
                {
                    //  执行操作并返回受影响的行数。
                    command.Connection = connection;
                    command.Transaction = transaction;
                    count += command.ExecuteNonQuery();
                    command.Dispose();
                }
                //  提交事务。
                transaction.Commit();
                //  返回影响的行数。
                return count;
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException iopEx)
            {
                //  回滚事务。
                transaction.Rollback();
                throw iopEx;
            }
            finally
            {
                transaction.Dispose();
                this.CloseConnection();
            }
        }

        /// <summary>
        /// 执行不返回数据集的存储过程。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>受影响的行数。</returns>
        public int ExecuteNonQueryByStoredProcedure(string storedProcedureName)
        {
            if (string.IsNullOrWhiteSpace(storedProcedureName))
            { throw new ArgumentNullException("要执行的存储过程名称不能为空。"); }
            try
            {
                //  打开数据库连接。
                OpenConnection();
                //  创建数据库命令对象。
                using (DbCommand command = new SqlCommand())
                {
                    command.Connection = connection;
                    command.CommandText = storedProcedureName;
                    command.CommandType = CommandType.StoredProcedure;
                    //  执行操作。
                    int count = command.ExecuteNonQuery();
                    //  返回受影响的行数。
                    return count;
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行不返回数据集的存储过程。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <param name="parameters">存储过程的参数。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>受影响的行数。</returns>
        public int ExecuteNonQueryByStoredProcedure(string storedProcedureName, params DbParameter[] parameters)
        {
            if (string.IsNullOrWhiteSpace(storedProcedureName))
            { throw new ArgumentNullException("要执行的存储过程名称不能为空。"); }
            try
            {
                //  打开数据库连接。
                OpenConnection();
                //  创建数据库命令对象。
                using (DbCommand command = new SqlCommand())
                {
                    command.Connection = connection;
                    command.CommandText = storedProcedureName;
                    command.CommandType = CommandType.StoredProcedure;
                    //  添加存储过程参数。
                    foreach (DbParameter parameter in parameters)
                    {
                        command.Parameters.Add(parameter);
                    }
                    //  执行操作。
                    int count = command.ExecuteNonQuery();
                    //  返回受影响的行数。
                    return count;
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行Sql操作,返回数据集的第一行第一列。
        /// </summary>
        /// <param name="commandText">要执行的Sql语句。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>数据集的第一行第一列。</returns>
        public object ExecuteScalar(string commandText)
        {
            //  如果要执行的Sql语句为空,将抛出ArgumentException异常。
            if (string.IsNullOrWhiteSpace(commandText))
            { throw new ArgumentException("要执行的Sql语句不能为空。"); }
            try
            {
                //  实例化一个SqlCommand对象,并指定要执行的Sql语句。
                using (DbCommand command = new SqlCommand(commandText, connection))
                {
                    //  打开数据库连接对象。
                    this.OpenConnection();
                    //  返回数据集的第一行第一列。
                    object result = command.ExecuteScalar();
                    return result;
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException iopEx) { throw iopEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行Sql操作,返回数据集的第一行第一列。
        /// </summary>
        /// <param name="command">要执行的数据库命令对象。</param>
        /// <exception cref="SqlException、InvalidOperationException"></exception>
        /// <returns>数据集的第一行第一列。</returns>
        public object ExecuteScalar(DbCommand command)
        {
            try
            {
                //  打开数据库连接对象。
                command.Connection = connection;
                this.OpenConnection();
                //  返回数据集的第一行第一列。
                object result = command.ExecuteScalar();
                return result;
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException iopEx) { throw iopEx; }
            finally
            {
                command.Dispose();
                this.CloseConnection();
            }
        }

        /// <summary>
        /// 执行存储过程,返回数据集的第一行第一列。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>数据集的第一行第一列。</returns>
        public object ExecuteScalarByStoredProcedure(string storedProcedureName)
        {
            if (string.IsNullOrWhiteSpace(storedProcedureName))
            { throw new ArgumentNullException("要执行的存储过程名称不能为空。"); }
            try
            {
                //  打开数据库连接对象。
                OpenConnection();
                //  创建数据库命令对象。
                using (DbCommand command = new SqlCommand())
                {
                    command.Connection = connection;
                    command.CommandText = storedProcedureName;
                    command.CommandType = CommandType.StoredProcedure;
                    //  返回数据集的第一行第一列。
                    object result = command.ExecuteScalar();
                    return result;
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行存储过程,返回数据集的第一行第一列。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <param name="parameters">存储过程的参数。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>数据集的第一行第一列。</returns>
        public object ExecuteScalarByStoredProcedure(string storedProcedureName, params DbParameter[] parameters)
        {
            if (string.IsNullOrWhiteSpace(storedProcedureName))
            { throw new ArgumentNullException("要执行的存储过程名称不能为空。"); }
            try
            {
                //  打开数据库连接对象。
                OpenConnection();
                //  创建数据库命令对象。
                using (DbCommand command = new SqlCommand())
                {
                    command.Connection = connection;
                    command.CommandText = storedProcedureName;
                    command.CommandType = CommandType.StoredProcedure;
                    //  添加存储过程参数。
                    foreach (DbParameter parameter in parameters)
                    {
                        command.Parameters.Add(parameter);
                    }
                    //  返回数据集的第一行第一列。
                    object result = command.ExecuteScalar();
                    return result;
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行Sql操作,返回DataSet数据集。
        /// </summary>
        /// <param name="commandText">要执行的Sql语句。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>DataSet数据集。</returns>
        public DataSet ExecuteDataSet(string commandText)
        {
            if (string.IsNullOrWhiteSpace(commandText))
            { throw new ArgumentNullException("commandText", "要执行的Sql语句不能为空。"); }
            try
            {
                //  创建数据库命令对象。
                using (DbCommand command = new SqlCommand(commandText))
                {
                    //  创建数据库适配器。
                    using (DbDataAdapter adapter = new SqlDataAdapter())
                    {
                        adapter.SelectCommand = command;
                        //  打开数据库连接对象。
                        command.Connection = connection;
                        OpenConnection();
                        //  创建数据集。
                        DataSet dataSet = new DataSet();
                        //  填充数据集。
                        adapter.Fill(dataSet);
                        //  返回数据集。
                        return dataSet;
                    }
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行Sql语句,返回DataSet数据集。
        /// </summary>
        /// <param name="command">要执行的数据库命令对象。</param>
        /// <exception cref="SqlException、InvalidOperationException"></exception>
        /// <returns>DataSet数据集。</returns>
        public DataSet ExecuteDataSet(DbCommand command)
        {
            try
            {
                //  创建数据库适配器。
                using (DbDataAdapter adapter = new SqlDataAdapter())
                {
                    adapter.SelectCommand = command;
                    //  打开数据库连接对象。
                    command.Connection = connection;
                    OpenConnection();
                    //  创建数据集。
                    DataSet dataSet = new DataSet();
                    //  填充数据集。
                    adapter.Fill(dataSet);
                    //  返回数据集。
                    return dataSet;
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行Sql语句,返回DataSet数据集。
        /// </summary>
        /// <param name="commandTexts">要执行的Sql语句集合。</param>
        /// <param name="tableNames">DataSet数据集中Table的名称集合。</param>
        /// <exception cref="ArgumentNullException、SqlException、InvalidOperationException"></exception>
        /// <returns>DataSet数据集。</returns>
        public DataSet ExecuteDataSet(IList<string> commandTexts, IList<string> tableNames)
        {
            try
            {
                if (commandTexts.Count <= 0)
                { throw new ArgumentNullException("要执行的Sql语句不能为空。"); }
                if (commandTexts.Count != tableNames.Count)
                { throw new ArgumentException("tableNames集合中的名称的数量不够。"); }
                //  打开数据库连接。
                OpenConnection();
                //  创建数据集。
                DataSet dataSet = new DataSet();
                for (int i = 0; i < commandTexts.Count; i++)
                {
                    //  创建数据库命令对象。
                    using (DbCommand command = new SqlCommand(commandTexts[i]))
                    {
                        command.Connection = connection;
                        //  创建数据库适配器。
                        using (DbDataAdapter adapter = new SqlDataAdapter())
                        {
                            //  创建数据表。
                            DataTable dataTable = new DataTable();
                            //  设置数据表的名称。
                            dataTable.TableName = tableNames[i];
                            //  填充数据表。
                            adapter.SelectCommand = command;
                            adapter.Fill(dataTable);
                            //  将数据表添加到数据集。
                            dataSet.Tables.Add(dataTable);
                            //  释放数据适配器。
                            adapter.Dispose();
                        }
                    }
                }
                return dataSet;
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行Sql语句,返回DataSet数据集。
        /// </summary>
        /// <param name="commandTexts">要执行的DbCommand接口集合。</param>
        /// <param name="tableNames">DataSet数据集中Table的名称集合。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>DataSet数据集。</returns>
        public DataSet ExecuteDataSet(IList<DbCommand> commands, IList<string> tableNames)
        {
            try
            {
                if (commands.Count != tableNames.Count)
                { throw new ArgumentException("tableNames集合中的名称的数量不够。"); }
                //  打开数据库连接。
                OpenConnection();
                //  创建数据集。
                DataSet dataSet = new DataSet();
                for (int i = 0; i < commands.Count; i++)
                {
                    commands[i].Connection = connection;
                    //  创建数据库适配器。
                    using (DbDataAdapter adapter = new SqlDataAdapter())
                    {
                        //  创建数据表。
                        DataTable dataTable = new DataTable();
                        //  设置数据表的名称。
                        dataTable.TableName = tableNames[i];
                        //  填充数据表。
                        adapter.SelectCommand = commands[i];
                        adapter.Fill(dataTable);
                        //  将数据表添加到数据集。
                        dataSet.Tables.Add(dataTable);
                        //  释放数据适配器。
                        adapter.Dispose();
                    }
                    commands[i].Dispose();
                }
                return dataSet;
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行存储过程,返回DataSet数据集。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>DataSet数据集。</returns>
        public DataSet ExecuteDataSetByStoredProcedure(string storedProcedureName)
        {
            if (string.IsNullOrWhiteSpace(storedProcedureName))
            { throw new ArgumentNullException("要执行的存储过程名称不能为空。"); }
            try
            {
                //  打开数据库连接对象。
                OpenConnection();
                //  创建数据库命令对象。
                using (DbCommand command = new SqlCommand())
                {
                    command.Connection = connection;
                    command.CommandText = storedProcedureName;
                    command.CommandType = CommandType.StoredProcedure;
                    using (DbDataAdapter adapter = new SqlDataAdapter())
                    {
                        //  创建数据集。
                        DataSet dataSet = new DataSet();
                        //  填充数据集。
                        adapter.SelectCommand = command;
                        adapter.Fill(dataSet);
                        //  释放数据适配器。
                        adapter.Dispose();
                        //  释放数据库命令对象。
                        command.Dispose();
                        //  返回数据集。
                        return dataSet;
                    }
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行存储过程,返回DataSet数据集。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <param name="parameters">存储过程的参数。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>DataSet数据集。</returns>
        public DataSet ExecuteDataSetByStoredProcedure(string storedProcedureName, params DbParameter[] parameters)
        {
            if (string.IsNullOrWhiteSpace(storedProcedureName))
            { throw new ArgumentNullException("要执行的存储过程名称不能为空。"); }
            try
            {
                //  打开数据库连接对象。
                OpenConnection();
                //  创建数据库命令对象。
                using (DbCommand command = new SqlCommand())
                {
                    command.Connection = connection;
                    command.CommandText = storedProcedureName;
                    command.CommandType = CommandType.StoredProcedure;
                    foreach (SqlParameter parameter in parameters)
                    {
                        command.Parameters.Add(parameter);
                    }
                    using (DbDataAdapter adapter = new SqlDataAdapter())
                    {
                        //  创建数据集。
                        DataSet dataSet = new DataSet();
                        //  填充数据集。
                        adapter.SelectCommand = command;
                        adapter.Fill(dataSet);
                        //  释放数据适配器。
                        adapter.Dispose();
                        //  释放数据库命令对象。
                        command.Dispose();
                        //  返回数据集。
                        return dataSet;
                    }
                }
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
            finally { this.CloseConnection(); }
        }

        /// <summary>
        /// 执行Sql语句,返回XmlDocument对象。
        /// </summary>
        /// <param name="commandText">要执行的Sql语句。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>XmlDocument对象。</returns>
        public XmlDocument ExecuteDataXml(string commandText)
        {
            if (string.IsNullOrWhiteSpace(commandText))
            { throw new ArgumentNullException("要执行的Sql语句不能为空。"); }
            try
            {
                //  格式化DataSet对象。
                DataSet ds = this.ExecuteDataSet(commandText);
                //  返回XmlDocument对象。
                return ConvertDataSetToXmlDocument(ds);
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
        }

        /// <summary>
        /// 执行Sql操作,返回XmlDocument对象。
        /// </summary>
        /// <param name="command">要执行的数据库命令对象。</param>
        /// <exception cref="SqlException、InvalidOperationException"></exception>
        /// <returns>XmlDocument对象。</returns>
        public XmlDocument ExecuteDataXml(DbCommand command)
        {
            try
            {
                //  格式化DataSet对象。
                DataSet ds = this.ExecuteDataSet(command);
                //  返回XmlDocument对象。
                return ConvertDataSetToXmlDocument(ds);
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
        }

        /// <summary>
        /// 执行Sql操作,返回XmlDocument对象。
        /// </summary>
        /// <param name="commandTexts">要执行的Sql语句集合。</param>
        /// <param name="tableNames">XmlDocument对象中Element属性的名称集合。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>XmlDocument对象。</returns>
        public XmlDocument ExecuteDataXml(IList<string> commandTexts, IList<string> tableNames)
        {
            if (commandTexts.Count <= 0)
            { throw new ArgumentNullException("要执行的Sql语句不能为空。"); }
            if (commandTexts.Count != tableNames.Count)
            { throw new ArgumentException("tableNames集合中的名称的数量不够。"); }
            try
            {
                //  格式化DataSet对象。
                DataSet ds = this.ExecuteDataSet(commandTexts, tableNames);
                //  返回XmlDocument对象。
                return ConvertDataSetToXmlDocument(ds);
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
        }

        /// <summary>
        /// 执行存储过程,返回XmlDocument对象。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>XmlDocument对象。</returns>
        public XmlDocument ExecuteDataXmlByStoredProcedure(string storedProcedureName)
        {
            if (string.IsNullOrWhiteSpace(storedProcedureName))
            { throw new ArgumentNullException("要执行的存储过程名称不能为空。"); }
            try
            {
                //  格式化DataSet对象。
                DataSet ds = this.ExecuteDataSetByStoredProcedure(storedProcedureName);
                //  返回XmlDocument对象。
                return ConvertDataSetToXmlDocument(ds);
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
        }

        /// <summary>
        /// 执行存储过程,返回XmlDocument对象。
        /// </summary>
        /// <param name="storedProcedureName">要执行的存储过程名称。</param>
        /// <param name="parameters">存储过程的参数。</param>
        /// <exception cref="ArgumentException、SqlException、InvalidOperationException"></exception>
        /// <returns>XmlDocument对象。</returns>
        public XmlDocument ExecuteDataXmlByStoredProcedure(string storedProcedureName, params DbParameter[] parameters)
        {
            if (string.IsNullOrWhiteSpace(storedProcedureName))
            { throw new ArgumentNullException("要执行的存储过程名称不能为空。"); }
            try
            {
                //  格式化DataSet对象。
                DataSet ds = this.ExecuteDataSetByStoredProcedure(storedProcedureName, parameters);
                //  返回XmlDocument对象。
                return ConvertDataSetToXmlDocument(ds);
            }
            catch (SqlException sqlEx) { throw sqlEx; }
            catch (InvalidOperationException ivoEx) { throw ivoEx; }
        }
    }
}

在经过一段时间学习,会把反射加入到工厂,数据访问类中加入DataSetToJson。

先做个记录。

时间: 2024-11-03 22:41:24

C#连接层的数据访问类(简单版)的相关文章

【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类,类名与表名一致.表中的每一列,都为该类下的成员变量和属性也就是最简单的封装 把数据库中的表名变为类的类名. 把数据库中的每一个列,变为实体类中的成员变量和属性 列名与属性名一致.成员变量名:在列名前边加上下划线.因为在外部访问只能访问到属性,为了看起来一致. using System; using

ADO.NET(完整修改和查询、实体类,数据访问类)

一.完整修改和查询 在编写c#语句时需考虑到用户体验,例如在编写修改语句时,需要考虑到输入的内容在数据库中是否能够找到. 中间变量运用. 1.先查 2.执行操作 完整修改语句: bool has = false; Console.Write("请输入要修改的用户名:"); string Uname = Console.ReadLine(); //到数据库中查询输入的用户名是否存在 SqlConnection conn = new SqlConnection("server=.

实体类,数据访问类.字符串攻击.防攻击

程序分三层:界面层.业务逻辑层.数据访问层 这里主要操作的是数据访问层,数据访问层又分为: 1.实体类 2.数据访问类 存放位置:APP_Code文件中 一.实体类 最简单的封装把数据库的表名变成类的类名把数据库的每一个列,变为实体类中的成员变量和属性列名与属性名一致 有几行就有几个实体类 这是一个简单的实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namesp

2017-4-20实体类,数据访问类.字符串攻击.防攻击

程序分三层:界面层.业务逻辑层.数据访问层 这里主要操作的是数据访问层,数据访问层又分为: 1.实体类 2.数据访问类 存放位置:APP_Code文件中 一.实体类 最简单的封装把数据库的表名变成类的类名把数据库的每一个列,变为实体类中的成员变量和属性列名与属性名一致 有几行就有几个实体类 这是一个简单的实体类:  实体类 二.数据访问类 将某个表的数据库操作写成一个一个方法,放入到此类中供外部调用 这是一个数据访问类:  数据访问类 三.字符串攻击,防攻击 字符串攻击: 主要利用获取需用户输入

ADO.NET 【实体类】【数据访问类】

认识分层结构,分层式结构是最常见,也是最重要的一种结构. 三层架构(3-tier architecture) 界面层(User Interface layer) 主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问. 业务逻辑层(Business Logic Layer)主要是针对具体的问题的操作,也可以理解成对数据层的操作 数据访问层(Data access layer)主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操作层 数据访问层包括   实体类 数据访问类 优点

2017-4-21 字符串攻击 防御 实体类 数据访问类 属性扩展 三层架构开发

(一)防止sql数据库字符串注入攻击: 1.字符串注入攻击实在填写内容是,插入的sql语句,对数据库进行的操作 数据库的攻击就是插入新的sql语句,并对后面的语句进行注销:');update Students set Sname='';-- 2.防止字符串注入攻击: cmd.CommandText = "update Student set Sname = @a",   ----  用占位符进行占位,这样在攻击的时候就会吧攻击的内容当成sql语句内容直接插入到数据库 cmd.Param

数据访问类的封装与三大类

数据访问类的封装: 数据访问类分为三大类:连接类,实体类,数据访问类. 1.连接类: public class lianjie { private static string connection="server=.;database=mydb;uid=sa;pwd=789234178"; public static Sqlconnection conn { get { SqlConnection conn=new Sqlconnection(connecction); return

实体类、数据访问类、属性扩展

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 实体类_数据访问类.App_Code { public class Users { private string _username; //封装 /// <summary> /// 用户名 /// </summary> public

字符串攻击、防攻击、实体类、数据访问类

字符串攻击: 主要利用获取需用户输入的字符串时,通过输入精心编制的含有某种指令的字符串,从而对数据库进行攻击性操作. 防攻击: 例 cmd.CommandText = "update Users set [email protected],[email protected],[email protected],[email protected],[email protected],[email protected] where [email protected]"; cmd.Param