Вернуть идентификатор при INSERT?

Я потратил некоторое время, думая об этом и пришел к некоторым заключениям. Сеансовые куки направляющих защищены от несанкционированного использования по умолчанию, таким образом, Вы действительно не должны волноваться о cookie, изменяемом на клиентском конце.

Вот то, что я сделал:

  • Сеансовые куки установлены быть долговечными (приблизительно 6 месяцев)
  • Внутренняя часть, хранилище сессии
    • 'истекает в' дату, которая назначена для входа в систему + 24 часа
    • идентификатор пользователя
    • , Аутентифицируемый = верный, таким образом, я могу допускать сессии анонимного пользователя (не опасный из-за защиты трамбовки cookie)
  • , я добавляю before_filter в Контроллере Приложения, который проверяет, 'истекает на' части сессии.

, Когда пользователь устанавливает флажок "Remember Me", я просто установил сессию [: expireson] дата, чтобы быть входом в систему + 2 недели. Никто не может украсть cookie и остаться, вошел в систему навсегда или подмена как другой пользователь, потому что сеансовые куки направляющих защищены от несанкционированного использования.

28
задан LarsTech 2 October 2013 в 23:00
поделиться

2 ответа

Почему бы вам не вызвать процедуру магазина? Передайте значения в процедуру сохранения, чтобы получить вставленные значения, а из SP вернуть последнее введенное начальное значение, используя SCOPE_IDENTITY().. Надеюсь, что это поможет.

0
ответ дан 28 November 2019 в 02:33
поделиться

Начиная с SQL Server 2008, к синтаксису TSQL добавлено предложение OUTPUT . Это позволяет добавлять данные, на которые влияет запрос DML, в поток табличных данных.

Несмотря на то, что запрос SCOPE_IDENTITY () после запроса возвращает правильную информацию, он заставляет SQL Server выполнить 2 запроса, где предложение output ограничивает это одним запросом.

Зная это, выполняемый запрос может быть изменен следующим образом (при условии, что [Id] является именем идентификатора):

INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) 
OUTPUT INSERTED.Id
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date)

Еще одна проблема не заключается в удалении SqlCommand , Большинство объектов Sql... в ADO.net реализуют IDisposable и должны быть утилизированы должным образом.

Собрав все воедино, я реализовал бы этот фрагмент кода следующим образом:

        using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
        using (var cmd = new SqlCommand(@"
                INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) 
                OUTPUT INSERTED.Id
                VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) ", conn))
        {
            cmd.Parameters.AddRange(new[]
                {
                    new SqlParameter("@OwnerID", SqlDbType.Int).Value = OwnerID,
                    new SqlParameter("@BoxKey", SqlDbType.VarChar).Value = BoxKey, 
                    new SqlParameter("@BoxName", SqlDbType.VarChar).Value = BoxName, 
                    new SqlParameter("@Date", SqlDbType.DateTime).Value = DateTime.Now 
                });

            conn.Open();

            var id = (int)cmd.ExecuteScalar();
        }
18
ответ дан 28 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: