--- title: "What the Driver Manager Does | Microsoft Docs" ms.custom: "" ms.date: "01/19/2017" ms.prod: sql ms.prod_service: connectivity ms.reviewer: "" ms.technology: connectivity ms.topic: conceptual helpviewer_keywords: - "driver manager [ODBC], backward compatibility" - "compatibility [ODBC], driver manager" - "ODBC driver manager [ODBC]" - "backward compatibility [ODBC], driver manager" ms.assetid: 57f65c38-d9ee-46c8-9051-128224a582c6 author: David-Engel ms.author: v-daenge --- # What the Driver Manager Does The following table summarizes how the ODBC *3.x* Driver Manager maps calls to ODBC *2.x* and ODBC *3.x* drivers. |Function or

statement attribute|Comments| |-----------------------------------------|--------------| |SQL_ATTR_FETCH_BOOKMARK_PTR|Points to the bookmark to use with **SQLFetchScroll**. The following are implementation details:

- When an application sets this in an ODBC *2.x* driver, the ODBC *3.x* Driver Manager caches it. It dereferences the pointer and passes the value to the ODBC *2.x* driver in the *FetchOffset* argument of **SQLExtendedFetch** when **SQLFetchScroll** is later called by the application.
- When an application sets this in an ODBC *3.x* driver, the ODBC *3.x* Driver Manager passes the call to the driver.| |SQL_ATTR_ROW_STATUS_PTR|Points to the row status array filled by **SQLFetch**, **SQLFetchScroll**, **SQLBulkOperations**, and **SQLSetPos**. The following are implementation details:

- When an application sets this in an ODBC *2.x* driver, the ODBC *3.x* Driver Manager caches its value. It passes this value to the ODBC *2.x* driver in the *RowStatusArray* argument of **SQLExtendedFetch** when **SQLFetchScroll** or **SQLFetch** is called.
- When an application sets this in an ODBC *3.x* driver, the ODBC *3.x* Driver Manager passes the call to the driver.
- In state S6, if an application sets SQL_ATTR_ROW_STATUS_PTR and then calls **SQLBulkOperations** (with an *Operation* of SQL_ADD) or **SQLSetPos** without first calling **SQLFetch** or **SQLFetchScroll**, SQLSTATE HY011 (Attribute cannot be set now) is returned.| |SQL_ATTR_ROWS_FETCHED_PTR|Points to the buffer in which **SQLFetch** and **SQLFetchScroll** return the number of rows fetched. The following are implementation details:

- When an application sets this in an ODBC *2.x* driver, the ODBC *3.x* Driver Manager caches its value. It passes this value to the ODBC *2.x* driver in the *RowCountPtr* argument of **SQLExtendedFetch** when **SQLFetch** or **SQLFetchScroll** is called by the application.
- When an application sets this in an ODBC *3.x* driver, the ODBC *3.x* Driver Manager passes the call to the driver.| |SQL_ATTR_ROW_ARRAY_SIZE|Sets the rowset size. The following are implementation details:

- When an application sets this in an ODBC *2.x* driver, the ODBC *3.x* Driver Manager maps it to the SQL_ROWSET_SIZE statement attribute.
- When an application sets this in an ODBC *3.x* driver, the ODBC *3.x* Driver Manager passes the call to the driver.
- When an application working with an ODBC *3.x* driver calls **SQLSetScrollOptions**, SQL_ROWSET_SIZE is set to the value in the *RowsetSize* argument if the underlying driver does not support **SQLSetScrollOptions**.| |SQL_ROWSET_SIZE|Sets the rowset size used by **SQLExtendedFetch** when **SQLExtendedFetch** is called by an ODBC *2.x* application. The following are implementation details:

- When an application sets this, the ODBC *3.x* Driver Manager passes the call to the driver, regardless of driver version.
- When an application working with an ODBC *2.x* driver calls **SQLSetScrollOptions**, SQL_ROWSET_SIZE is set to the value in the **RowsetSize** argument.| |**SQLBulkOperations**|Performs an insert operation, or update, delete, or fetch by bookmark operations. The following are implementation details:

- When an application calls **SQLBulkOperations** with an *Operation* of SQL_ADD in an ODBC *2.x* driver, the ODBC *3.x* Driver Manager maps it to **SQLSetPos** with an *Operation* of SQL_ADD.
- When working with an ODBC *2.x* driver that does not support **SQLSetPos** with an *Operation* of SQL_ADD, the ODBC *3.x* Driver Manager does not map **SQLSetPos** with an *Operation* of SQL_ADD to **SQLBulkOperations** with an *Operation* of SQL_ADD. This is because **SQLBulkOperations** cannot be called in state S7, which in ODBC *2.x* was the only state in which **SQLSetPos** could be called.
- If the application calls **SQLBulkOperations** with an *Operation* of SQL_ADD in an ODBC *2.x* driver before calling **SQLFetchScroll**, the ODBC *3.x* Driver Manager returns an error.| |**SQLExtendedFetch**|Returns the specified rowset. Except for the restriction just noted, the ODBC *3.x* Driver Manager passes calls to **SQLExtendedFetch** to the driver, regardless of the driver version.| |**SQLFetch**|Returns the next rowset. The following are implementation details:

- When an application calls **SQLFetch** in an ODBC *2.x* driver, the ODBC *3.x* Driver Manager maps it to **SQLExtendedFetch**. The *FetchOrientation* argument of **SQLExtendedFetch** is set to SQL_FETCH_NEXT. The Driver Manager uses the cached value of the SQL_ATTR_ROW_STATUS_PTR statement attribute for the *RowStatusArray* argument and the cached value of the SQL_ATTR_ROWS_FETCHED_PTR statement attribute for the *RowCountPtr* argument.
- An ODBC *3.x* application can mix calls to **SQLFetch** and **SQLFetchScroll** in an ODBC *2.x* driver because the ODBC *3.x* Driver Manager maps **SQLFetch** to **SQLExtendedFetch** when an application calls it in an ODBC *2.x* driver.
- If an ODBC *2.x* driver does not support **SQLExtendedFetch**, the ODBC *3.x* Driver Manager does not map **SQLFetch** or **SQLFetchScroll** to **SQLExtendedFetch** when an application calls it in that driver. If the application attempts to set SQL_ATTR_ROW_ARRAY_SIZE to a value greater than 1, SQLSTATE HYC00 (Optional feature not implemented) is returned.
- Except for the restrictions just noted, the ODBC *3.x* Driver Manager passes calls to **SQLFetch** to the driver, regardless of the driver version.| |**SQLFetchScroll**|Returns the specified rowset. The following are implementation details:

- When an application calls **SQLFetchScroll** in an ODBC *2.x* driver, the ODBC *3.x* Driver Manager maps it to **SQLExtendedFetch**. It uses the cached value of the SQL_ATTR_ROW_STATUS_PTR statement attribute for the *RowStatusArray* argument and the cached value of the SQL_ATTR_ROWS_FETCHED_PTR statement attribute for the *RowCountPtr* argument. If the *FetchOrientation* argument in **SQLFetchScroll** is SQL_FETCH_BOOKMARK, it uses the cached value of the SQL_ATTR_FETCH_BOOKMARK_PTR statement attribute for the *FetchOffset* argument and returns an error if the *FetchOffset* argument of **SQLFetchScroll** is not 0.
- When an application calls this in an ODBC *3.x* driver, the ODBC *3.x* Driver Manager passes the call to the driver.| |**SQLSetPos**|Performs various positioned operations. The ODBC *3.x* Driver Manager passes calls to **SQLSetPos** to the driver, regardless of the driver version.| |**SQLSetScrollOptions**|When the Driver Manager maps **SQLSetScrollOptions** for an application working with an ODBC *3.x* driver that does not support **SQLSetScrollOptions**, the Driver Manager sets the SQL_ROWSET_SIZE statement option, not the SQL_ATTR_ROW_ARRAY_SIZE statement attribute, to the *RowsetSize* argument in **SQLSetScrollOption**. As a result, **SQLSetScrollOptions** cannot be used by an application when fetching multiple rows by a call to **SQLFetch** or **SQLFetchScroll**. It can be used only when fetching multiple rows by a call to **SQLExtendedFetch**.|