Tsql 在插入后获取新记录的ID

Tsql 在插入后获取新记录的ID,tsql,asp-classic,ado,Tsql,Asp Classic,Ado,在厌倦了用Dreamweaver的方法作弊这么长时间后,我今天才开始思考插入语句(请不要笑) 我试图弄清楚的一件事是如何获取新插入记录的ID值,这样,如果成功,我就可以将用户重定向到该页面 我看到过一些关于存储过程的例子,但它们目前对我来说都是荷兰语,我还没有了解这些,更不用说如何在我的网页中使用它们了 摘要 如何使用下面的代码检索用户刚刚插入的记录ID 工作流 使用ASP页面(add.ASP)上显示的HTML表单,用户将提交插入数据库表中的新信息(Treu事务) 按submit键时,表单数据将

在厌倦了用Dreamweaver的方法作弊这么长时间后,我今天才开始思考插入语句(请不要笑)

我试图弄清楚的一件事是如何获取新插入记录的ID值,这样,如果成功,我就可以将用户重定向到该页面

我看到过一些关于存储过程的例子,但它们目前对我来说都是荷兰语,我还没有了解这些,更不用说如何在我的网页中使用它们了

摘要

如何使用下面的代码检索用户刚刚插入的记录ID

工作流

使用ASP页面(add.ASP)上显示的HTML表单,用户将提交插入数据库表中的新信息(Treu事务)

按submit键时,表单数据将传递到另一个页面(add_sql.asp),该页面将接收提交的数据和其他信息,并将其插入所需的表中

如果插入成功,则需要提取新记录的id值(存储在列
treebay\u transaction\u id
)以用作查询字符串的一部分,然后再将用户重定向到显示新插入记录的页面(view.asp?id=value)

示例代码-添加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>

...
错误!

…此处有错误文本和诊断。。。


在execute语句之后和关闭连接之前运行以下命令:

lsSQL = "SELECT @@IDENTITY AS NewID"
Set loRs = loConn.Execute(lsSQL)
llID = loRs.Fields("NewID").value
我从这里取的:

查看@@IDENTITY、SCOPE\u IDENTITY或IDENT\u CURRENT

这就假设您的ID字段是一个IDENTITY INSERT字段。还考虑列出的各种选项的后果,因为每一个行为和执行略有不同。


这取决于您使用的数据库,在SQL Server中,您可以获得@标识或作用域\u标识()请参见:


但有一件事我想提醒你,上面的代码有严重的安全漏洞,即SQL注入攻击,请不要连接来自用户的字符串,你应该使用命令参数。

按照你的方式构建你的
SQL
变量。让我们去DB一次,而不是两次。我们将在与插入语句相同的语句中使用
SCOPE\u IDENTITY()
,以避免多次访问数据库

在生成SQL语句时添加以下内容:

sql=sql&“选择SCOPE\u IDENTITY()作为NewTreebayTransactionID”
'现在执行insert并在一个execute语句中接收ID。
设置newTransactionResults=conn.Execute(sql)
这是我们的新身份证。
recordID=newTransactionResults(“NewTreebayTransactionID”)
完成后:

  • 清理用户输入的数据
  • 使用参数化语句

rs.AddNew documentation:

具有相同的事务:

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

请不要将上面的代码用作示例,它有SQL注入漏洞,通常会杀死IIS和ASP的声誉,而这些都是用户代码。正如CarlosAg所说!我知道我的代码有SQL注入问题,这是我打算学习的下一件事。感谢您的指导。使用MS SQL 2005 server,我可以通过SQL server Manager使生成的SQL字符串正常工作。每当我通过有问题的ASP页面(add_sql.ASP)尝试它时,它都会返回一个424-object-required错误。我已将该页面的最新格式示例放置在。如果你能看一看,找出我把事情弄糟的地方,我将不胜感激。因为你只返回一个记录集,你需要使用NextRecordSet吗?我不记得了,因为我已经很久没有用过这个了。p、 另外,在直接用于查询之前,您确实应该注意这里的人们关于清理数据的说法。您将面临许多问题。如果数据库中还有其他事情(如触发器)发生,这可能会导致重大问题。多亏了这一点,是否有任何原因会导致在集合行中sql之前返回预期的语句结束错误?在@thewinchster生成的最新结果和错误的完整示例:确实,也许现在就删除RecordsAffected参数?是的,这有所帮助,但不断引发对象异常。在阅读了spinon提供的链接后,最后添加了“Set newRS=newRS.NextRecordSet()”,现在工作正常。
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