2012-05-05 2 views
5

양식이로드 될 때 데이터 메시지 하위 폼에서이 코드를 실행 중이며 오류 메시지 또는 코드 나누기가 표시되지 않습니다. 내 debug.print 보여야 레코드 집합 rs 2131 레코드로 채워져 있어야하지만 내 양식 #Name 함께 단일 행을 보여줍니다? 모든 분야에서. 내 컨트롤의 컨트롤 소스 속성은 위에 나열된 필드 이름과 가장 일치합니다. RS는 양식 수준 변수이며 양식을 닫을 때까지 아무것도 닫지 않거나 설정하지 않습니다.메모리에서 독립 실행 형 연결이 끊긴 ADO 레코드

내가 뭘 잘못하고 있니?

Set rs = New ADODB.Recordset 
rs.Fields.Append "TimesUsed", adInteger 
rs.Fields.Append "strWorkType", adVarWChar, 150 
rs.Fields.Append "DateLastUsed", adDate 
rs.Fields.Append "SelectedYN", adBoolean 
Set rs.ActiveConnection = Nothing 
rs.CursorLocation = adUseClient 
rs.LockType = adLockBatchOptimistic 
rs.Open 

Dim sSQL As String 
sSQL = "MyComplicated SQL Statement Ommitted from this SO Question" 

Dim r As DAO.Recordset 
Set r = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset, dbSeeChanges) 
If Not (r.EOF And r.BOF) Then 
    r.MoveFirst 
    Dim fld 
    Do Until r.EOF = True 
     rs.AddNew 
     For Each fld In r.Fields 
      rs(fld.Name) = r(fld.Name).value 
     Next 
     rs.Update 
     r.MoveNext 
    Loop 
End If 
r.Close 
Set r = Nothing 
Debug.Print rs.RecordCount '2131 records 
Set Me.Recordset = rs 

OK, 그래서 난 그냥 this on the MSDN site 읽기 :

레코드 집합은 테이블의 기본 키처럼 고유하게 인덱싱 된 하나 개 이상의 필드를 포함해야합니다.

(주의 :이 정보는이 컨텍스트에서 잘못된 것 같습니다.)

+2

이 작은 테이블 (4 개 필드) 후의 rstADO.MoveFirst & rstADO.MoveLast를 사용한다. 그러나 저는 기업용으로 개발할 필요가 없었습니다. 따라서 많은 양의 데이터 (10,000 개 이상의 레코드)를 데이터 시트 뷰로 가져 오는 것에 익숙합니다. 우리 서버에서 기가비트 이더넷과 빠른 하드 드라이브를 사용하면 DAO와 ODBC Linked Tables를 사용하고 있어도 사용자로부터 불만이 없습니다. 그래서, 저는 지금까지 "지금까지"실제로는 꽤 잘 작동한다고 말하고 있습니다. – HK1

답변

4

나는이 일을 할 수있는 유일한 방법은 집합 LockType adLockPessimistic 또는 adLockOptimisic를 사용하는 것을 알아 냈다. 명백한 이유로 adLockReadOnly가 작동하지 않으며 adLockBatchOptimistic이 레코드가 정상적으로 작동하는 것처럼 보일지라도 레코드가 내 양식에 표시되는 것을 허용하지 않습니다.

이 형식의 연결이 끊긴 레코드 집합에 정의 된 기본 키를 폼에 바인딩 할 필요가 없음을 알았습니다. 폼을 통해 레코드 세트를 수정하거나 업데이트 할 수는 없겠지만, 테스트 중에는 오류 3270이 발생했기 때문에이 형식/레코드 세트를 편집 할 수 없다는 것을 알았습니다. (누락 된 속성과 관련이 있습니다). 그것은이 질문의 범위 밖에 있습니다.

여기에 메모리 레코드 작업을 만드는 데 필요한 최소한의 코드 : 그것은 처음 나에게 나타나

Dim rs As ADODB.Recordset 'Form Level variable 

Private Sub Form_Load() 
    Set rs = New ADODB.Recordset 
    rs.Fields.Append "ID", adInteger 
    'Set rs.ActiveConnection = Nothing 'Not Required 
    'rs.CursorType = adOpenKeyset 'Not Required 
    'rs.CursorLocation = adUseClient 'Not Required 
    rs.LockType = adLockPessimistic 'May also use adLockOptimistic 
    rs.Open 

    Dim i as Integer 

    For i = 1 To 10 
     rs.AddNew 
     rs("ID").Value = i 
     rs.Update 
    Next i 

    Set Me.Recordset = rs 
End Sub 

이 끊긴 레코드 이러한 유형의 양식 (내 경우에는 데이터 시트보기) 바인딩 것 내 특별한 요구를위한 좋은, 간단한 해결책이 될 수 있습니다. 그러나 몇 가지 문제가 발생했습니다. 기본 폼 정렬 ADO 레코드 집합에 바인딩 된 폼을 가지고있을 때 작동하지 않습니다. 또한, 어떤 이유로 든이 레코드 세트를 편집 가능/업데이트 가능으로 만들지 못했습니다. 이는 필자의 요구 사항이었습니다 (기본적으로 다중 체크리스트로 사용하고있었습니다). 빈 테이블 인 경우에도 테이블에서 레코드 세트를 가져온 다음 연결을 끊으면이 문제를 해결할 수 있습니다. 외관상으로는 테이블은 구조체 또는 속성의 일부를 제공합니다. 위 코드에서 설정하지 못한 것은 레코드 추가/편집을 시도 할 때 발생하는 3270 오류 메시지로 판단한 것입니다. 그리고 나는 그 속성이 무엇인지 또는 어떻게 설정해야하는지 알지 못했습니다.

결론적으로, 나는 위에서 언급 한 문제가 없기 때문에 Access "temp"테이블을 대신 사용해야 할 것입니다.

+0

과거에는 단순한 메모리 내 데이터 세트를 작성하려는 비슷한 목표를 가지고있었습니다. 나는 비슷한 좌절을 안고 포기했다. –

7

그것을 설정하는 것이 가능 단지 메모리 목적 레코드의 기본 키?

예, adFldKeyColumnAttrib에서 Append Method으로 사용하십시오. 자세한 내용은 FieldAttributeEnum을 참조하십시오.

SQL 문에서 사용할 수있는 고유 한 필드 (또는 필드 조합)가 이미있는 경우이를 사용하십시오. 그렇지 않으면 긴 정수 필드를 만들어 가짜 기본 키 필드로 사용하십시오. 삽입 한 각 행의 값을 증가 시키십시오. 대니 Lesandrini하여 데이터베이스 저널에서이 문서가 도움이되는 경우

rs.Fields.Append "pkey", adInteger, , adFldKeyColumn 

또한 참조 : Create In-Memory ADO Recordsets

+0

위와 같이 기본 키 필드를 추가 했으므로 입력했지만 아직 #Name이 표시되어 있습니까? 내 모든 분야에서. 나는 당황 스럽다. – HK1

4

참고 : 나는 변경 양식 코드에 다음과 같은 그런 Create In-Memory ADO Recordsets 에서 위의 예제를 사용하여 새 레코드 를 삽입과 함께 제대로 작동하려면 모든 것을 얻을 수 있었다 ... '참고 : 트릭에 있었다 rstADO.Update

Option Compare Database 
Dim rstADO As ADODB.Recordset 
Dim lngRecordID As Long 

Private Sub Form_BeforeInsert(Cancel As Integer) 

    lngRecordID = lngRecordID + 1 
    rstADO.AddNew 
    rstADO("EmployeeID").value = lngRecordID 
    rstADO.Update 
    rstADO.MoveFirst 
    rstADO.MoveLast 

End Sub 

Private Sub Form_Load() 

    Dim fld As ADODB.Field 

    Set rstADO = New ADODB.Recordset 
    With rstADO 
     .Fields.Append "EmployeeID", adInteger, , adFldKeyColumn 
     .Fields.Append "FirstName", adVarChar, 10, adFldMayBeNull 
     .Fields.Append "LastName", adVarChar, 20, adFldMayBeNull 
     .Fields.Append "Email", adVarChar, 64, adFldMayBeNull 
     .Fields.Append "Include", adInteger, , adFldMayBeNull 
     .Fields.Append "Selected", adBoolean, , adFldMayBeNull 

     .CursorType = adOpenKeyset 
     .CursorLocation = adUseClient 
     .LockType = adLockPessimistic 
     .Open 
    End With 
    Set Me.Recordset = rstADO 

End Sub 

Private Sub Form_Unload(Cancel As Integer) 

    Set rstADO = Nothing 

End Sub