Ich versuche, eine gespeicherte Prozedur aus meiner C # -Fensteranwendung aufzurufen. Die gespeicherte Prozedur wird auf einer lokalen Instanz von SQL Server 2008 ausgeführt. Ich kann die gespeicherte Prozedur aufrufen, aber den Wert nicht von der gespeicherten Prozedur zurückrufen. Diese gespeicherte Prozedur soll die nächste Nummer in der Sequenz zurückgeben. Ich habe online recherchiert und alle Websites, die ich gesehen habe, haben darauf hingewiesen, dass diese Lösung funktioniert.
Gespeicherter Prozedurcode:
ALTER procedure [dbo].[usp_GetNewSeqVal]
@SeqName nvarchar(255)
as
begin
declare @NewSeqVal int
set NOCOUNT ON
update AllSequences
set @NewSeqVal = CurrVal = CurrVal+Incr
where SeqName = @SeqName
if @@rowcount = 0 begin
print 'Sequence does not exist'
return
end
return @NewSeqVal
end
Code, der die gespeicherte Prozedur aufruft:
SqlConnection conn = new SqlConnection(getConnectionString());
conn.Open();
SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter();
param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar);
param.Direction = ParameterDirection.Input;
param.Value = "SeqName";
SqlDataReader reader = cmd.ExecuteReader();
Ich habe auch versucht, mit a DataSet
den Rückgabewert mit dem gleichen Ergebnis abzurufen. Was fehlt mir, um den Rückgabewert von meiner gespeicherten Prozedur zu erhalten? Wenn Sie weitere Informationen benötigen, lassen Sie es mich bitte wissen.
@ReturnVal
die gespeicherte Prozedur ergänzen ?OUTPUT
Parameter oder eine Ergebnismenge.Ich weiß, dass dies alt ist, aber ich bin mit Google darauf gestoßen.
Wenn Ihre gespeicherte Prozedur einen Rückgabewert enthält, sagen Sie "Rückgabe 1" - ohne Ausgabeparameter.
Sie können Folgendes tun: "@RETURN_VALUE" wird stillschweigend zu jedem Befehlsobjekt hinzugefügt. KEINE NOTWENDIGE HINZUFÜGEN
cmd.ExecuteNonQuery(); rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
quelle
ExecuteScalar () funktioniert, aber ein Ausgabeparameter wäre eine überlegene Lösung.
quelle
Die Version von EnterpriseLibrary auf meinem Computer hatte andere Parameter. Das hat funktioniert:
SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int); retval.Direction = System.Data.ParameterDirection.ReturnValue; cmd.Parameters.Add(retval); db.ExecuteNonQuery(cmd); object o = cmd.Parameters["@ReturnValue"].Value;
quelle
Sie können versuchen, einen Ausgabeparameter zu verwenden. http://msdn.microsoft.com/en-us/library/ms378108.aspx
quelle
Ich hatte ein ähnliches Problem mit dem SP-Aufruf, der einen Fehler zurückgab, dass ein erwarteter Parameter nicht enthalten war. Mein Code war wie folgt.
Gespeicherte Prozedur:
Und C#:
Bei der Fehlerbehebung wurde mir klar, dass die gespeicherte Prozedur tatsächlich nach einer Richtung für "InputOutput" suchte, sodass die folgende Änderung das Problem behebt.
r
quelle
Oder wenn Sie EnterpriseLibrary anstelle von Standard-ADO.NET verwenden ...
Database db = DatabaseFactory.CreateDatabase(); using (DbCommand cmd = db.GetStoredProcCommand("usp_GetNewSeqVal")) { db.AddInParameter(cmd, "SeqName", DbType.String, "SeqNameValue"); db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null); db.ExecuteNonQuery(cmd); var result = (int)cmd.Parameters["RetVal"].Value; }
quelle
Dies ist ein sehr kurzes Beispiel für die Rückgabe eines einzelnen Werts aus einer Prozedur:
SQL:
CREATE PROCEDURE [dbo].[MakeDouble] @InpVal int AS BEGIN SELECT @InpVal * 2; RETURN 0; END
C # -Code:
int inpVal = 11; string retVal = "?"; using (var sqlCon = new SqlConnection( "Data Source = . ; Initial Catalog = SampleDb; Integrated Security = True;")) { sqlCon.Open(); retVal = new SqlCommand("Exec dbo.MakeDouble " + inpVal + ";", sqlCon).ExecuteScalar().ToString(); sqlCon.Close(); } Debug.Print(inpVal + " * 2 = " + retVal); //> 11 * 2 = 22
quelle
Ich sehe, der andere ist geschlossen. Im Grunde ist hier das Grobe meines Codes. Ich denke, Sie vermissen den String cmd Kommentar. Zum Beispiel, wenn meine Speicherprozedur aufgerufen wird: DBO.Test. Ich müsste cmd = "DBO.test" schreiben. Führen Sie dann den Befehlstyp aus, der der Speicherprozedur entspricht, und bla bla bla
Connection.open(); String cmd="DBO.test"; //the command Sqlcommand mycommand;
quelle