2012-07-30 157 views
0

記錄數據我該怎麼讓一個SQL查詢的結果在Access子窗體控件?我想下面的代碼如何顯示在MS Access窗體

Dim db As DAO.Database 
Dim rs As DAO.Recordset 
Set db = CurrentDb 
Dim qry As String 

qry = "SELECT FirstName,Email FROM Customer" ' 
Set rs = db.OpenRecordset(qry) 

Customer_enquiry_subform.Form.Recordset = rs 

哪裏Customer_enquiry_subform是我的子窗體的名稱。我只有2列在我的子窗體顯示,名字,電子郵件

它扔我一個錯誤

運行時錯誤3251:操作不支持此類型 對象。

有人能告訴我什麼,我做錯了什麼?

回答

1

如果你想設置一個窗體的記錄源的記錄,你需要使用ADO。不過,我懷疑你的意思是:

qry = "SELECT FirstName,Email FROM Customer" 
Me.Customer_enquiry_subform.Form.Recordsource = qry 

換句話說,你不需要記錄集,只需將記錄源設置爲字符串。

2

我知道這個問題爲2歲,但對於我們這些誰絆倒它,並希望使用一個SQL查詢訪問窗體控件​​(許多SQL查詢/存儲過程實在太複雜,擺在表格記錄源)...我發現ADO工作得很好。請參閱http://support.microsoft.com/kb/281998/EN-US/以獲得很好的解釋。爲了讓這個工作在一個子表單上,我把代碼放在子表單的「打開」事件上 - 而不是表單的。

一個值得注意的是,子窗體將不綁定到主窗體(父/子丟失),所以你將不得不依靠其他的代碼添加新記錄,我相信。我的特定子窗體是隻讀的,所以它不需要是父/子 - 我使用主窗體中的記錄ID作爲參數,當我調用存儲過程來重新創建父/子效果時(請參閱下面的代碼)。

此外,如果您未指定LockType adLockPessimistic或adLockOptimisic,則此代碼將不起作用:adLockReadOnly不起作用(請參閱In Memory, Stand-Alone, Disconnected ADO Recordset)。您將收到錯誤「該對象不是有效的Recordset屬性」,這可能會導致一些頭痛。 :)

我的示例代碼(我使用https://accessexperts.com/blog/2011/01/21/easy-adodb-recordsets-and-commands-in-access/胡安·索托的普遍ADO連接爲例):

Private Sub Form_Open(Cancel As Integer) 
    On Error GoTo ErrHandler 
    Dim rs As ADODB.Recordset 
    Dim strSQL As String 
    Dim strPoint As String 

    'I use my Point_ID from my main form as a parameter to fill the subform to recreate the "parent/child" effect 
    strPoint = Forms!FRM_Vegetation_Strata!Point_ID 
    strSQL = "sp_Report_VegWorksheet '" & strPoint & "'" 

    'this method of calling the sub "OpenMyRecordset" is from Soto's example listed above 
    OpenMyRecordset rs, strSQL, rrOpenStatic, rrLockOptimistic, True 
    With rs 
    If .RecordCount = 0 Then 
    MsgBox "No records returned" 
    End If 
    End With 

    Set Me.Recordset = rs 


ExitProcedure: 
    On Error Resume Next 
    Exit Sub 

ErrHandler: 
    MsgBox Err.Description & " (" & Err.Number & ") encountered", vbOKOnly + vbCritical, "InitConnect" 
    Resume ExitProcedure 

    Resume 
End Sub 

要刷新子窗體時,主窗體的數據發生變化:

Private Sub cmdRefresh_Click() 
Me.Form.Recordset.Requery 
Set Me.Form.Recordset = Me.Form.Recordset 
End Sub 

而且當窗體關閉(的「在關閉」事件窗體)

Private Sub Form_Unload(Cancel As Integer) 
    'Close the ADO connection we opened 
    On Error Resume Next 
    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 

    Set cn = Me.Recordset.ActiveConnection 
    If cn.State = adStateOpen Then 
    cn.Close 
    End If 

    Set cn = Nothing 
    Set rs = Nothing 
    Set Me.Recordset = Nothing 

End Sub