none
Как получить значение идентификатора или авто номера в ADO.NET? RRS feed

  • Общие обсуждения

  • При работе с Microsoft SQL Server вы можете создать хранимую процедуру, которая будет возвращать значение идентификатора для вставленной строки. Ниже описаны три Transact-SQL функции в SQL сервере, которые могут быть использованы для получения значения столбца идентификаторов.

    SCOPE_IDENTITY возвращает значение последнего идентификатора в текущей области исполнения. SCOPE_IDENTITY подходит и его рекомендуется использовать для большинства сценариев.

    @@IDENTITY содержит последнее значение идентификатора, сгенерированного в любой из таблиц в текущей сессии. @@IDENTITY может зависеть от триггеров и может вернуть не то значение, которое вы ожидаете.

    IDENT_CURRENT, возвращает последнее значение, сгенерированное в определенной таблице в любой сессии и в любой области исполнения.

    Следующая хранимая процедура показывает как вставить строку в таблицу Categories и использовать выходной параметр для возвращения нового значения идентификатора, сгенерированного функцией Transact-SQL SCOPE_IDENTITY()

    CREATE PROCEDURE dbo.InsertCategory
     @CategoryName nvarchar(15),
     @Identity int OUT
    AS
    INSERT INTO Categories (CategoryName) VALUES(@CategoryName)
    SET @Identity = SCOPE_IDENTITY()
    
    

    Хранимая процедура может быть указана в InsertCommand объекта SqlDataAdapter. Свойство CommandType команды InsertCommand должно быть установлено в значение StoredProcedure. Выходное значение идентификатора получаем с помощью SqlParameter, свойство Direction которого установлено в ParameterDirection.Output. Когда обрабатывается InsertCommand, то автоматически увеличивается значение идентификатора, который возвращается и помещается в столбец CategoryID текущей строки, если вы установили свойство UpdatedRowSource команды вставки в UpdateRowSource.OutputParameters или в UpdateRowSource.Both.

    Если команда вставки содержит в себе INSERT блок и SELECT, который возвращает новое значение идентификатора, то вы можете получить новое значение, установив свойство UpdatedRowSource команды вставки в UpdateRowSource.FirstReturnedRecord.

    Пример кода:

    private static void RetrieveIdentity(string connectionString)
        {
          using (SqlConnection connection =
                new SqlConnection(connectionString))
          {
            // Create a SqlDataAdapter based on a SELECT query.
            SqlDataAdapter adapter =
              new SqlDataAdapter(
              "SELECT CategoryID, CategoryName FROM dbo.Categories",
              connection);
     
            //Create the SqlCommand to execute the stored procedure.
            adapter.InsertCommand = new SqlCommand("dbo.InsertCategory",
              connection);
            adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
     
            // Add the parameter for the CategoryName. Specifying the
            // ParameterDirection for an input parameter is not required.
            adapter.InsertCommand.Parameters.Add(
              new SqlParameter("@CategoryName", SqlDbType.NVarChar, 15,
              "CategoryName"));
     
            // Add the SqlParameter to retrieve the new identity value.
            // Specify the ParameterDirection as Output.
            SqlParameter parameter =
              adapter.InsertCommand.Parameters.Add(
              "@Identity", SqlDbType.Int, 0, "CategoryID");
            parameter.Direction = ParameterDirection.Output;
     
            // Create a DataTable and fill it.
            DataTable categories = new DataTable();
            adapter.Fill(categories);
     
            // Add a new row. 
            DataRow newRow = categories.NewRow();
            newRow["CategoryName"] = "New Category";
            categories.Rows.Add(newRow);
     
            adapter.Update(categories);
     
            Console.WriteLine("List All Rows:");
            foreach (DataRow row in categories.Rows)
            {
              {
                Console.WriteLine("{0}: {1}", row[0], row[1]);
              }
            }
          }
        }
    
    

    Также смотрите статью - Извлечение значений идентификаторов или автонумерации (ADO.NET)

     


    Для связи [mail]
    8 апреля 2011 г. 11:52

Все ответы