2010-05-24 2 views
0

이것은 내가 SQL 데이터베이스를 업데이트하기 위해 사용하고 코드입니다 : IF 및VBA ODBC 업데이트

Public Sub main() 

    Dim cnn As ADODB.Connection 
    Dim rst As ADODB.Recordset 

    Set cnn = New ADODB.Connection 
    Set rst = New ADODB.Recordset 

    cnn.Open "ConnectionName" 
    rst.ActiveConnection = cnn 
    rst.CursorLocation = adUseServer 

    rst.Source = "Update Table ..." 
    rst.Open 

    Set rst = Nothing 
    Set cnn = Nothing 
End Sub 

는 내가 알고 싶은 것은 내가 그것을 연 후 첫 번째 개체를 처리하는 방법. 나는 그것을 닫습니까? rst.Close를 시도 할 때 "개체가 닫힐 때 작업이 허용되지 않습니다"라는 오류가 발생합니다. 이 코드는 rst.Close 없이도 잘 작동합니다. 객체를 닫지 않아도되는 위험이 있는지 궁금합니다.

답변

3

UPDATE 작업은 결과 집합을 반환하지 않습니다. 따라서 Recordset 개체를 사용하여 실행하면 비어있는 닫힌 레코드 집합이됩니다. 그것은 결코 열리지 않기 때문에 어쨌든 닫을 수 없습니다.

엄지 손가락의 규칙은 다음과 같습니다 당신의 SQL 경우,

dim cm as ADODB.Command 
set cm = new adodb.command 
set cm.activeconnection = cnn 
cm.commandtype = adCmdText 
cm.commandtext = "UPDATE ..." 

cm.execute ,, adExecuteNoRecords 

또는 : 어쨌든 데이터를 반환하지 않을 것 명령을 실행하기 때문에,

if rst.State <> adStateClosed then rst.Close 

하지만, 선호하는 방법입니다 매개 변수가없는 고정 된 문자열, 또한

cnn.execute "UPDATE ...",, adExecuteNoRecords 

는 01 rst.ActiveConnection = cnn을 변경하시기 바랍니다있다.

0

업데이트는 행을 반환하지 않으므로 레코드 집합을 열 필요가 없습니다.

직접 사용하여 문을 실행할 수 있습니다 : 데이터가 반환되지 않은 같은 레코드가 닫혀 .Open

Connection.Execute "Update Table ...", [flags]

은, 귀하의 질문에 대답하기를 (자사는 .state 될 것 adStateClosed), 그래서으로 설정 아무 것도 충분하지 않습니다.

관련 문제