2012-10-24 7 views
5

우리는 Dapper.Net을 광범위하게 사용하고 있으며 매우 만족합니다. 우리는 하나의 결과 집합을 출력 매개 변수를 얻기 위해 connection.Query 구문을 사용하는 경우,출력 매개 변수는 항상 multi.Read와 함께 null입니다.

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 

} 

그러나 : multi.Read를 사용하여 저장 프로 시저의 출력 매개 변수를 검색 할 때 그러나 우리는 문제를 가로 질러 온 채워집니다

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

오류가 단정 한 DynamicParameters의 출력 매개 변수에 AttachedParam의 sqlValue는 항상 null 것입니다.

이 문제를 해결하기 위해 출력 매개 변수의 값을 저장 프로 시저의 결과 집합에 추가하고 그런 식으로 읽습니다.

왜 매개 변수가 항상 null입니까?

답변

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을 직접 사용할 때 똑같은 동작을 얻는다. –

관련 문제