[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1116
  • Last Modified:

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
     .MoveFirst
     Do Until .EOF
        cmbTest.AddItem !StreetType & ";" & !Abbreviation & ";" & !SortSequence
        .MoveNext
     Loop
End With
 
Me.cmbTest.SetFocus
  
recset.Close
Set recset = Nothing
 
Exit_Open:
    Exit Sub
 
Err_Open:
    If Err.Number = 3021 Then
        MsgBox "No records found"
    Else
        MsgBox Err.Number & " " & Err.Description
    End If
    
    'Resume Exit_Open
 
End Sub
 
'---------------------------------------
'Subroutine
'---------------------------------------
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
Else
    MsgBox "You must supply at least 2 paramters, SP Name and Reply Type", vbCritical
    GoTo End_Function
End If
 
GoTo End_Function
 
HandleErr:
   MsgBox Err.Description
   iCount = -1
 
End_Function:
End Function

Open in new window

0
CABHugh
Asked:
CABHugh
1 Solution
 
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: http://support.microsoft.com/kb/281998
0
 
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.

Roy

0
 
inoxCommented:
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


0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
MikeTooleCommented:
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?
0
 
CABHughAuthor Commented:
Mike,

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........

Regards

Roy
0
 
MikeTooleCommented:
Roy
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)
0
 
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.

Roy
0
 
CABHughAuthor Commented:
Many Thanks.

0

Featured Post

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now