2012-10-24 14 views
5

Używamy intensywnie Dapper.Net i jesteśmy z niego bardzo zadowoleni. Jednak mamy natknąć się problem, gdy próbuje odzyskać parametrów wyjściowych z procedury przechowywane przy użyciu multi.Read:Parametr wyjściowy zawsze ma wartość zerową z multi.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 

} 

Jednakże, jeśli używamy składni connection.Query aby uzyskać pojedynczy Resultset parametr wyjściowy jest wypełniana:

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

błąd jest to, że sqlValue z AttachedParam od parametru wyjściowego w Wytworny DynamicParameters zawsze ma wartość null.

Aby obejść ten problem, dodaliśmy wartość parametru wyjściowego do zestawów wyników procedury przechowywanej i odczytujemy ją w ten sposób.

Dlaczego parametr jest zawsze pusty?

Odpowiedz

6

W strumieniu TDS parametry to na końcu. W przykładzie Query<T> masz spożywane strumienia TDS:

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

tak dlatego, że spożywane strumienia, nowe wartości parametrów zostały osiągnięte, i trzeba mieć wartości dostępne. W przykładzie QueryMultiple użytkownik nie osiągnął końca strumienia TDS na poziomie. Spróbuj przesunąć 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"); 

Jeśli że nie działa, daj mi znać; p

+0

Dzięki Marc, to działa. Ja * wiedziałem * musiało to być coś prostego, ale po prostu nie mogłem tego zobaczyć ... – Simon

+2

@Simon to chyba teraz oczywiste, ale żeby dodać: otrzymujesz dokładnie to samo zachowanie, gdy używasz bezpośrednio ADO.NET. –

Powiązane problemy