【发布时间】:2015-10-29 18:06:19
【问题描述】:
我正在使用需要从 SQL Server 2012 表中获取插入标识的经典 ASP (VB) 应用程序。
在开发中,我比较的是SCOPE_IDENTITY()和OUTPUT,但是代码:
-
返回比预期更多的结果。结果始终是插入表中的 4 行,最后一个 Identity 在应用程序中返回。以前,我尝试过没有“Set NOCOUNT ON”的 SQL,但收到错误:
ADODB.Recordset 错误“800a0e78”
对象关闭时不允许操作。 显示
Incorrect syntax near 'OUTPUT'的错误消息。
如何纠正多行插入场景,以及在 VB 中使用这两种语法的最佳方法是什么? RecordSet 是否需要在插入后、选择之前关闭?
谢谢
首先,表格:
CREATE TABLE [dbo].[table_a]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[col1] [int] NULL,
[col2] [int] NULL,
[col3] [int] NULL
) ON [PRIMARY]
GO
接下来,经典的 ASP (VB) 代码:
<%
'---- CursorTypeEnum Values ----
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
'---- LockTypeEnum Values ----
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4
strSQL = "SET NOCOUNT ON;INSERT INTO [table_a] ([col1],[col2],[col3]) VALUES (1,2,3) SELECT Scope_Identity() as ID;"
Set rsResults_a = Server.CreateObject("ADODB.Recordset")
rsResults_a.Open strSQL, objConnection, adOpenDynamic,adLockOptimistic
if not rsResults_a.eof then
Do until rsResults_a.EOF
ResultID_a = rsResults_a("ID")
response.write("<BR>"&ResultID_a&"<BR>")
rsResults_a.MoveNext
Loop
end if
rsResults_a.close
Set rsResults_a=nothing
'/////
strSQL = "INSERT INTO [table_a] ([col1],[col2],[col3]) VALUES (1,2,3) OUTPUT inserted.ID;"
Set rsResults_b = Server.CreateObject("ADODB.Recordset")
rsResults_b.Open strSQL, objConnection, adOpenDynamic,adLockOptimistic
if not rsResults_b.eof then
Do until rsResults_b.EOF
ResultID_b = rsResults_b("ID")
response.write("<BR>"&ResultID_b&"<BR>")
rsResults_b.MoveNext
Loop
end if
rsResults_b.close
Set rsResults_b =nothing
If objConnection.State = adStateOpen Then
objConnection.Close
End If
%>
【问题讨论】:
-
这两种方法都不是很好,当我靠近电脑时会发布答案。
-
您应该使用存储过程和参数化查询。
标签: sql sql-server asp-classic adodb