Microsoft KB Archive/154825

= How To Extract Multiple RDO Resultsets from Stored Procedures =

Article ID: 154825

Article Last Modified on 7/1/2004

-

APPLIES TO


 * Microsoft Visual Basic 6.0 Learning Edition
 * Microsoft Visual Basic 6.0 Professional Edition
 * Microsoft Visual Basic 6.0 Enterprise Edition
 * Microsoft Visual Basic 5.0 Professional Edition
 * Microsoft Visual Basic 5.0 Enterprise Edition
 * Microsoft Visual Basic 4.0 32-Bit Enterprise Edition

-



This article was previously published under Q154825



SUMMARY
SQL Server stored procedures are capable of returning more than one recordset and the Remote Data Object (RDO) has the ability to access these Multiple Resultsets.

When calling these stored procedures, the following error can be encountered:

Error 40002

"37000: [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot open a cursor on a stored procedure that has anything other than a single

select statement in it"

The following code sample showing how to return the multiple Resultsets using the MoreResults Property of the RDO.



MORE INFORMATION
There are two methods to avoid Error 40002.

Method 1
Use The ODBC Cursor library rather than Server Side Cursors. To do this, use the following code: rdoEngine. rdoDefaultCursorDriver = rdUseODBC

- or -

rdoEnvironments(0).CursorDriver = rdUseOdbc This option gives better performance for small result sets, but may degrade quickly for larger result sets depending on the Server and workstation configuration.

NOTE: If you are using SQL text fields, you must use Server-side cursors to bypass Error 40002"

Method 2
Use Server Side Cursors, a Forward Only Cursor, and a rowset size of 1. Make the server create a cursor-less resultset on the server side by using a forward only cursor and a RowSetSize of 1.

The following code sample illustrates how to create a stored procedure that returns multiple result sets using method 2.  Create the stored procedure on SQL Server:

 Start the ISQL utility that shipped with SQL server. Connect to your SQL server. Select the pubs database from the combo box labeled DB.  Enter the following lines into the Query Tab: CREATE PROCEDURE TestMultiResults AS     select * from authors select * from discounts GO                                Choose the Query|Execute menu. The Results tab should display:

This command did not return data, and it did not return any rows

A stored procedure called TestMultiResults has now been created in the pubs database on SQL Server.</ol> </li> Create the Visual Basic client to call the stored procedure:

<ol style="list-style-type: lower-alpha;"> Start Visual Basic. Form1 is created by default.</li> Add a Command Button (Command1) and a List Box (List1) to Form1.</li>  Add the following code to Form1: Private Sub Form_Load Command1.Caption = "Run Stored Procedure" End Sub

Private Sub Command1_Click Dim cn As rdoConnection Dim ps As rdoPreparedStatement Dim rs As rdoResultset Dim strConnect As String 'set cursor driver to use server-side cursors rdoDefaultCursorDriver = rdUseServer

'open a connection to the pubs database using DSNless connections 'Remember to change the following connection string parameters to reflect the correct values

strConnect = "Driver={SQL Server}; Server=myServer; " & _ "Database=pubs; Uid= ; Pwd= " Set cn = rdoEnvironments(0).OpenConnection(dsName:="", _                                             Prompt:=rdDriverNoPrompt, _                                              ReadOnly:=False, _                                              Connect:=strConnect)

'create a prep stmt for the stored proc call Set ps = cn.CreatePreparedStatement("MyPs", _                                           "{call TestMultiResults}") 'set the RowSet size to 1 ps.RowsetSize = 1

'open the resultset with forward-only cursor Set rs = ps.OpenResultset(rdOpenForwardOnly)

'add the first resultset to a list box While Not rs.EOF list1.AddItem rs("au_fname") & " " & rs("au_lname") rs.MoveNext Wend

'move to the second resultset rs.MoreResults list1.AddItem "Second Resultset Below" 'add the second resultset to the same list box While Not rs.EOF list1.AddItem rs("discounttype") & " = " & rs("discount") rs.MoveNext Wend

'Close the resultset and the connection and set both to nothing rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub </li> Run the project and click the "Run Stored Procedure" button. You should see a list of Authors and then Discounts in the list box.</li></ol> </li></ol>

<div class="references_section">