SCOPE_IDENTITY () против rs.Fields - PullRequest
0 голосов
/ 20 августа 2010

в чем разница в том, как они работают:

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 ]

1 голос
/ 20 августа 2010

Ваш первый пример кода недопустим в SQL Server. Каковы имена после предложения VALUES? Я предполагаю, что они должны быть параметрами, но вы не можете передавать такие параметры. Есть ли какая-то причина, по которой вы не используете параметризованную хранимую процедуру и объекты параметров для передачи параметров?

1 голос
/ 20 августа 2010

Другой способ - добавить запись и получить результат обратно.

В первом случае вы выполняете оператор INSERT с последующим вызовом SCOPE_IDENTITY.

Во втором случае вы открываете обновляемый курсор, добавляете в него запись и читаете вновь добавленную запись обратно.

Открытие курсора может быть довольно ресурсоемкой операцией (это зависит от того, как высделай это).Это также может ухудшить параллелизм.

0 голосов
/ 23 августа 2010

Большую часть времени я использую открытый набор записей, добавляю данные, обновляю, получаю метод идентификации, однако, как сказал Кассной, это может быть ресурсоемким. Для частей приложения, которые вызываются много или должны работать как можно быстрее, я склонен использовать хранимую процедуру с идентификатором новой строки в качестве возвращаемого параметра.

Вот пример кода

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
...