На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: maxim84_
  
> Хранимые процедуры с Output параметрами , Использование в ADO.NET (пример на C#)
    Часто возникает следующая задача - после вставки данных в таблицу с автоинкрементным ключем получить его значение, назначенное сервером БД. Решений данного вопроса может быть несколько: возвращаемое значение хранимой процедуры или использование Output параметра хранимой процедуры.
    Второе рассмотрю подетальнее, так как первый вариант проще.
    Исходные данные:
    MS SQL Server, тестовая таблица с полями: ID, LOGIN, PWD, NOTES. Первое поле - первичный ключ, bigint, автоинкрементное.
    Тестовая хранимая процедура:
    ExpandedWrap disabled
      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#):
    ExpandedWrap disabled
      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 и извлекается значение после выполнения ХП.
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0198 ]   [ 15 queries used ]   [ Generated: 26.04.24, 00:41 GMT ]