Возвращение идентификатора области с использованием sqlCommand.ExecuteNonQuery () - PullRequest
1 голос
/ 13 декабря 2011

У меня есть хранимая процедура, которая выглядит так.

ALTER PROCEDURE dbo.addPackage(

    @PackageStatus                      VARCHAR(50) = null,
    @OrgCode                            VARCHAR(50) = null,
    @SystemID                           VARCHAR(50) = null,
    @ID                               int OUTPUT
)
AS
BEGIN
    insert into package_table
    (
            PackageStatus,
            OrgCode,
            SystemID
            )
            values
            (@PackageStatus, 
            @OrgCode, 
            @SystemID
            )
            SET @ID =  SCOPE_IDENTITY()
END

И моя функция добавляет следующие параметры в команду sql и вызывает sqlCommand.ExecuteNonQuery();

List<SqlParameter> parameters = new List<SqlParameter>();

parameters.Add(new SqlParameter("@PackageStatus", package.PackageStatus));
parameters.Add(new SqlParameter("@OrgCode", package.OrgCode));
 parameters.Add(new SqlParameter("@SystemID", package.SystemID));

SqlParameter outParameter = new SqlParameter("@ID", SqlDbType.Int);
outParameter.Direction = ParameterDirection.Output;
parameters.Add(outParameter);

но я продолжаю получать 0 обратно из хранимой переменной evne, хотя у меня объявлен параметр out, и я установил его до выхода из хранимой процедуры. Запись успешно добавлена ​​со значением автоинкремента для идентификатора, но идентификатор не возвращается, когда я возвращаю выходной параметр. Он установлен на 0.

Есть предложения?

1 Ответ

4 голосов
/ 13 декабря 2011

Вы определили выходной параметр - но вы также читаете его после вызова .ExecuteNonQuery() ?? К сожалению, вы не показываете этот код ...

В основном вам нужно

SqlCommand cmd = new SqlCommand(..., connection); .....

// set up your parameter as above

connection.Open();
cmd.ExecuteNonQuery();

var outputValue = cmd.Parameters["@APID"].Value;  // you need to read it out!

connection.Close();

Ты это делаешь ?? И вот где ты все время возвращаешь 0 ??

Выходным параметром является NOT возвращаемое значение из вызова .ExecuteNonQuery() - вам необходимо явно считывать значение параметра после вызова.

...