Utilizando & # 8220; SELECT SCOPE_IDENTITY () & # 8221; en ADODB Recordset
-
05-07-2019 - |
Pregunta
Utilizando un script VBA en Excel, estoy tratando de insertar una nueva fila en una tabla y luego recuperar el valor de identidad de esa fila. Si corro:
INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP);
SELECT SCOPE_IDENTITY()
en Management Studio, la fila se inserta y me da el valor de identidad devuelto como se esperaba. Sin embargo, cuando ejecuto exactamente la misma consulta a través de un conjunto de registros ADODB en VBA, tengo problemas. La fila está insertada, pero no puedo acceder al valor de identidad. El juego de registros muestra 0 campos y también se ha cerrado. He intentado con y sin el punto y coma, y ??también intenté ejecutar la consulta como una sola transacción también. El mismo trato, no hay dados. ¿Alguna idea de lo que está pasando?
Aquí está mi VBA:
Dim rs As ADODB.Recordset
Dim cn As Connection
Dim SQLStr As String
Dim serverName As String
Dim databaseName As String
serverName = "MSSQLServer"
databaseName = "QA"
cxnStr = "Driver={SQL Server};Server=" & serverName & ";Database=" & databaseName & ";"
SQLStr = "INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP); SELECT SCOPE_IDENTITY()"
Set cn = New ADODB.Connection
cn.Open cxnStr
Set rs = New ADODB.Recordset
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic
MsgBox (rs.Fields(0).Value)
Y el cuadro de mensaje no se muestra porque el rs.Fields (0) .Value
devuelve NULL. Agregué un reloj a rs y, como dije, muestra 0 campos después de la consulta y también parece estar cerrado (estado = 0).
Solución
Cuando ejecutas un lote de comandos usando ADODB, creo que se ejecuta cada uno por separado. Para forzar la ejecución del siguiente comando, debe usar lo siguiente:
Set rs = rs.NextRecordset()
Cambiar el final de su rutina a lo siguiente debería hacer el truco:
Set rs = New ADODB.Recordset
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic
Set rs = rs.NextRecordset
MsgBox (rs.Fields(0).Value)
Otros consejos
Está ejecutando dos instrucciones, por lo que obtendrá dos resultados. el objeto de conjunto de registros solo puede contener un resultado a la vez: para obtener el otro resultado que necesita para usar el método NextRecordset.
Set rs = rs.NextRecordset
En tu rs.Open Prueba esto
rs.Open SQLStr, cn, adCmdText
Vea qué sucede cuando elimina los valores de adOpenKeySet y adLockOptimistic y déjelos en sus valores predeterminados.