这些工作的方式有何不同:
Sql = "INSERT INTO mytable (datapath, analysistime,reporttime, lastcalib,analystname,reportname,batchstate,instrument) " & _
"VALUES (dpath, atime, rtime,lcalib,aname,rname,bstate,instrument) SELECT SCOPE_IDENTITY()"
Set rs = cn.Execute
Set rs = rs.NextRecordset
和此:
With rs
.AddNew ' create a new record
' add values to each field in the record
.Fields("datapath") = dpath
.Fields("analysistime") = atime
.Fields("reporttime") = rtime
.Fields("lastcalib") = lcalib
.Fields("analystname") = aname
.Fields("reportname") = rname
.Fields("batchstate") = bstate
.Fields("instrument") = instrument
.Update ' stores the new record
id=fields.Fields("rowid") ' ** Answer to Question ***
End With
我的问题具体是:
我在多用户环境中。在用户添加记录后,我需要立即捕获添加的记录的ROWID。我该怎么做?
这就是我打开记录集的方式:
rs.Open "batchinfo", cn, adOpenKeyset, adLockOptimistic, adCmdTable
答案 0 :(得分:1)
不同的是你添加记录并获得结果的方式。
在第一种情况下,您要发出INSERT
声明,然后拨打SCOPE_IDENTITY
。
在第二种情况下,打开一个可更新的游标,在其中添加一条记录并重新读取新添加的记录。
打开游标可能是一项资源密集型操作(这取决于你是如何做到的)。它也会降低并发性。
答案 1 :(得分:1)
您的第一个代码示例在SQL Server中不合法。 VALUES子句应该是什么名字?我猜他们应该是参数,但你不能传递这样的参数。您是否有理由不使用参数化存储过程和参数对象传入参数?
答案 2 :(得分:0)
大多数时候我使用开放记录集,添加数据,更新,抓取ID方法,但Quassnoi说它可能是资源密集型的。对于被称为批次或需要尽可能快地运行的应用程序的部分,我倾向于使用具有新行ID的存储过程作为返回参数。
这是一个代码示例
Set cmd = New ADODB.Command
With cmd
.CommandText = "sptblTest_questions_UPSERT"
.CommandType = adCmdStoredProc
.ActiveConnection = dbCon
.Parameters.Append .CreateParameter("@Question_ID", adInteger, adParamInput, 0, Me.txtQuestion_ID)
.Parameters.Append .CreateParameter("@Section_ID", adInteger, adParamInput, 0, Me.txtSection_ID)
.Parameters.Append .CreateParameter("@Question_number", adTinyInt, adParamInput, 0, Me.txtQuestion_number)
.Parameters.Append .CreateParameter("@Question_text", adVarChar, adParamInput, 1000, Me.txtQuestion_text)
.Parameters.Append .CreateParameter("@Max_score", adSmallInt, adParamInput, 0, Me.txtMax_score)
.Parameters.Append .CreateParameter("@User", adVarChar, adParamInput, 50, fOSUserName)
.Parameters.Append .CreateParameter("@Inserted_ID", adInteger, adParamOutput, 0)
.Execute
Me.txtQuestion_ID = .Parameters("@Inserted_ID")
End With