2012-12-04 87 views
1

我可以在下面解釋這個答案以及它如何與代理一起工作時獲得一些幫助。它從這裏的答案:C# abstraction and database layerC#抽象和數據庫層和代表

...如果你是卡在使用DataReader的想法,你可以傳遞一個委託給助手,這將會使用報表中調用:

public string GetMySpecId(string dataId) 
{ 
    return _dbHelper.ExecuteQuery(
     dr => 
      { 
       if(dr.Read()) 
       { 
        return dr[0].ToString(); 
       } 
       // do whatever makes sense here. 
      }, 
     @"select ""specId"" from ""MyTable"" where ""dataId"" = :dataId", 
     new SqlParameter("dataId", dataId)); 
    return result.Rows[0][0].ToString(); 
} 

您也可以使用像Dapper這樣的輕量級工具來簡化一些語法並處理映射到您的數據類型。 (你還是會需要處理打開連接和等。)

+0

哪一部分,你需要解釋呢? – EJC

+0

如果你看另一個問題的例子,你如何聲明ExecuteQuery以及爲什麼在這裏有2個return語句? – cdub

+0

只要2個return語句看起來像一個錯字,我認爲他的意思是把第一個返回的地方放在'var result'中。我會看看我能否真正快速地找到你如何使用委託的例子。 – EJC

回答

0

從上面的聲明方法ExecuteQuery應該是這個樣子:

public DataTable ExecuteQuery(Func<DataReader, DataTable> delegateMethod, string sqlQuery, SqlParameter param) 
    { 
     using (SqlConnection conn = new SqlConnection(this.MyConnectionString)) 
     { 
      conn.Open(); 

      // Declare the parameter in the query string 
      using (SqlCommand command = new SqlCommand(sqlQuery, conn)) 
      { 
       // Now add the parameter to the parameter collection of the command specifying its type. 
       command.Parameters.Add(param); 

       command.Prepare(); 

       // Now, add a value to it and later execute the command as usual. 
       command.Parameters[0].Value = dataId; 


       using (SqlDataReader dr = command.ExecuteReader()) 
       { 
        return delegateMethod(dr); 
       } 
      } 
     } 
    } 

這應該是正確的,你可能要調換DataReader和Func中的DataTable,我不記得哪一個先到了參數類型或返回類型。

下面是使用Func委託的另一個示例,如果不需要返回類型,那麼也有Action委託。

Func Delegate Reading Normal Delegate Reading