Set the RecordSource for a Form to the result of an ADODB RecordSet

We have a subroutine which returns an ADODB RecordSet and we can successfully use this to populate a Combobox
We also need to use similar logic to use the ADODB record set as the RecordSource for a Form.

When we use "Set Me.RecordSource = RecSet" we get  an error message "Invalid Use of Property"

When we use "Me.RecordSource = RecSet" we get  an error message "Type Mismatch"

When we use "Set Me.RecordSet = RecSet" we get  an error message "7965 The object you entered is not a valid recordset property"

When we use "Me.RecordSet = RecSet" we get  an error message "91 Object variable or With block variable not set"

Please can somebody tell me what we are missing what are we missing.

The attached Code snippets show the Subroutine and the Form  logic which works when populating the
Combo Box.

Form Open
Private Sub Form_Open(Cancel As Integer)
On Error GoTo Err_Open
Dim recset As ADODB.Recordset
Set recset = New ADODB.Recordset
strStreetType = "A"
recset.Open cmdStoredProc2("uspShowStreets", strStreetType, adVarWChar)
With recset
     Do Until .EOF
        cmbTest.AddItem !StreetType & ";" & !Abbreviation & ";" & !SortSequence
End With
Set recset = Nothing
    Exit Sub
    If Err.Number = 3021 Then
        MsgBox "No records found"
        MsgBox Err.Number & " " & Err.Description
    End If
    'Resume Exit_Open
End Sub
Public Function cmdStoredProc2(ParamArray avar() As Variant) As ADODB.Command
Dim prm As ADODB.Parameter
Dim lngElements As Long
Dim i As Long
Dim iCount As Integer
On Error GoTo HandleErr
i = 0
lngElements = UBound(avar())
If lngElements > 1 Then
    If Not (lngElements Mod 2) Then
        Set cmdStoredProc2 = New ADODB.Command
        With cmdStoredProc2
            .ActiveConnection = msSQLProvider & msSQLConnection
            .CommandText = CStr(avar(0))
            .CommandType = adCmdStoredProc
                For i = 0 To lngElements / 2 - 1
                    Set prm = .CreateParameter("Param" & _
                    CStr(i + 1), _
                    CInt(avar(2 * i + 2)), adParamInput, _
                    Len(avar(2 * i + 1)), avar(2 * i + 1))
                    .Parameters.Append prm
                Next i
      End With
    End If
    MsgBox "You must supply at least 2 paramters, SP Name and Reply Type", vbCritical
    GoTo End_Function
End If
GoTo End_Function
   MsgBox Err.Description
   iCount = -1
End Function

Open in new window

Who is Participating?
Scott McDaniel (Microsoft Access MVP - EE MVE )Infotrakker SoftwareCommented:
This is, apparently, coming from a Server. If that's the case, the following requirements must be met:

1. The underlying ADO recordset must be updateable.
2. The recordset must contain one or more fields that are uniquely indexed, such as a table's primary key.

In specific regard to SQL Server:

• The ADO recordset's connection must use the Microsoft Access 10.0 OLEDB provider as its service provider.
• The ADO recordset's connection must use the Microsoft SQL Server OLEDB provider as its data provider.

Since you're doing this with a Stored Procedure, you might not be able to do this.

Info came from here:
CABHughAuthor Commented:
Thank you for such a rapid response.

The first column is the primary key (street type).

I am checking out the other factors you suggest.


Form.Recordsource is a string which the form evaluates to a datasource itself.
You can set the Form.Recordset property to a recordset object, but this must be a DAO.Recordset object of appropriate type.
(things may be different on various MS Access versions)

following will work:
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM MyTbl", DAO.dbOpenDynaset)
Set rs = CurrentDb.OpenRecordset("MyTbl", DAO.dbOpenSnapshot)
Set Me.Recordset = rs

Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

The correct assignment to use is
Set Me.Recordset = RecSet
The updateable recordset and unique index restrictions only apply if you want to update data through the form.
What version of Access are you using and what type of Server your ADO recordsets are coming from?
CABHughAuthor Commented:

Thank you for your input.  We are using ADODB to follow Microsoft's recommendations to move away from DAO.
We have used Set Me.Recordset = RecSet (where the RecSet is from DAODB but we get one of the errors I listed initially.
We are running SQL Server 2005 with Access 2003.
I am sure things should not be this complex........


Can you post the code that sets the connection and opens the recordset you're trying to allocate to the form.
(btw, with the release of Access 2007 I think that the word from MS is that DAO is back in fashion, lol)
CABHughAuthor Commented:
I would like to thank everybody for their assistance in SOLVING this problem.

The solution turned out to be the requirement to include  a reference to the Data Provider "Microsoft.Access.OLEDB10.0".

Once this was changed, the "Set Me.Recordset = Recset" worked and the data appeared in the form.

Many thanks again.

CABHughAuthor Commented:
Many Thanks.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.