开发者

SCOPE_IDENTITY() vs. rs.Fields

开发者 https://www.devze.com 2023-01-12 05:38 出处:网络
what is the difference in the way these work: Sql = \"INSERT INTO mytable (datapath, analysistime,reporttime, lastcalib,analystname,reportname,batchstate,instrument) \" & _

what is the difference in the way these work:

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

and this:

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

my question is specifically this:

i am in a multiuser environment. immediately after the user adds a record, i need to catch the ROWID of the record added. how do i do this?

this is how i open the recordset:

rs.Open "batchinfo", cn, adOpenKeyset, adLockOptimistic, adCmdTable


The different is the way you add the record and get the result back.

In the first case, you are issuing an INSERT statement followed by a call to SCOPE_IDENTITY.

In the second case, you open an updatable cursor, add a record into it and read the newly added record back.

Opening a cursor may be quite a resource-intensive operation (this depends on how do you do it). It also can degrade concurrency.


Your first code example is not legal in SQL Server. What are the names after the VALUES clause supposed to be? I guess they are supposed to be parameters but you cannot pass parameters like that. Is there some reason why you are not using a parameterized stored procedure and parameter objects to pass in parameters?


Most of the time I use the open recordset, add data, update, grab ID method however as Quassnoi said it can be resource intensive. For parts of the application that are called a lot or need to run as fast as possible I tend to use a stored procedure with the new row’s ID as a return parameter.

Here is a code example

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
0

精彩评论

暂无评论...
验证码 换一张
取 消