Получение возвращаемого значения в C # asp.net из хранимой процедуры (проблема с синтаксисом) - PullRequest
6 голосов
/ 26 февраля 2010

У меня возникают проблемы при попытке получить правильный синтаксис для моего кода C # 2008 asp.net. Мне нужно получить возвращаемое значение (выберите @@ Identity) из моей хранимой процедуры

Мой код C #:

        SqlConnection conn = new SqlConnection(strConn);
        string sql = "usp_ClientProfile_Header";
        SqlCommand cmdHeader = new SqlCommand(sql, conn);

        cmdHeader.CommandType = CommandType.StoredProcedure;

        cmdHeader.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.VarChar, 50));
        cmdHeader.Parameters["@FName"].Value = txtFName.Text.Trim();

        cmdHeader.Parameters.Add(new SqlParameter("@LastName", SqlDbType.VarChar, 50));
        cmdHeader.Parameters["@LName"].Value = txtLName.Text.Trim();

        cmdHeader.Parameters.Add(new SqlParameter("@EmailAddress", SqlDbType.VarChar, 100));
        cmdHeader.Parameters["@Email"].Value = txtEMail.Text.Trim();

        cmdHeader.Parameters.Add(new SqlParameter("@Address1", SqlDbType.VarChar, 255));
        cmdHeader.Parameters["@Address1"].Value = txtAddress1.Text.Trim();

        cmdHeader.Parameters.Add(new SqlParameter("@City", SqlDbType.VarChar, 50));
        cmdHeader.Parameters["@City"].Value = txtCity.Text.Trim();

        cmdHeader.Parameters.Add(new SqlParameter("@State", SqlDbType.VarChar, 50));
        cmdHeader.Parameters["@State"].Value = txtState.Text.Trim();

        cmdHeader.Parameters.Add(new SqlParameter("@ZipCode", SqlDbType.VarChar, 12));
        cmdHeader.Parameters["@Postal_Code"].Value = txtZip.Text.Trim();

Следующая строка в моем коде должна быть " ParameterDirection.ReturnValue ", но я не могу получить правильный синтаксис.

Есть идеи?

Ответы [ 4 ]

16 голосов
/ 26 февраля 2010

Для захвата ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ (возвращаемого SQL с использованием синтаксиса RETURN ({число})) используйте:

cmdHeader.Parameters.Add("@ReturnValue", SqlDbType.Int, 4).Direction = ParameterDirection.ReturnValue;

Кроме того, вам, вероятно, следует использовать SCOPE_IDENTITY () вместо @@ IDENTITY

Edit:
Таким образом, ваш sproc будет делать что-то вроде:

DECLARE @NewId INTEGER
INSERT SomeTable(FieldA) VALUES ('Something')
SELECT @NewId = SCOPE_IDENTITY()
RETURN (@NewId)

И ваш код C # для получения этого значения будет:

int newId = cmdHeader.Parameters[@ReturnValue].value;

Изменить 2:
Хорошо, исходный вопрос запутал проблему, поскольку «возвращаемое значение» - это нечто отличное от того, что вы на самом деле делаете, возвращая один столбец результатов.

Таким образом, вместо НЕ вообще добавьте параметр ReturnValue. Просто используйте ExecuteScalar () , используя исходную настройку SqlCommand, как показано ниже:

int newId = Convert.ToInt32(cmdHeader.ExecuteScalar());
3 голосов
/ 26 февраля 2010
SqlParameter parameterReturnValue = new SqlParameter("ReturnValue", SqlDbType.Int, 4);
parameterReturnValue.Direction = ParameterDirection.ReturnValue;
cmdHeader.Parameters.Add(parameterReturnValue);

//Execute your command
cmdHeader.ExecuteNonQuery();

//Get the return value
int returnvalue = (int)myCommand.Parameters["ReturnValue"].Value;
0 голосов
/ 10 мая 2013

Хранимая процедура SQL:

Предположим, что процедура возвращает некоторый идентификатор / идентификатор, как показано ниже

SET @ReturnValue= Scope_identity() return @ReturnValue

в C # мы можем

SqlParameter[] param = null; param = new SqlParameter[] { new SqlParameter("@idStudent",idStudent), new SqlParameter("","") // some empty parameters for return value }

//here we can update param with return type SqlParameter parOut = new SqlParameter("@ReturnValue", 0); parOut.Direction = ParameterDirection.Output; param[param.Length - 1] = parOut;

DataSet dsResult = con.executeSelectStoredProc("SP_NAME", param);

0 голосов
/ 26 февраля 2010

Направление установлено для объекта SqlParameter, для вашего примера оно должно быть примерно таким:

cmdHeader.Parameters["@Postal_Code"].Direction = ParameterDirection.ReturnValue;
...