2012-10-24 25 views
5

Stiamo utilizzando lo standard Dapper.Net e ne siamo molto soddisfatti. Tuttavia abbiamo incontrato un problema quando si cerca di recuperare i parametri di output da stored procedure utilizzando multi.Read:Il parametro di output è sempre nullo con 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 

} 

Tuttavia, se usiamo la sintassiconnection.Query per ottenere un singolo gruppo di risultati il ​​parametro di uscita è popolata:

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

l'errore è che lo sqlValue della AttachedParam sul parametro di uscita nelle DynamicParameters Dapper è sempre nullo.

Per aggirare questo abbiamo aggiunto il valore del parametro di uscita ai set di risultati della procedura memorizzata e lo stiamo leggendo in questo modo.

Perché il parametro è sempre nullo?

risposta

6

In un flusso TDS, i parametri OUT sono alla fine. Nel vostro Query<T> esempio, si ha consumato il flusso TDS:

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

così perché avete consumato il flusso, sono stati raggiunti i nuovi valori dei parametri, e si dovrebbe avere i valori disponibili. Nell'esempio QueryMultiple, lo non ha raggiunto alla fine del flusso TDS. Provare a spostare il 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"); 

Se che non funziona, fatemelo sapere; p

+0

Grazie Marc, funziona. Sapevo * doveva essere qualcosa di semplice ma non potevo vederlo ... – Simon

+2

@Simon è probabilmente ovvio ora, ma solo per aggiungere: si ottiene esattamente lo stesso comportamento quando si utilizza direttamente ADO.NET. –

Problemi correlati