這兩層實際上就是大多數實體框架所處的層次,在這兩個層次方面,大家可以參考動軟的方式,當然,也可以自己構建,也可以利用現有的成熟的實體框架。但對于大型項目或者產品型項目,最好還是不要使用那些復雜的實體框架,因為更新,維護,升級都不太可控,而且很多時候都會有一些限制,不太利于構建高效動態的業務應用(再怎么強大,還是沒有直接用SQL語句與數據庫打交道強大,而且使用框架時,如果利用了緩存,那么存儲過程使用,其它SQL語句的使用,數據的同步都是個大問題)
下面的代碼是這兩層的一個示例:
1)數據庫訪問層:
~~~
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
namespace DBHelper
{
?? public class DbHelper
?? {
?????? /// <summary>
?????? /// 執行查詢語句,返回DataSet
?????? /// </summary>
?????? /// <param name="SQLString">查詢語句</param>
?????? /// <returns>DataSet</returns>
?????? public DataSet QueryData(string SQLString, DbConnection conn, DbTransaction Trans)
?????? {
?????????? SqlConnection connection = conn as SqlConnection;
?????????? connection.Open();
?????????? try
?????????? {
?????????????? DataSet ds = new DataSet();
?????????????? SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
?????????????? command.Fill(ds, "ds");
?????????????? command.Dispose();
?????????????? return ds;
?????????? }
?????????? catch
?????????? {
?????????????? return null;
?????????? }
?????? }
?? }
}
~~~
如果需要支持多種數據庫,只要在這里建立一個抽象層,然后根據用戶的數據庫類型動態的決定采用相應的數據庫訪問層實例即可。
2)數據訪問層:
~~~
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using DBHelper;
using System.Data.Common;
namespace HDatabase
{
?? public class DynamicDataAccess
?? {
?????? public DataTable GetDataTable(string strSQL, DbConnection Conn)
?????? {
?????????? DataSet theDS = new DbHelper().QueryData(strSQL, Conn, null);
?????????? if (theDS != null && theDS.Tables.Count > 0)
?????????? {
?????????????? return theDS.Tables[0];
?????????? }
?????????? return null;
?????? }
?? }
}
~~~
這里可以增加簡單的數據訪問方法,比如新增,修改,刪除等。如果要處理事務的話,在參數中增加一個數據庫事務參數,有業務邏輯去決定事務,而不要在底層做。另外要注意的是如果業務邏輯層調用數據訪問層方法沒有提供數據庫連接或者事務的時候,應采用默認的配置創建數據庫連接,并不做事務處理。因為畢竟一個系統絕大部分的應用都不會需要時時變更數據庫連接。記住:我們之所以在數據訪問方法中提供連接與事務參數的目的是為業務邏輯層提供一種可以自行采用的數據連接和事務的手段。