Dapper che ottiene "Il cast specificato non è valido." per il valore del parametro ReturnValue

c# dapper stored-procedures

Domanda

Sto cercando di usare SCOPE_IDENTITY per restituire una lunga chiave primaria a c # usando l'opzione ReturnValue per DynamicParameter.

Ecco un codice di esempio dal sito Web di Dapper:

var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure); 

int b = p.Get<int>("@b");
int c = p.Get<int>("@c");

Invece di ritornare int, preferirei fare quanto segue in quanto il mio campo chiave principale dovrebbe essere bigint

var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int64, direction: ParameterDirection.ReturnValue);

cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure); 

int b = p.Get<int>("@b");
int c = p.Get<long>("@c");

Nel mio proc, sto usando "RETURN SCOPE_IDENTITY ()".

Tuttavia, ciò sembra comportare un "cast specificato non valido". eccezione.

Risposta accettata

Il valore di ritorno da una stored procedure è sempre implicitamente un intero, cioè int . In quanto tale, puoi trattarlo solo come un numero intero. Se provi a eliminarlo per un long , fallirà.

Opzioni:

  • se il valore si adatta, basta trattarlo come int in .NET
  • altrimenti usa un parametro out di tipo bigint e trattalo tanto a long sul lato .NET
  • oppure usa select e Query<long>(...).Single()

Risposta popolare

Se ricordo male, SCOPE_IDENTITY () restituisce un decimale ( http://msdn.microsoft.com/en-us/library/ms190315.aspx ), quindi l'eccezione cast non valida.

Devi lanciarlo su bigint (nell'SQL) affinché funzioni come vuoi tu.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché