Параметр вывода всегда имеет значение null с multi.Read

c# dapper

Вопрос

Мы широко используем Dapper.Net и очень довольны этим. Однако мы столкнулись с проблемой при попытке получить выходные параметры из хранимых процедур с использованием 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

}

Однако, если мы используем синтаксис connection.Query для получения одного набора результатов, то параметр output заполняется:

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

Ошибка заключается в том, что sqlValue AttachedParam в выходном параметре в Dapper DynamicParameters всегда равен нулю.

Чтобы обойти это, мы добавили значение выходного параметра в результирующие наборы хранимой процедуры и читаем его таким образом.

Почему параметр всегда равен нулю?

Принятый ответ

В потоке 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");

Если это не работает, дайте мне знать, р



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему