SCOPE_IDENTITY()与rs.Fields

时间:2010-08-20 17:17:59

标签: sql sql-server vba adodb

这些工作的方式有何不同:

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

3 个答案:

答案 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