Created On:  13 July 2012

Problem:

Created an application using Visual COBOL R3 that used the EXEC ADO GET CURSOR statement to retrieve a dataset object from a SQL SELECT CURSOR in order to bind the object to a DataGridView Control.

This worked fine in Visual COBOL R3.
When runnimng the same application in Visual COBOL 2.0 an error now occurs on the EXEC SQL GET CURSOR statement.
The sqlcode is 19501 and the error is "Invalid Cursor State"

The following demo was used.
The demo uses 32-bit ADO connection mapped to the Northwind database.
It has a form with a datagridView control on it which is bound to a table within an ADO.NET dataset object.
The dataset object is returned using:

EXEC SQL
       DECLARE drcursor scroll CURSOR FOR SELECT
                A.CustomerID
               ,A.CompanyName
               ,A.ContactName
             FROM Customers A
           END-EXEC
           EXEC SQL
              OPEN drcursor
           END-EXEC
           exec ado get cursor drcursor into :lsCursorObj 
                rename datatable as "Customers" 
           end-exec

This used to work under R3 but now it the dataset is not being populated with any tables.

When this is executed under VC 2.0 and the RENAME phrase is used it fails with 19501 invalid cursor state.
If the RENAME DATATABLE clause is removed then it executes OK but there is no table in the dataset so the binding fails.

What is the problem?

Resolution:

The problem has been fixed in Visual COBOL 2.1.

The problem is that the OpenESQL run-time has been optimized in Visual COBOL 2.0 so that instead of a dataset being returned it will return a dataReader object instead.

From Development:

Applications migrating from earlier versions of Visual COBOL or from other products that support ADO.NET that use Microsoft SQL Server and depend on cursors that are not explicitly declared as forward only, read only being implemented as ADO.NET datasets must use the directive SQL(BEHAVIOR=UNOPTIMIZED) or update their code to declare cursors using the scrolloption 'dataset' that require a dataset-based cursor. This is because in Visual COBOL and Enterprise Developer 2.0 and later, the default setting of  SQL(BEHAVIOR) is MAINFRAME.  

Incident #2582082