Frage

einen VBA-Skript in Excel verwenden, ich versuche, eine neue Zeile in eine Tabelle einfügen und dann den Identitätswert dieser Zeile zurück. Wenn ich laufen:

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

in Management Studio, wird die Zeile eingefügt und es gibt mir die zurückIdentitätsWert wie erwartet. Allerdings, wenn ich genau die gleiche Abfrage durch einen ADODB-Cord in VBA laufen, ich habe Probleme. Die Zeile wird in der Tat eingefügt, aber ich kann nicht den Identitätswert zugreifen. Die Datensatzlisten 0 Felder und wurde auch tatsächlich geschlossen. Ich habe versucht, mit und ohne das Semikolon, und ich habe auch versucht, als auch die Abfrage als eine einzelne Transaktion ausgeführt wird. Gleicher Deal, keine Würfel. Jede Idee, was ist da los?

Hier ist mein 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)

Und das Meldungsfeld nicht angezeigt werden, da die rs.Fields(0).Value NULL zurückgibt. Ich fügte hinzu, eine Uhr zu rs, und, wie gesagt, zeigt 0 Felder nach der Abfrage und erscheint auch (state = 0) geschlossen werden.

War es hilfreich?

Lösung

Wenn Sie einen Stapel von Befehlen ADODB laufen, ich glaube, es ist jeder läuft ein separat. Um den nächsten Befehl zu zwingen, geben Sie die folgenden verwenden:

Set rs = rs.NextRecordset()

Ändern Sie das Ende Ihrer Routine der folgenden sollte es tun:

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

Andere Tipps

Sie ausführen zwei Aussagen, so dass Sie zwei Ergebnisse zurückbekommen werden. das Re-Cord-Objekt kann ein Ergebnis zu einem Zeitpunkt nur halten -. das andere Ergebnis erhalten Sie die NextRecordset Methode verwenden, müssen

Set rs = rs.NextRecordset

Ihre rs.Open Try this

rs.Open SQLStr, cn, adCmdText

Sehen Sie, was passiert, wenn man die adOpenKeyset entfernen und adLockOptimistic Werte sie auf die Standardwerte verlassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top