Получение идентификатора новой записи после вставки - PullRequest
1 голос
/ 07 июля 2010

Сегодня я просто разбираюсь с заявлениями о вставках после того, как мне надоело обманывать с помощью методов Dreamweaver, которые делают это так долго (пожалуйста, не смейтесь).

Одна вещь, которую я пытаюсь выяснить, - это как получить значение идентификатора вновь вставленной записи, чтобы я мог перенаправить пользователя на эту страницу в случае успеха.

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

Основная информация

Как мне, используя мой код ниже, получить идентификатор записи для того, что пользователь только что вставил.

Workflow

Используя HTML-форму, представленную на странице ASP (add.asp), пользователь отправляет новую информацию, которая вставляется в таблицу базы данных (treebay_transaction).

При нажатии кнопки «Отправить» данные формы передаются на другую страницу (add_sql.asp), которая принимает отправленные данные вместе с дополнительной информацией и вставляет их в необходимую таблицу.

Если вставка прошла успешно, значение id новой записи (сохраненное в столбце treebay_transaction_id) необходимо извлечь, чтобы использовать как часть строки запроса, прежде чем пользователь будет перенаправлен на страницу, показывающую вновь вставленную запись ( view.asp? ID = значение).

Пример кода - add_sql.asp

<!--#include virtual="/Connections/IntranetDB.asp" -->
...
<html>
<body>
<%
set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = MM_IntranetDB_STRING
conn.Open ConnectionString
...
sql="INSERT INTO treebay_transaction (treebay_transaction_seller,treebay_transaction_start_date,treebay_transaction_expiry_date,treebay_transaction_title,treebay_transaction_transaction_type,treebay_transaction_category,treebay_transaction_description,treebay_transaction_status)"
sql=sql & " VALUES "
sql=sql & "('" & CurrentUser & "',"
sql=sql & "'" & timestampCurrent & "',"
sql=sql & "'" & timestampExpiry & "',"
sql=sql & "'" & Request.Form("treebay_transaction_title") & "',"
sql=sql & "'" & Request.Form("treebay_transaction_transaction_type") & "',"
sql=sql & "'" & Request.Form("treebay_transaction_category") & "',"
sql=sql & "'" & Request.Form("xhtml1") & "',"
sql=sql & "'3')"

on error resume next
conn.Execute sql,recaffected
if err<>0 then
%>
<h1>Error!</h1>
<p>
...error text and diagnostics here...
</p>
<%
else
    ' this is where I should be figuring out what the new record ID is
    recordID = ??
    ' the X below represents where that value should be going
    Response.Redirect("index.asp?view.asp?id='" & recordID & "'")
end if
conn.close
%>
</body>
</html>

Ответы [ 6 ]

5 голосов
/ 07 июля 2010

Запустите это после вашего оператора execute и перед тем, как закрыть соединение:

lsSQL = "SELECT @@IDENTITY AS NewID"
Set loRs = loConn.Execute(lsSQL)
llID = loRs.Fields("NewID").value

Я вытащил его отсюда: http://www.kamath.com/tutorials/tut007_identity.asp

3 голосов
/ 07 июля 2010

Создайте переменную sql, как вы были.Давайте сделаем одну поездку в БД вместо двух.Мы будем использовать SCOPE_IDENTITY() прямо в том же операторе (ах), что и INSERT, чтобы избежать многих обращений к базе данных.

Добавьте это при построении вашего оператора SQL:

sql=sql & "; SELECT SCOPE_IDENTITY() As NewTreebayTransactionID"

'now execute the insert and receive the ID in one Execute statement.
 set newTransactionResults = conn.Execute(sql)

 'here is our new ID.
 recordID = newTransactionResults("NewTreebayTransactionID")

Как только это будет сделано:

  • очистите ваши данные от вашего пользователя
  • используйте параметризованные операторы
2 голосов
/ 07 июля 2010
Set objConn = CreateObject("ADODB.Connection")
set rs = Server.CreateObject("ADODB.Recordset")
        objConn.Open "DSN=connectionName"
        rs.CursorLocation = 3
        rs.Open "treebay_transaction", objConn, 3, 3

        rs.AddNew fieldlist,values 'see link bellow to see how to fill this
        rs.Update
        bookmark = rs.absolutePosition  ' First, store the location of you cursor
        rs.Requery                      ' Next, update your recordset with the data from the database
        rs.absolutePosition = bookmark  ' Finally, change your cursor back
        recordID = rs("ID")

rs.AddNew документация: http://www.w3schools.com/ado/met_rs_addnew.asp

2 голосов
/ 07 июля 2010

Это зависит от базы данных, которую вы используете, в SQL Server вы можете получить @@ IDENTITY или SCOPE_IDENTITY (), см .: http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

Но я хочу предупредить вас об одном: в приведенном выше коде есть ОЧЕНЬ уязвимости безопасности, а именно атака SQL-инъекций. Пожалуйста, держитесь подальше от конкатенации строк, поступающих от пользователей, вы должны использовать параметры команд.

1 голос
/ 07 июля 2010

смотрите @@ IDENTITY, SCOPE_IDENTITY или IDENT_CURRENT

Это предполагает, что ваше поле ID является полем IDENTITY INSERT.Также рассмотрите последствия различных перечисленных опций, так как каждый действует и работает немного по-разному.

http://sqlserverpedia.com/wiki/Functions_-_@@IDENTITY,_SCOPE_IDENTITY,_IDENT_CURRENT

0 голосов
/ 03 сентября 2018

С той же транзакцией:

Const adUseServer = 2
Const adOpenKeyset = 1
Const adLockOptimistic = 3

Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open "DSN=connectionName"
  Set oRS = Server.CreateObject("ADODB.RecordSet")
  oRS.CursorLocation = aduseserver
  oRS.CursorType = adopenkeyset
  oRS.LockType = adlockoptimistic
  oRS.Open "treebay_transaction", oConn
  if oRS.eof then
    oRS.AddNew
    oRS("treebay_transaction_seller") = CurrentUser
...
    oRS.Update
    recordID = oRS("treebay_transaction_id")
  end if
  oRS.Close
  set oRS = nothing
oConn.Close
Set oConn = Nothing
...