程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 數據庫連接工廠

數據庫連接工廠

編輯:.NET實例教程

也許很多人都有和我一樣的經驗,客戶的數據庫管理系統可能暫時沒有定下來,或者是 受服務器的限制,在項目快進行完時需要更換DBMS。由於我們的系統中大量的存在數據庫連接,如果類設計不恰當的話,造成數據庫連接和其他邏輯的緊耦合,在更改DBMS時就會有很大的麻煩。我們幾乎要搜索遍程序的每一個角落。

設計模式裡有一種很好的解決方案:把數據庫連接做成一個抽象工廠(IDbFactory),每種具體的數據庫接口就是具體實現工廠(SqlFactory,OdbcFactory,OleDbFactory),程序中所有的數據庫連接都由這個工廠來生產(IDbFactory.GetCon())。我們只要在數據庫操作類(DbOperater)控制抽象工廠的實例(IDbFactory factory = new SqlFactoy/OdbcFactory/OleDbFactory),只修改一處代碼,就可以自由地給系統更換DBMS了。

抽象工廠 IDbFactory.cs



using System.Data;

interface IDBFactory ...{
    IDBConnetction GetCon();
    IDBCommand GetCmd();
    IDataAdapter GetAdapter(IDBCommand cmd);
    string GetDateTimeStr(string datetime);
}

注:由於不同的DBMS中關於時間的處理SQL語法不同,所以要有一個方法:
string GetDateTimeStr(string datetime);

數據庫操作類



using System.Data;
using System.Configuration;

public class DBOperator ...{
    private IDBFactory _factory;
    private IDbConnection _con;
    
    public DBOperator() ...{
        this._factory = new SqlFactory();
        this._con = _factory.GetCon();
        _con.ConnectionString = ConfigurationManager.ConnectionStrings["sqlCon"].ConnectionString;
    }
    
    public void Open() ...{
        _con.Open();
    }
    public void Close() ...{
        _con.Close();
    }
    public IDbConnection GetCon()
    ...{
        return _con;
    }
    public DataSet ExecSql(string sqlStr) ...{
        IDbCommand cmd = _factory.GetCmd();
        cmd.Connection = this._con;
        cmd.CommandText = sqlStr;
        IDataAdapter adapter = _factory.GetAdapter(cmd);
        DataSet ds = new DataSet();
        adapter.Fill(ds);
        return ds;
    }
    
    public DataSet ExecSql(string sqlStr1, string datetime, string sqlStr2) ...{
        IDbCommand cmd = _factory.GetCmd();
        cmd.Connection = this._con;
        cmd.CommandText = sqlStr1+_factory.GetDateTimeStr(datetime)+sqlStr2;
        IDataAdapter adapter = _factory.GetAdapter(cmd);
        DataSet ds = new DataSet();
        adapter.Fill(ds);
        return ds;
    }
    public DataSet ExecSql(string sqlStr1,string sqlStr2, params string[] datatime)
    ...{
        IDbCommand cmd = _factory.GetCmd();
        cmd.Connection = this._con;
        string dtfIEld = "";
        for (int i = 0; i < datatime.Length; i++)
        ...{
            dtfIEld += "," + _factory.GetDateTimeStr(datatime[i]);
        }
        dtfield = dtfIEld.Substring(1);
        cmd.CommandText = sqlStr1 + dtfIEld + sqlStr        IDataAdapter adapter = _factory.GetAdapter(cmd);
        DataSet ds = new DataSet();
        adapter.Fill(ds);
        return ds;
    }
}

 SQL Server 連接 工廠



using System.Data;
using System.Data.SqlClIEnt;

public class SqlFactory : IDBFactory ...{
    public IDBConnection GetCon() ...{
        return new SqlConnection();
    }
    public IDBCommand GetCmd() ...{
        return new SqlCommand();
    }
    public IDataAdapter GetAdapter() ...{
        return new SqlAdapter();
    }
public string GetDateTimeStr(string datetime) ...{
        return "''"+datetime+"''"
    }
}

Access 連接工廠



using System.Data;
using System.Data.OleDb;

public class OleDbFactory : IDBFactory ...{
    
    public IDBConnection GetCon() ...{
        return new OleDbConnection();
    }
    
    public IDBCommand() GetCmd() ...{
        return new OleDbCommand();
    }
    
   &nbsp;public IDataAdapter(IDBCommand cmd) ...{
        return new OleDbDataApdaper(cmd);
    }
    
    public string GetDateTimeStr(string datetime) ...{
        return "#"+datetime+"#"
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved