Pergunta

Usando um script VBA no Excel, eu estou tentando inserir uma nova linha em uma tabela e, em seguida, receber de volta o valor de identidade dessa linha. Se eu executar:

INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP);
SELECT SCOPE_IDENTITY()

no Management Studio, a linha é inserida e isso me dá o valor de identidade retornado como esperado. No entanto, quando eu executar a mesma consulta exata através de um conjunto de registos ADODB em VBA, estou tendo problemas. A linha é de fato inserido, mas não posso acessar o valor de identidade. As listas de registros 0 campos e foi realmente fechado também. Eu tentei com e sem o ponto e vírgula, e eu também tentei executar a consulta como uma única transação também. Mesma coisa, não dados. Alguma idéia do que está acontecendo?

Aqui está a minha 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)

E a caixa de mensagem não for exibido, porque o NULL rs.Fields(0).Value retornos. Eu adicionei um relógio para rs, e, como eu disse, mostra 0 campos após a consulta e também parece ser fechada (estado = 0).

Foi útil?

Solução

Quando você executar um lote de comandos usando ADODB, eu acredito que ele é executado a cada um separadamente. Para forçar o próximo comando para executar, você tem que usar o seguinte:

Set rs = rs.NextRecordset()

Alterar o final da sua rotina para o seguinte deve fazer o truque:

Set rs = New ADODB.Recordset
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic
Set rs = rs.NextRecordset
MsgBox (rs.Fields(0).Value)

Outras dicas

Você está executando duas declarações que você vai ter dois resultados de volta. o objeto conjunto de registros só pode ter um resultado em um momento -. para obter outro resultado que você precisa usar o método NextRecordset

Set rs = rs.NextRecordset

Em seu rs.Open Tente este

rs.Open SQLStr, cn, adCmdText

Veja o que acontece quando você remove os valores adOpenKeyset e adLockOptimistic deixá-los em seus padrões.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top