--- title: "Writing ODBC 3.x Drivers | 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: - "upgrading drivers [ODBC]" - "ODBC drivers [ODBC], upgrading" - "backward compatibility [ODBC], drivers" - "compatibility [ODBC], drivers" ms.assetid: 9b75f59b-623f-4711-9ca2-e751b3622e00 author: David-Engel ms.author: v-daenge --- # Writing ODBC 3.x Drivers The following table shows function support in an ODBC 3.*x* driver and an ODBC application, and the mapping performed by the Driver Manager when the functions are called against an ODBC 3.*x* driver. |Function|Supported

by an

ODBC 3.*x*

driver?|Supported

by an

ODBC 3.*x*

application?|Mapped/supported

by the ODBC 3.*x*

Driver Manager to

an ODBC 3.*x* driver?| |--------------|----------------------------------------------------|---------------------------------------------------------|---------------------------------------------------------------------------------------------| |**SQLAllocConnect**|No|No[1]|Yes| |**SQLAllocEnv**|No|No[1]|Yes| |**SQLAllocHandle**|Yes|Yes|No| |**SQLAllocStmt**|No|No[1]|Yes| |**SQLBindCol**|Yes|Yes|No| |**SQLBindParam**|No|Yes[2]|Yes| |**SQLBindParameter**|Yes|Yes|No| |**SQLBrowseConnect**|Yes|Yes|No| |**SQLBulkOperations**|Yes|Yes|No| |**SQLCancel**|Yes|Yes|No| |**SQLCloseCursor**|Yes|Yes|No| |**SQLColAttribute**|Yes|Yes|No| |**SQLColAttributes**|No[3]|No|Yes| |**SQLColumnPrivileges**|Yes|Yes|No| |**SQLColumns**|Yes|Yes|No| |**SQLConnect**|Yes|Yes|No| |**SQLCopyDesc**|Yes|Yes|Yes[4]| |**SQLDataSources**|No|Yes|Yes| |**SQLDescribeCol**|Yes|Yes|No| |**SQLDescribeParam**|Yes|Yes|No| |**SQLDisconnect**|Yes|Yes|No| |**SQLDriverConnect**|Yes|Yes|No| |**SQLDrivers**|No|Yes|Yes| |**SQLEndTran**|Yes|Yes|No| |**SQLError**|No|No[1]|Yes| |**SQLExecDirect**|Yes|Yes|No| |**SQLExecute**|Yes|Yes|No| |**SQLExtendedFetch**|Yes|No|No| |**SQLFetch**|Yes|Yes|No| |**SQLFetchScroll**|Yes|Yes|No| |**SQLForeignKeys**|Yes|Yes|No| |**SQLFreeConnect**|No|Yes[1]|Yes| |**SQLFreeEnv**|No|Yes[1]|Yes| |**SQLFreeHandle**|Yes|Yes|No| |**SQLFreeStmt**|Yes|Yes|No| |**SQLGetConnectAttr**|Yes|Yes|No| |**SQLGetConnectOption**|No[5]|No[1]|Yes| |**SQLGetCursorName**|Yes|Yes|No| |**SQLGetData**|Yes|Yes|No| |**SQLGetDescField**|Yes|Yes|No| |**SQLGetDescRec**|Yes|Yes|No| |**SQLGetDiagField**|Yes|Yes|No| |**SQLGetDiagRec**|Yes|Yes|No| |**SQLGetEnvAttr**|Yes|Yes|No| |**SQLGetFunctions**|No[6]|Yes|Yes| |**SQLGetInfo**|Yes|Yes|No| |**SQLGetStmtAttr**|Yes|Yes|No| |**SQLGetStmtOption**|No[5]|No[1]|Yes| |**SQLGetTypeInfo**|Yes|Yes|No| |**SQLMoreResults**|Yes|Yes|No| |**SQLNativeSql**|Yes|Yes|No| |**SQLNumParams**|Yes|Yes|No| |**SQLNumResultCols**|Yes|Yes|No| |**SQLParamData**|Yes|Yes|No| |**SQLParamOptions**|No|No|Yes| |**SQLPrepare**|Yes|Yes|No| |**SQLPrimaryKeys**|Yes|Yes|No| |**SQLProcedureColumns**|Yes|Yes|No| |**SQLProcedures**|Yes|Yes|No| |**SQLPutData**|Yes|Yes|No| |**SQLRowCount**|Yes|Yes|No| |**SQLSetConnectAttr**|Yes|Yes|No| |**SQLSetConnectOption**|No[5]|No[1]|Yes| |**SQLSetCursorName**|Yes|Yes|No| |**SQLSetDescField**|Yes|Yes|No| |**SQLSetDescRec**|Yes|Yes|No| |**SQLSetEnvAttr**|Yes|Yes|No| |**SQLSetPos**|Yes|Yes|No| |**SQLSetParam**|No|No|Yes| |**SQLSetScrollOption**|Yes|Yes|No| |**SQLSetStmtAttr**|Yes|Yes|No| |**SQLSetStmtOption**|No[5]|No[1]|Yes| |**SQLSpecialColumns**|Yes|Yes|No| |**SQLStatistics**|Yes|Yes|No| |**SQLTablePrivileges**|Yes|Yes|No| |**SQLTables**|Yes|Yes|No| |**SQLTransact**|No|No[1]|Yes| [1] This function is deprecated in ODBC 3.*x*. ODBC 3.*x* applications should not use this function. However, an Open Group or ISO CLI-compliant application can call this function. [2] ODBC 3.*x* applications should use **SQLBindParameter** instead of **SQLBindParam**. However, an Open Group or ISO CLI-compliant application can call this function. [3] Driver writers should note that the ODBC 2.*x* column attributes SQL_COLUMN_PRECISION, SQL_COLUMN_SCALE, and SQL_COLUMN_LENGTH must be supported with **SQLColAttribute**. [4] **SQLCopyDesc** is partially implemented by the Driver Manager when a descriptor is being copied across connections that belong to different drivers. Drivers are required to support **SQLCopyDesc** across two of their own connections. Functions such as **SQLDrivers**, which are implemented solely by the Driver Manager, do not show up on this list. [5] Under certain circumstances, drivers may need to support this function. For more information, see this function's reference page. [6] The driver can choose to support **SQLGetFunctions** if the set of functions that the driver supports varies from connection to connection.