2014-04-10 56 views
2

一個包含執行查詢,執行存儲過程,執行標量查詢的方法的類,基本上是Oracle和Microsoft數據庫的所有數據庫操作。目前我有一個類每個操作有不同的方法,但有很多重複代碼。如何以適當的面向對象的方式進行設計?如何設計一個面向對象的C#類的所有數據庫操作,如執行查詢,執行SP,執行標量查詢等?

這裏是我目前:我有一個像執行關於執行標返回一個字符串類似的方法,執行標返回一個int等

public class DBoperations 
{ 
    private string querystringval; 
    private string logfileloc; 
    private string connectionstringval; 
    LogToFile logobj = new LogToFile(); 
    SqlConnection SqlConn = new SqlConnection(); 
    public string logfilelocval 
    { 
     get { return logfileloc; } 
     set { logfileloc = value; } 
    } 
    public string queryValue 
    { 
     get { return querystringval; } 
     set { querystringval = value; } 
    } 
    public string connectionvalue 
    { 
     get { return connectionstringval; } 
     set { connectionstringval = value; } 
    } 

    public Boolean connecttodb() 
    { 
     logobj.fileName = logfilelocval; 
     //SqlConnection SqlConn = new SqlConnection(connectionvalue); 
     SqlConn.ConnectionString = connectionvalue; 
     try 
     { 
      SqlConn.Open(); 
      logobj.MyLogFile("**SUCCESS** ", "Database connection opened"); 
      return true; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
      logobj.MyLogFile("**FAILURE**", "Database Connection Failed" + e.Message); 
      return false; 
      throw new IndexOutOfRangeException(); 
     } 
    } 
    public string executeaquery() 
    { 
     try 
     { 
      SqlCommand querystring = new SqlCommand(queryValue, SqlConn); 
      querystring.CommandTimeout = 90; 
      querystring.ExecuteNonQuery(); 
      logobj.MyLogFile("**SUCCESS** ", "Query Executed Successfully."); 
      querystring.Dispose(); 
      return "True"; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
      logobj.MyLogFile("**FAILURE**", "Query did not execute." + e.Message); 
      return e.Message; 
      throw new IndexOutOfRangeException(); 
     } 
    } 
}} 
+1

你知道還是/ m?搜索。我相信你可以用EntityFramework [例子](http://msdn.microsoft.com/en-us/data/jj206878.aspx)搜索DTO來解決你的疑問。如果您至少提供了迄今爲止嘗試過的內容,那麼 –

+0

會更容易引導您。 – Thewads

+0

這幾乎肯定會關閉。您需要包含一些代碼示例並提出更具體的問題。 –

回答

4

所以看起來你只是想將實現抽象出來,以便可以連接到不同的數據庫引擎。這可以使用Dapper之類的東西做得更好,因爲它只是擴展了IDbConnection接口。這意味着可以使用任何具有實現IDbConnection連接對象的數據庫引擎;順便說一句,那就是所有這些。 :d

好了,所以有小巧玲瓏的你可能會做這樣的事情:

using (SqlConnection c = new SqlConnection(connString)) 
{ 
    var customer = c.Query<Customer>(
     "SELECT FirstName, LastName, DateOfBirth FROM Customer WHERE CustomerID = @CustomerID", 
     new { CustomerID = 1 }); 
} 

這將得到Customer。現在,抽象這是更容易。現在,我們只是建立一個處理QueryExecute,這兩種方法你要與小巧玲瓏的使用接口:

public interface IMyConnection 
{ 
    TModel Query<TModel>(string sql, object parms); 

    int Execute(string sql, object parms); 
} 

現在我們有一個接口,我們可以建立像這樣的接口的不同版本的混凝土:

public class MsSqlMyConnection : IMyConnection 
{ 
    public TModel Query<TModel>(string sql, object parms) 
    { 
     using (SqlConnection c = new SqlConnection(connString)) 
     { 
      return c.Query<TModel>(sql, parms); 
     } 
    } 

    public int Execute(string sql, object parms) 
    { 
     using (SqlConnection c = new SqlConnection(connString)) 
     { 
      return c.Execute(sql, parms); 
     } 
    } 
} 

好了,現在我們有一個具體的,但可能使用IDbConnection任何類型的,像OracleConnection。現在,我們有,而不是建立一個連接,我們建立我們的一個連接:

var c = new MsSqlMyConnection(); 
var customer = c.Query<Customer>(
    "SELECT FirstName, LastName, DateOfBirth FROM Customer WHERE CustomerID = @CustomerID", 
    new { CustomerID = 1 }); 

有一些小巧玲瓏的建立,可以在同一時間返回類型的集合,甚至多種類型的許多其他方法。你只需要擴展你的界面來支持你的需求,就是這樣。然後可以使用依賴注入容器在執行期間實例化正確的具體類。研究像StructureMap或Unity這樣的容器的使用。

的DI容器將取代這一行:

var c = new MsSqlMyConnection(); 

,因爲它會去得到基於配置正確的混凝土。

+0

謝謝@Michael Perrenoud。我將在Dapper和IDBConnection接口上做一些閱讀,因爲它對我而言並不熟悉,在實現之前需要花一些時間。 – JayJ