C#中数据库的访问(工厂模式)(UserLib.Database)

来源:互联网 发布:t mac 太极 编辑:程序博客网 时间:2024/05/21 08:55
 
1. 首先我们先来定义数据库的类型
 
using System;
 
namespace UserLib.Database
{
     ///<summary>
     ///数据库类型
     ///</summary>
     public enum DatabaseType
     {
         OleDb,             //OleDb 数据库
         SqlServer,         //SqlServer 数据库
        Odbc,              //Odbc 数据库
     }
}
 
2. 接着我们定义一个数据库访问的接口,提供通用的访问方法
 
using System;
using System.Data;
using System.Data.Common;
 
namespace UserLib.Database
{
    ///<summary>
    ///数据库通用接口
    ///</summary>
    public interface IDatabase
    {
        ///<summary>
        ///打开数据库
        ///</summary>
        ///<param name="connString">连接字符串</param>
        void Open(string connString);
 
        ///<summary>
        ///关闭数据库
        ///</summary>
        void Close();
 
        ///<summary>
        ///数据集
        ///</summary>
        DataSet DataSetDB { get;}
 
        ///<summary>
        ///数据连接
        ///</summary>
        DbConnection ConnectionDB { get;}
 
        ///<summary>
        ///获取数据库类型
        ///</summary>
        ///<returns>数据库类型</returns>
        DatabaseType GetDatabaseType();
 
        ///<summary>
        ///执行SQL语句
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<returns>影响行数</returns>
        int ExecuteSQL(string sql);
 
        ///<summary>
        ///执行SQL语句
        ///</summary>
        ///<param name="cmd">数据命令</param>
        ///<returns>影响行数</returns>
        int ExecuteSQL(DbCommand cmd);
 
        ///<summary>
        ///执行SQL语句
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<returns>第一行第一列值</returns>
        object ExecuteSQLReturn(string sql);
 
        ///<summary>
        ///执行SQL语句
        ///</summary>
        ///<param name="cmd">数据命令</param>
        ///<returns>第一行第一列值</returns>
        object ExecuteSQLReturn(DbCommand cmd);
 
        ///<summary>
        ///返回DataReader对象
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<returns>DataReader对象</returns>
        DbDataReader ReturnDataReader(string sql);
 
        ///<summary>
        ///返回DataReader对象
        ///</summary>
        ///<param name="cmd">查询命令</param>
        ///<returns>DataReader对象</returns>
        DbDataReader ReturnDataReader(DbCommand cmd);
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<param name="tbName">表名称</param>
        ///<returns>数据集</returns>
        DataSet AddTable(string sql, string tbName);
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="cmdSelect">查询命令</param>
        ///<param name="tbName">表名称</param>
        ///<returns>数据集</returns>
        DataSet AddTable(DbCommand cmdSelect, string tbName);
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<param name="tbName">表名称</param>
        ///<param name="da">导出数据适配器</param>
        ///<returns>数据集</returns>
        DataSet AddTable(string sql, string tbName, out DbDataAdapter da);
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="cmdSelect">查询命令</param>
        ///<param name="tbName">表名称</param>
        ///<param name="da">导出数据适配器</param>
        ///<returns>数据集</returns>
        DataSet AddTable(DbCommand cmdSelect, string tbName, out DbDataAdapter da);
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="da">数据适配器</param>
        ///<param name="tbName">表名称</param>
        ///<returns>数据集</returns>
        DataSet AddTable(DbDataAdapter da, string tbName);
 
        ///<summary>
        ///移除表
        ///</summary>
        ///<param name="tbName">表名称</param>
        void RemoveTable(string tbName);
 
        ///<summary>
        ///移除表
        ///</summary>
        ///<param name="index">表的索引</param>
        void RemoveTable(int index);
 
        ///<summary>
        ///在数据集中加入关系
        ///</summary>
        ///<param name="name">关系名称</param>
        ///<param name="prnTable">主表名称</param>
        ///<param name="prnCol">主表中的列</param>
        ///<param name="chdTable">子表名称</param>
        ///<param name="chdCol">子表中的列</param>
        ///<returns>数据集</returns>
        DataSet AddRelation(string name, string prnTable, string prnCol, string chdTable, string chdCol);
 
        ///<summary>
        ///在数据集中加入关系
        ///</summary>
        ///<param name="name">关系名称</param>
        ///<param name="prnTable">主表名称</param>
        ///<param name="prnCol">主表中的列</param>
        ///<param name="chdTable">子表名称</param>
        ///<param name="chdCol">子表中的列</param>
        ///<param name="dr">导出关系</param>
        ///<returns>数据集</returns>
        DataSet AddRelation(string name, string prnTable, string prnCol, string chdTable, string chdCol, out DataRelation dr);
 
        ///<summary>
        ///在数据集中加入关系
        ///</summary>
        ///<param name="dr">关系</param>
        ///<returns>数据集</returns>
        DataSet AddRelation(DataRelation dr);
 
        ///<summary>
        ///移除关系
        ///</summary>
        ///<param name="relationName">关系名称</param>
        void RemoveRelation(string relationName);
 
        ///<summary>
        ///移除关系
        ///</summary>
        ///<param name="index">关系索引</param>
       void RemoveRelation(int index);
 
    }
}
 
3. 接着我们实现IDatabase接口, 提供一个具体的数据库访问类
   例: (Sql Server)
 
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
 
namespace UserLib.Database
{
    ///<summary>
    /// SqlServer数据库的连接与处理
    ///</summary>
    public class SqlServer : IDatabase
    {
        private SqlConnection connDB;             //Connection(连接) 对象
        private DataSet dsDB = new DataSet();     //DataSet(数据集) 对象
 
        ///<summary>
        ///构造函数
        ///</summary>
        public SqlServer() { }
 
        ///<summary>
        ///构造函数
        ///</summary>
        ///<param name="connString">连接字符串</param>
        public SqlServer(string connString)
        {
            Open(connString);
        }
 
        ///<summary>
        ///打开数据库
        ///</summary>
        ///<param name="connString">连接字符串</param>
        public void Open(string connString)
        {
            connDB = new SqlConnection(connString);
            connDB.Open();
        }
 
        ///<summary>
        ///关闭数据库
        ///</summary>
        public void Close()
        {
            connDB.Close();
        }
 
        ///<summary>
        ///数据库连接
        ///</summary>
        public DbConnection ConnectionDB
        {
            get
            {
                return connDB;
            }
        }
 
        ///<summary>
        ///数据集
        ///</summary>
        public DataSet DataSetDB
        {
            get
            {
                return dsDB;
            }
        }
 
        ///<summary>
        ///获取数据库类型
        ///</summary>
        ///<returns>数据库类型</returns>
        public DatabaseType GetDatabaseType()
        {
            return DatabaseType.SqlServer;
        }
 
        ///<summary>
        ///执行SQL语句
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<returns>影响行数</returns>
        public int ExecuteSQL(string sql)
        {
            SqlCommand cmdDB = connDB.CreateCommand();
            cmdDB.CommandText = sql;
            int n = cmdDB.ExecuteNonQuery();
            return n;
        }
 
        ///<summary>
        ///执行SQL语句
        ///</summary>
        ///<param name="cmd">数据命令</param>
        ///<returns>影响行数</returns>
        public int ExecuteSQL(DbCommand cmd)
        {
            SqlCommand cmdDB = new SqlCommand();
            cmdDB = (SqlCommand)cmd;
            int n = cmdDB.ExecuteNonQuery();
            return n;
        }
 
        ///<summary>
        ///执行SQL语句
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<returns>第一行第一列值</returns>
        public object ExecuteSQLReturn(string sql)
        {
            SqlCommand cmdDB = connDB.CreateCommand();
            cmdDB.CommandText = sql;
            object obj = cmdDB.ExecuteScalar();
            return obj;
        }
 
        ///<summary>
        ///执行SQL语句
        ///</summary>
        ///<param name="cmd">数据命令</param>
        ///<returns>第一行第一列值</returns>
        public object ExecuteSQLReturn(DbCommand cmd)
        {
            SqlCommand cmdDB = new SqlCommand();
            cmdDB = (SqlCommand)cmd;
            object obj = cmdDB.ExecuteScalar();
            return obj;
        }
 
        ///<summary>
        ///返回DataReader对象
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<returns>DataReader对象</returns>
        public DbDataReader ReturnDataReader(string sql)
        {
            SqlCommand cmdDB = connDB.CreateCommand();
            cmdDB.CommandText = sql;
            return cmdDB.ExecuteReader();
        }
 
        ///<summary>
        ///返回DataReader对象
        ///</summary>
        ///<param name="cmd">查询命令</param>
        ///<returns>DataReader对象</returns>
        public DbDataReader ReturnDataReader(DbCommand cmd)
        {
            SqlCommand cmdDB = new SqlCommand();
            cmdDB = (SqlCommand)cmd;
            return cmdDB.ExecuteReader();
        }
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<param name="tbName">表名称</param>
        ///<returns>数据集</returns>
        public DataSet AddTable(string sql, string tbName)
        {
            SqlDataAdapter daTable = new SqlDataAdapter(sql, connDB);
            //根据Select命令生成Insert Delete Update命令
            SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
            daTable.InsertCommand = cmdBuilder.GetInsertCommand();
            daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
            daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
            //把数据库中的键包含进来
            daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            daTable.Fill(dsDB, tbName);
            return dsDB;
        }
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="cmdSelect">查询命令</param>
        ///<param name="tbName">表名称</param>
        ///<returns>数据集</returns>
        public DataSet AddTable(DbCommand cmdSelect, string tbName)
        {
            SqlDataAdapter daTable = new SqlDataAdapter((SqlCommand)cmdSelect);
            //根据Select命令生成Insert Delete Update命令
            SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
            daTable.InsertCommand = cmdBuilder.GetInsertCommand();
            daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
            daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
            //把数据库中的键包含进来
            daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
           daTable.Fill(dsDB, tbName);
            return dsDB;
        }
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="sql">SQL语句</param>
        ///<param name="tbName">表名称</param>
        ///<param name="da">导出数据适配器</param>
        ///<returns>数据集</returns>
        public DataSet AddTable(string sql, string tbName, out DbDataAdapter da)
        {
            SqlDataAdapter daTable = new SqlDataAdapter(sql, connDB);
            //根据Select命令生成Insert Delete Update命令
            SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
            daTable.InsertCommand = cmdBuilder.GetInsertCommand();
            daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
            daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
            //把数据库中的键包含进来
            daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            da = daTable;
            daTable.Fill(dsDB, tbName);
            return dsDB;
        }
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="cmdSelect">查询命令</param>
        ///<param name="tbName">表名称</param>
        ///<param name="da">导出数据适配器</param>
        ///<returns>数据集</returns>
        public DataSet AddTable(DbCommand cmdSelect, string tbName, out DbDataAdapter da)
        {
            SqlDataAdapter daTable = new SqlDataAdapter((SqlCommand)cmdSelect);
            //根据Select命令生成Insert Delete Update命令
            SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
            daTable.InsertCommand = cmdBuilder.GetInsertCommand();
            daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
            daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
            //把数据库中的键包含进来
            daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            da = daTable;
            daTable.Fill(dsDB, tbName);
            return dsDB;
        }
 
        ///<summary>
        ///在数据集中加入有SQL语句生成的表
        ///</summary>
        ///<param name="da">数据适配器</param>
        ///<param name="tbName">表名称</param>
        ///<returns>数据集</returns>
        public DataSet AddTable(DbDataAdapter da, string tbName)
        {
            SqlDataAdapter daTable = new SqlDataAdapter();
            daTable = (SqlDataAdapter)da;
            //根据Select命令生成Insert Delete Update命令
            SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(daTable);
            daTable.InsertCommand = cmdBuilder.GetInsertCommand();
            daTable.DeleteCommand = cmdBuilder.GetDeleteCommand();
            daTable.UpdateCommand = cmdBuilder.GetUpdateCommand();
            //把数据库中的键包含进来
            daTable.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            daTable.Fill(dsDB, tbName);
            return dsDB;
        }
 
        ///<summary>
        ///移除表
        ///</summary>
        ///<param name="tbName">表名称</param>
        public void RemoveTable(string tbName)
        {
            dsDB.Tables.Remove(tbName);
        }
 
        ///<summary>
        ///移除表
        ///</summary>
        ///<param name="index">表的索引</param>
        public void RemoveTable(int index)
        {
            dsDB.Tables.RemoveAt(index);
        }
 
        ///<summary>
        ///在数据集中加入关系
        ///</summary>
        ///<param name="name">关系名称</param>
        ///<param name="prnTable">主表名称</param>
        ///<param name="prnCol">主表中的列</param>
        ///<param name="chdTable">子表名称</param>
        ///<param name="chdCol">子表中的列</param>
        ///<returns>数据集</returns>
        public DataSet AddRelation(string name, string prnTable,string prnCol,string chdTable,string chdCol)
        {
            dsDB.Relations.Add(name, dsDB.Tables[prnTable].Columns[prnCol], dsDB.Tables[chdTable].Columns[chdCol]);
            return dsDB;
        }
 
        ///<summary>
        ///在数据集中加入关系
        ///</summary>
        ///<param name="name">关系名称</param>
        ///<param name="prnTable">主表名称</param>
        ///<param name="prnCol">主表中的列</param>
        ///<param name="chdTable">子表名称</param>
        ///<param name="chdCol">子表中的列</param>
        ///<param name="dr">导出关系</param>
        ///<returns>数据集</returns>
        public DataSet AddRelation(string name, string prnTable,string prnCol,string chdTable,string chdCol,out DataRelation dr)
        {
            DataRelation drTables = new DataRelation(name, dsDB.Tables[prnTable].Columns[prnCol], dsDB.Tables[chdTable].Columns[chdCol]);
            dr = drTables;
            dsDB.Relations.Add(drTables);
            return dsDB;
        }
 
        ///<summary>
        ///在数据集中加入关系
        ///</summary>
        ///<param name="dr">关系</param>
        ///<returns>数据集</returns>
        public DataSet AddRelation(DataRelation dr)
        {
            dsDB.Relations.Add(dr);
            return dsDB;
        }
 
        ///<summary>
        ///移除关系
        ///</summary>
        ///<param name="relationName">关系名称</param>
        public void RemoveRelation(string relationName)
        {
            dsDB.Relations.Remove(relationName);
        }
 
        ///<summary>
        ///移除关系
        ///</summary>
        ///<param name="index">关系索引</param>
        public void RemoveRelation(int index)
        {
            dsDB.Relations.RemoveAt(index);
        }
    }
}
 
4. 最后定义数据库工厂, 实现通用的数据库访问
 
using System;
using System.Data;
 
namespace UserLib.Database
{
     ///<summary>
     ///数据库工厂
     ///</summary>
     public class DBFactory
     {
        ///<summary>
        ///私有构造函数
        ///</summary>
        private DBFactory() { }
 
        ///<summary>
        ///将字符串转成DatabaseType枚举类型
        ///</summary>
        ///<param name="src">字符串</param>
        ///<returns>DatabaseType枚举类型</returns>
        private static DatabaseType ToDatabaseType(string src)
        {
            switch (src.ToLower())
            {
                case "oledb":
                    return DatabaseType.OleDb;
                case "sqlserver":
                    return DatabaseType.SqlServer;
                case "odbc":
                    return DatabaseType.Odbc;
                default:
                    throw new Exception("类型不存在");
            }
        }
 
         ///<summary>
         ///创建数据库类实例
         ///</summary>
         ///<param name="dbType">数据库类型</param>
         ///<returns>数据库类实例</returns>
         public static IDatabase Create(DatabaseType dbType)
         {
              switch(dbType)
              {
                   case DatabaseType.OleDb:
                       return new OleDb();
                   case DatabaseType.SqlServer:
                       return new SqlServer();
                case DatabaseType.Odbc:
                    return new Odbc();
                   default:
                       return null;
              }
         }
 
        ///<summary>
        ///创建数据库类实例
        ///</summary>
        ///<param name="dbType">数据库类型</param>
        ///<returns>数据库类实例</returns>
        public static IDatabase Create(string dbType)
        {
            return Create(ToDatabaseType(dbType));
        }
 
         ///<summary>
         ///创建数据库类实例
         ///</summary>
         ///<param name="dbType">>数据库类型</param>
         ///<param name="connString">数据库连接字符串</param>
         ///<returns>数据库类实例</returns>
         public static IDatabase Create(DatabaseType dbType,string connString)
         {
              switch(dbType)
              {
                   case DatabaseType.OleDb:
                       return new OleDb(connString);
                   case DatabaseType.SqlServer:
                       return new SqlServer(connString);
                case DatabaseType.Odbc:
                    return new Odbc(connString);
                   default:
                       return null;
              }
         }
 
        ///<summary>
        ///创建数据库类实例
        ///</summary>
        ///<param name="dbType">>数据库类型</param>
        ///<param name="connString">数据库连接字符串</param>
        ///<returns>数据库类实例</returns>
        public static IDatabase Create(string dbType, string connString)
        {
            return Create(ToDatabaseType(dbType), connString);
        }
 
     }
}
 
5. 用法
 
using System;
using UserLib.Database;
 
namespace Test
{
    ...
    string ConnStr="...";
    IDatabase db = DBFactory.Create(DatabaseType.SqlServer, ConnStr);
    ...
}
 
6. 备注
 
以上程序在.Net Framework 1.1 环境下编写
.Net 2.0 已经提供了访问数据库的工厂模式
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀疑家里人被传销组织骗去了怎么办 怀疑家人被骗进传销了该怎么办 b本扣3分了怎么办2018 抖音里面就剩人头的视频怎么办 自学参加普通高考那小高考怎么办 如果小学生长胸只长了一个该怎么办 脸上毛多导致的毛孔粗怎么办 吃了激素药头发掉的厉害怎么办 剪发的剪子中间的螺丝扣总掉怎么办 染完头发后一段时间长新头发怎么办 睡觉头发老被老公压着怎么办 漆盖关节不自在怎么办?吃什么好 摆床头的位置后面是弧形位怎么办 君子兰的根全烂掉了只剩茎怎么办 老板不发工资怎么办 没签合同的 牙套粘在牙齿上的松了怎么办 缝的线长在肉里怎么办 小孩喜欢用舌头顶牙齿缝怎么办 1岁多小宝贝全身长红点怎么办 生完胸好涨但很难把奶吸出来怎么办 怀孕快9个月内裤上有白带怎么办 一早起来发现内裤有白色液体怎么办 阴部骚痒白带多白带多小腹痛怎么办 15岁一周鲁了3次怎么办 月经摊迟三天内裤有白带怎么办 怀孕内裤上有黄黄的分泌物怎么办 老公出轨想离婚但舍不得孩子怎么办 老婆出轨离婚又舍不得家我该怎么办 怀孕一个月刚刚自慰有点流血怎么办 老公出轨还不知道悔改妻子怎么办 离婚了前妻户口还在再婚怎么办 怀孕六个月内裤老是湿有异味怎么办 怀孕五个月内裤总是湿有异味怎么办 耳朵里面有个洞老是流水冒浓怎么办 宝宝拉粑粑有臭酸味怎么回事怎么办 老婆晚上回家内裤是湿的尿味怎么办 怀孕五个月下身痒内裤湿怎么办 哺乳期奶水太多经常弄湿衣服怎么办 麻料裙子一坐下就皱怎么办 不小心把答题卡弄皱了怎么办 嘴巴又干又黏又臭怎么办