Ausgabeparameter ist immer Null mit multi.Read

c# dapper

Frage

Wir nutzen Dapper.Net ausgiebig und sind sehr zufrieden damit. Beim Versuch, Ausgabeparameter aus gespeicherten Prozeduren mithilfe von multi abzurufen, ist jedoch ein Problem aufgetreten .

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

}

Wenn wir jedoch die connection.Query- Syntax verwenden, um eine einzige Ergebnismenge zu erhalten, wird der Ausgabeparameter aufgefüllt:

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

Der Fehler ist, dass der sqlValue von AttachedParam auf dem Ausgabeparameter in Dapper DynamicParameters immer null ist.

Um dies zu umgehen, haben wir den Ergebnismengen der Stored Procedure den Wert des Ausgabeparameters hinzugefügt und lesen ihn so.

Warum ist der Parameter immer null?

Akzeptierte Antwort

In einem TDS-Stream sind die OUT Parameter am Ende . In Ihrem Query<T> -Beispiel haben Sie den TDS-Stream verbraucht :

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

Weil Sie den Stream verbraucht haben, wurden die neuen Parameterwerte erreicht, und Sie sollten die Werte verfügbar haben. Im Beispiel QueryMultiple haben Sie das Ende des TDS-Streams nicht erreicht. Versuchen Sie, den 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");

Wenn das nicht funktioniert, lass es mich wissen, p



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum