Próbuję wywołać procedurę składowaną z mojej aplikacji C # systemu Windows. Procedura składowana działa na lokalnym wystąpieniu programu SQL Server 2008. Mogę wywołać procedurę składowaną, ale nie mogę odzyskać wartości z procedury składowanej. Ta procedura składowana ma zwrócić następną liczbę w sekwencji. Zrobiłem badania online i wszystkie witryny, które widziałem, wskazywały, że to rozwiązanie działa.
Kod procedury składowanej:
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
Kod wywołujący procedurę składowaną:
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();
Próbowałem również użyć DataSet
do pobrania wartości zwracanej z tym samym wynikiem. Czego mi brakuje, aby uzyskać wartość zwracaną z mojej procedury składowanej? Jeśli potrzebujesz więcej informacji, daj mi znać.
@ReturnVal
do procedury składowanej?OUTPUT
parametru lub zestawu wyników.Wiem, że to jest stare, ale natknąłem się na to z Google.
Jeśli masz wartość zwracaną w procedurze składowanej, powiedz „Return 1” - nie używając parametrów wyjściowych.
Możesz wykonać następujące czynności - „@RETURN_VALUE” jest dyskretnie dodawane do każdego obiektu polecenia. NIE MUSISZ WYRAŹNIE DODAĆ
cmd.ExecuteNonQuery(); rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
źródło
Wersja EnterpriseLibrary na moim komputerze miała inne parametry. To działało:
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;
źródło
ExecuteScalar();
będzie działać, ale parametr wyjściowy byłby lepszym rozwiązaniem.źródło
Możesz spróbować użyć parametru wyjściowego. http://msdn.microsoft.com/en-us/library/ms378108.aspx
źródło
Miałem podobny problem z wywołaniem SP zwracającym błąd, że oczekiwany parametr nie został uwzględniony. Mój kod był następujący.
Procedura składowana:
I C#:
Podczas rozwiązywania problemów zdałem sobie sprawę, że procedura składowana RZECZYWISTE szukała kierunku „InputOutput”, więc następująca zmiana rozwiązała problem.
r
źródło
Lub jeśli używasz EnterpriseLibrary zamiast standardowego ADO.NET ...
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; }
źródło
To jest bardzo krótki przykład zwracania pojedynczej wartości z procedury:
SQL:
CREATE PROCEDURE [dbo].[MakeDouble] @InpVal int AS BEGIN SELECT @InpVal * 2; RETURN 0; END
Kod C #:
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
źródło
Widzę, że druga jest zamknięta. Więc w zasadzie tutaj jest przybliżony mój kod. Myślę, że brakuje ci komentarza cmd. Na przykład, jeśli moja procedura magazynu to call: DBO.Test. Musiałbym napisać cmd = "DBO.test". Następnie wpisz polecenie równe procedurze przechowywania i bla bla bla
Connection.open(); String cmd="DBO.test"; //the command Sqlcommand mycommand;
źródło