C#中數據庫的訪問(工廠模式)(UserLib.Database)

 
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 已經提供了訪問數據庫的工廠模式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章