2012-05-05 17 views
5

Tôi đang chạy mã này trên biểu mẫu con biểu dữ liệu của tôi khi biểu mẫu của tôi tải và tôi không nhận được bất kỳ thông báo lỗi hoặc ngắt mã nào. Debug.print của tôi cho thấy rằng các Recordset rs được lấp đầy với 2131 hồ sơ như nó phải được, nhưng hình thức của tôi cho thấy một hàng duy nhất với #Name? trong mọi lĩnh vực. Các thuộc tính nguồn điều khiển trên các điều khiển của tôi chắc chắn nhất phù hợp với các tên trường mà tôi đã liệt kê ở trên. RS là một biến cấp biểu mẫu và tôi không đóng nó hoặc đặt nó thành không có gì cho đến khi biểu mẫu đóng.Trong bộ nhớ, độc lập, bản ghi ADO bị ngắt kết nối

Bất kỳ ý tưởng nào tôi đang làm sai?

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, vì vậy tôi chỉ cần đọc this on the MSDN site:

Các recordset phải chứa một hoặc nhiều lĩnh vực được lập chỉ mục duy nhất, chẳng hạn như khóa chính của một bảng.

(Lưu ý: Những thông tin này có vẻ là sai lầm trong bối cảnh này.)

+2

Đây là một bảng nhỏ (4 lĩnh vực). Nhưng tôi đoán tôi đã không bao giờ thực sự phải phát triển cho doanh nghiệp vì vậy tôi quen với việc kéo một lượng lớn dữ liệu (10.000 bản ghi và đôi khi nhiều hơn) vào dạng xem biểu dữ liệu. Với Gigabit Ethernet và ổ đĩa cứng nhanh trong máy chủ của chúng tôi, tôi không nhận được khiếu nại từ người dùng của mình mặc dù chúng tôi đang sử dụng DAO với ODBC Linked Tables. Vì vậy, tôi không thực sự giải thích cách tiếp cận của tôi nhiều như tôi chỉ nói rằng "cho đến nay" nó thực sự hoạt động khá tốt. – HK1

Trả lời

4

tôi phát hiện ra rằng cách duy nhất tôi có thể làm cho công việc này là sử dụng LockType adLockPessimistic hoặc adLockOptimisic. adLockReadOnly không hoạt động vì những lý do hiển nhiên và vì một số lý do adLockBatchOptimistic không cho phép các bản ghi hiển thị trong biểu mẫu của tôi mặc dù bản ghi có vẻ đầy đủ chức năng.

Tôi cũng phát hiện ra rằng bạn không phải có khóa chính được xác định cho loại Recordset bị ngắt kết nối này được ràng buộc vào biểu mẫu. Tôi chắc rằng bạn sẽ không thể thực hiện bất kỳ chỉnh sửa hoặc cập nhật nào cho bản ghi thông qua biểu mẫu nhưng trong thử nghiệm của tôi, tôi thấy rằng tôi không thể thực hiện bất kỳ chỉnh sửa nào đối với loại biểu mẫu/bản ghi này vì tôi đã gặp Lỗi 3270 (một cái gì đó để làm với một tài sản còn thiếu). Điều đó thực sự nằm ngoài phạm vi của câu hỏi này.

Dưới đây là số tiền tối thiểu của mã cần thiết để tạo ra một hoạt động trong bộ nhớ recordset:

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 

Nó xuất hiện lần đầu với tôi rằng ràng buộc một hình thức (xem bảng dữ liệu trong trường hợp của tôi) để loại recordset bị ngắt kết nối sẽ là một giải pháp tốt, đơn giản cho các nhu cầu cụ thể của tôi. Tuy nhiên, tôi gặp phải một số vấn đề. Việc sắp xếp biểu mẫu mặc định có vẻ không hoạt động khi bạn có biểu mẫu của bạn được liên kết với một bản ghi ADO. Ngoài ra, vì một số lý do tôi không bao giờ có thể có được recordset này để có thể chỉnh sửa/updateable đó là một yêu cầu cho nhu cầu của tôi (tôi đã cơ bản sử dụng nó như là một danh sách kiểm tra đa). Nếu bạn có được bản ghi từ một bảng (ngay cả khi nó là một bảng trống) và sau đó ngắt kết nối bạn có thể làm việc xung quanh vấn đề này. Rõ ràng bảng cung cấp một số loại cấu trúc hoặc thuộc tính mà tôi đã thất bại trong việc đặt mã của tôi ở trên, đánh giá bởi thông báo lỗi 3270 tôi nhận được khi tôi cố gắng thêm/chỉnh sửa bản ghi. Và tôi đã không tìm ra những thuộc tính đó là gì hoặc cách đặt chúng.

Tóm lại, tôi nghĩ mình sẽ sử dụng bảng truy cập "tạm thời" vì nó sẽ ít phức tạp hơn và không có vấn đề tôi vừa liệt kê ở trên.

+0

Trong những ngày qua, tôi đã có một mong muốn tương tự để tạo ra một bộ dữ liệu đơn giản, trong bộ nhớ. Tôi đã có sự thất vọng tương tự và đã bỏ cuộc là tốt. –

7

là nó có thể thiết lập một khóa chính trên một recordset mà chỉ là một đối tượng trong bộ nhớ?

Có, sử dụng adFldKeyColumn làm Attrib đến Append Method. Đọc về FieldAttributeEnum để biết thêm chi tiết.

Nếu bạn đã có trường duy nhất phù hợp (hoặc kết hợp các trường) có sẵn từ câu lệnh SQL của bạn, hãy sử dụng nó. Nếu không, hãy tạo trường số nguyên dài và sử dụng trường đó làm trường khóa chính giả ... tăng giá trị cho mỗi hàng bạn chèn.

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

Cũng xem bài viết này từ Tạp chí Cơ sở dữ liệu Danny Lesandrini là hữu ích: Create In-Memory ADO Recordsets

+0

ok, vì vậy tôi đã thêm trường khóa chính như được đề xuất ở trên và tôi đã điền nó nhưng tôi vẫn thấy #Name? trong tất cả các lĩnh vực của tôi. Tôi bối rối. – HK1

4

Lưu ý: Tôi đã có thể để có được tất cả mọi thứ để làm việc một cách chính xác cùng với chèn hồ sơ mới bằng cách sử dụng ví dụ hiển thị ở trên tại Create In-Memory ADO Recordsets Sau đó thay đổi sau để mã hình thức ... 'Lưu ý: Bí quyết là để sử dụng rstADO.MoveFirst & rstADO.MoveLast sau 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 
Các vấn đề liên quan