Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > .NET FAQ > Хранимые процедуры с Output параметрами


Автор: PIL 08.08.06, 15:57
Часто возникает следующая задача - после вставки данных в таблицу с автоинкрементным ключем получить его значение, назначенное сервером БД. Решений данного вопроса может быть несколько: возвращаемое значение хранимой процедуры или использование Output параметра хранимой процедуры.
Второе рассмотрю подетальнее, так как первый вариант проще.
Исходные данные:
MS SQL Server, тестовая таблица с полями: ID, LOGIN, PWD, NOTES. Первое поле - первичный ключ, bigint, автоинкрементное.
Тестовая хранимая процедура:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ALTER PROCEDURE dbo.ADD_USER @LOGIN nchar(30), @PWD nchar(30), @NOTES varchar(50),
        @NEW_ID bigint out
        AS
     
        insert USERS(LOGIN, PWD, NOTES)
            values(@LOGIN, @PWD, @NOTES)
        SET @NEW_ID = Scope_Identity()
        
        RETURN 1

параметр @NEW_ID указан с модификатором out.
Код для тестирования (C#):
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    private SqlConnection conn;
    //
    public long CreateUser(string sLogin, string sPwd, string sNotes)
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "ADD_USER";
                cmd.Parameters.Add("@LOGIN", SqlDbType.Char);
                cmd.Parameters.Add("@PWD", SqlDbType.Char);
                cmd.Parameters.Add("@NOTES", SqlDbType.VarChar);
                cmd.Parameters.Add("@NEW_ID", SqlDbType.BigInt);
                cmd.Parameters["@LOGIN"].Value = sLogin;
                cmd.Parameters["@PWD"].Value = sPwd;
                cmd.Parameters["@NOTES"].Value = sNotes;
                //
                cmd.Parameters["@NEW_ID"].Direction = ParameterDirection.Output;
                try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    long r = (long)cmd.Parameters["@NEW_ID"].Value;
                    return r;
                }
                catch (Exception ex)
                {
     
                    onError(this, new ErrorEventArgs(ex));
                    return -1;
                }
                finally
                {
                    if(conn.State == ConnectionState.Open) conn.Close();
                    cmd.Dispose();
                }
            }

как видим, синтаксис вызова хп не очень отличается от стандартного, единственное для параметра @NEW_ID указано направление ParameterDirection.Output и извлекается значение после выполнения ХП.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)