2014-11-07 3 views
0

오라클 데이터베이스에서 레코드 세트를 가져와 액세스 데이터베이스에 기록해야하는 다음 코드가 있습니다. 약 2000 개의 행이 있으며 예상하고 있습니다. 같은 액세스를 전송 참조하십시오. 문제는 데이터의 첫 번째 행만 무한 루프로 데이터베이스에 기록된다는 것입니다. getconnection 함수는 Access에 연결하는 사용자 정의 함수입니다.Excel VBA ADO - 데이터베이스에 쓰기 - 반복적으로 쓰여진 레코드의 첫 번째 행만

코드를 작동 시키려면 무엇을 변경해야합니까? 감사

Sub InsertLine(rS As ADODB.recordset) 

Dim adoConn As ADODB.Connection, adoComm As ADODB.Command 

Set adoConn = GetConnection("access") 
Set adoComm = New ADODB.Command 

With adoComm 

    Set .ActiveConnection = adoConn 


     Do Until rS.EOF 

      .CommandText = "INSERT INTO Products ([Product], [Category]) " & _ 
          "VALUES(?,?)" 

      .Parameters.Append .CreateParameter(Type:=adVarWChar, Value:=rS![ITMDSC], Size:=255) 
      .Parameters.Append .CreateParameter(Type:=adVarWChar, Value:=rS![GRPDSC], Size:=255) 

      .Execute 

      rS.MoveNext 

      Debug.Print rS![ITMDSC] 
     Loop 

End With 

adoConn.Close 

최종 하위 답변들에 대한

감사합니다. 필자는 다음과 같이 코드를 편집했지만 여전히 동일한 문제가 발생했습니다. 아니면 네가 의미하는 것을 이해하지 못 했니? 죄송합니다. 디버그 라인에 올바른 다음 레코드가 표시됩니다. 환호

Sub InsertLine(rS As ADODB.recordset) 

Dim adoConn As ADODB.Connection, adoComm As ADODB.Command, S As String, S2 As String 

Set adoConn = GetConnection("access") 
Set adoComm = New ADODB.Command 

With adoComm 

    Set .ActiveConnection = adoConn 

     .CommandText = "INSERT INTO Products ([Product], [Category]) " & _ 
          "VALUES(?,?)" 

     .Parameters.Append .CreateParameter(Type:=adVarWChar, Value:=rS![ITMDSC], Size:=255) 
     .Parameters.Append .CreateParameter(Type:=adVarWChar, Value:=rS![GRPDSC], Size:=255) 

     S = rS![ITMDSC] 
     S2 = rS![GRPDSC] 

     Do Until rS.EOF 
       .CommandText = "INSERT INTO Products ([Product], [Category]) " & _ 
         "VALUES(S , S2)" 

      .Execute 
      rS.MoveNext 

      Debug.Print rS![ITMDSC] 
     Loop 

End With 

adoConn.Close 

종료 하위

+1

이 보이는 현재의 매개 변수를 지워야합니다 ... 그것은 overcomplicated 만들고있다 각 루프 반복, 그래서 무시되는 추가 매개 변수 추가. 루프 외부에 두 개의 매개 변수를 작성하고 각각에 대한 참조를 저장해야합니다. 그런 다음 루프에서 이미 작성한 매개 변수의 값을 설정하십시오. – Joe

+0

문제는 각 루프에서 레코드 세트를 다시 생성한다는 것입니다. 루프 외부에서'Execute' 라인을 통해'CommandText'를 이동하십시오. –

+0

테이블에 새 레코드를 추가하거나 필드를 기존 레코드에 추가하려고합니까? –

답변

-1

왜 매개 변수 쿼리를 사용할 수 있습니까? 그것은

.CommandText = "INSERT INTO Products ([Product], [Category]) " & _ 
       "VALUES('" & rS![ITMDSC] & "','" & rS![GRPDSC] & "')" 
.Execute 
rS.MoveNext 

당신이 매개 변수 쿼리를 사용하려는 경우, 다음

.Parameters.Refresh 

는 당신이 매개 변수를 삭제하지 않는 것처럼

+0

"매개 변수 쿼리를 사용하는 이유는 무엇입니까?" - SQL 인젝션에 대해 들어 본 적이 없습니까? 어떤 경우에는 varchar 매개 변수에 따옴표가 없으므로이 방법이 작동하지 않습니다. -1 – Joe

+0

@joe, 1. 따옴표는 부전승으로 예제에 추가됩니다. 2. 주입에 대해 걱정할 경우, 값을 문자열에 배치하기 전에 입력을 구문 분석/위생 처리하십시오. – SeanC