문제

Excel에서 VBA 스크립트를 사용하여 새 행을 테이블에 삽입 한 다음 해당 행의 ID 값을 되 찾으려고합니다. 내가 달리면 :

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

Management Studio에서 행은 삽입되어 예상대로 반환 된 ID 값을 제공합니다. 그러나 VBA의 ADODB 레코드 세트를 통해 정확히 동일한 쿼리를 실행하면 문제가 있습니다. 행은 실제로 삽입되었지만 ID 값에 액세스 할 수 없습니다. 레코드 세트에는 0 개의 필드가 나열되어 있으며 실제로 닫혔습니다. 세미콜론이 있거나없는 유무에 관계없이 쿼리를 단일 트랜잭션으로 실행하려고 시도했습니다. 같은 거래, 주사위가 없습니다. 무슨 일이 일어나고 있는지 아십니까?

내 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)

그리고 메시지 상자가 표시되지 않습니다 rs.Fields(0).Value NULL을 반환합니다. 나는 RS에 시계를 추가했고, 내가 말했듯이, 쿼리 후 0 필드를 보여주고 닫힌 것으로 보인다 (state = 0).

도움이 되었습니까?

해결책

ADODB를 사용하여 한 배치의 명령을 실행하면 각 명령을 별도로 실행한다고 생각합니다. 다음 명령을 실행하려면 다음을 사용해야합니다.

Set rs = rs.NextRecordset()

일상의 끝을 다음으로 변경하면 다음과 같이해야합니다.

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

다른 팁

두 개의 진술을 실행하고 있으므로 두 가지 결과를 다시 얻을 수 있습니다. 레코드 세트 객체는 한 번에 한 결과 만 보유 할 수 있습니다. 다른 결과를 얻으려면 nextrecordset 메소드를 사용해야합니다.

Set rs = rs.NextRecordset

당신의 rs. open에서 이것을 시도하십시오

rs.Open SQLStr, cn, adCmdText

AdopenKeyset 및 Adlockoptomentistic 값을 제거 할 때 어떤 일이 발생하는지 확인하면 기본값으로 남겨 둡니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top