Ich versuche, SCOPE_IDENTITY zu verwenden, um einen langen Primärschlüssel zurück zu c # mithilfe der ReturnValue-Option für DynamicParameter zurückzugeben.
Hier ist ein Beispielcode von der Dapper-Website:
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");
Anstatt int zurückzugeben, möchte ich Folgendes tun, da mein Primärschlüsselfeld bigint sein sollte
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");
In meinem Prozess verwende ich "RETURN SCOPE_IDENTITY ()".
Dies scheint jedoch zu einem "Angegebenen Cast ist nicht gültig" zu führen. Ausnahme.
Der Rückgabewert einer gespeicherten Prozedur ist immer implizit eine ganze Zahl, dh int
. Daher können Sie es nur als Ganzzahl behandeln. Wenn Sie versuchen, es als long
auszupacken, wird es fehlschlagen.
Optionen:
int
auf der .NET-Seite out
Parameter vom Typ bigint
und behandle ihn so long
auf der .NET-Seite select
und Query<long>(...).Single()
Wenn ich mich richtig erinnere, gibt SCOPE_IDENTITY () eine Dezimalzahl zurück ( http://msdn.microsoft.com/en-us/library/ms190315.aspx ), daher die ungültige Cast-Ausnahme.
Sie müssen es in bigint (in SQL) umwandeln, damit es so funktioniert, wie Sie es wollen.