2012-10-24 88 views
5

我們廣泛使用Dapper.Net,對此非常滿意。然而,我們嘗試使用multi.Read檢索存儲過程的輸出參數時所遇到的一個問題:多輸出參數始終爲空.Read

var p = new DynamicParameters(); 
p.Add("@id", id); 
p.Add("TotalRows", dbType: DbType.Int32, direction: ParameterDirection.Output); 

using (var multi = cnn.QueryMultiple(string.Format("dbo.[{0}]", spName), p, 
    commandType: CommandType.StoredProcedure)) 
{ 
    int TotalRows = p.Get<int>("@TotalRows"); //This is always null 

    var results = multi.Read<New_Supplier>().ToList<IDBSupplier>(); 
    var areas = multi.Read<node>().ToList<IDBNode>(); 
    var categories = multi.Read<node>().ToList<IDBNode>(); 
    int TotalRows = multi.Read<int>().FirstOrDefault(); // This works 

} 

然而,如果我們使用connection.Query語法來獲得單個ResultSet輸出參數填充:

var result = cnn.Query<New_Supplier>(string.Format("spname"), p, 
    commandType: CommandType.StoredProcedure).ToList<New_Supplier>(); 
int TotalRows = p.Get<int>("@TotalRows"); 

的錯誤是,AttachedParam對短小精悍DynamicParameters輸出參數的sqlValue總是空。

要解決此問題,我們已將輸出參數的值添加到存儲過程的結果集中,並正在以此方式讀取它。

爲什麼參數始終爲空?

回答

6

在TDS流中,OUT參數是在末端。在你Query<T>例如,你有消耗的TDS流

var result = cnn.Query<New_Supplier>(string.Format("spname"), p, 
    commandType: CommandType.StoredProcedure).ToList<New_Supplier>(); 
int TotalRows = p.Get<int>("@TotalRows"); 

如此,因爲你已經使用的流,新的參數值已經達到,你應該有可用的值。在QueryMultiple的例子中,你的還沒有到達TDS流的末尾。嘗試移動p.Get

var p = new DynamicParameters(); 
p.Add("@id", id); 
p.Add("TotalRows", dbType: DbType.Int32, direction: ParameterDirection.Output); 

using (var multi = cnn.QueryMultiple(string.Format("dbo.[{0}]", spName), p, 
    commandType: CommandType.StoredProcedure)) 
{  
    var results = multi.Read<New_Supplier>().ToList<IDBSupplier>(); 
    var areas = multi.Read<node>().ToList<IDBNode>(); 
    var categories = multi.Read<node>().ToList<IDBNode>(); 
} 
int TotalRows = p.Get<int>("@TotalRows"); 

如果不行,讓我知道,P

+0

感謝馬克,它的工作原理。我*知道*它必須是簡單的東西,但看不到它...... – Simon

+2

@Simon現在可能很明顯,但只是補充一點:直接使用ADO.NET時,您會得到完全相同的行爲。 –