通过 ODBC 3.x 驱动程序管理器工作的 ODBC 3.x 应用程序将适用于 ODBC 2.x 驱动程序,只要未使用新功能。 但是,重复的功能和行为更改都会影响 ODBC 3.x 应用程序在 ODBC 2.x 驱动程序上工作的方式。 使用 ODBC 2.x 驱动程序时,驱动程序管理器会将以下 ODBC 3.x 函数(已替换一个或多个 ODBC 2.x 函数)映射到相应的 ODBC 2.x 函数中。
| ODBC 3.x 函数 | ODBC 2.x 函数 |
|---|---|
| SQLAllocHandle | SQLAllocEnv、 SQLAllocConnect 或 SQLAllocStmt |
| SQLBulkOperations | SQLSetPos |
| SQLColAttribute | SQLColAttributes |
| SQLEndTran | SQLTransact |
| SQLFetch | SQLExtendedFetch |
| SQLFetchScroll | SQLExtendedFetch |
| SQLFreeHandle | SQLFreeEnv、 SQLFreeConnect 或 SQLFreeStmt |
| SQLGetConnectAttr | SQLGetConnectOption |
| SQLGetDiagRec | SQLError |
| SQLGetStmtAttr | SQLGetStmtOption[1] |
| SQLSetConnectAttr | SQLSetConnectOption |
| SQLSetStmtAttr | SQLSetStmtOption[1] |
[1] 还可以执行其他操作,这取决于所请求的属性。
SQLAllocHandle
驱动程序管理器会根据需要将此映射到 SQLAllocEnv、 SQLAllocConnect 或 SQLAllocStmt。 对 SQLAllocHandle 的以下调用:
SQLAllocHandle(HandleType, InputHandle, OutputHandlePtr);
将导致驱动程序管理器执行以下(概念性、无错误检查)映射:
switch (HandleType) {
case SQL_HANDLE_ENV: return (SQLAllocEnv(OutputHandlePtr));
case SQL_HANDLE_DBC: return (SQLAllocConnect (InputHandle, OutputHandlePtr));
case SQL_HANDLE_STMT: return (SQLAllocStmt (InputHandle, OutputHandlePtr));
default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")
}
SQLBulkOperations
驱动程序管理器将此映射到 SQLSetPos。 对 SQLBulkOperations 的以下调用:
SQLBulkOperations(hstmt, Operation);
将生成以下步骤序列:
如果 Operation 参数SQL_ADD,驱动程序管理器将调用 SQLSetPos ,如下所示:
SQLSetPos (hstmt, 0, SQL_ADD, SQL_LOCK_NO_CHANGE);如果 Operation 参数不是 SQL_ADD,驱动程序将返回 SQLSTATE HY092(属性/选项标识符无效)。
如果应用程序尝试更改对 SQLFetch 或 SQLFetchScroll 和 SQLBulkOperations 的调用之间的SQL_ATTR_ROW_STATUS_PTR,驱动程序管理器将返回 SQLSTATE HY011(现在无法设置属性)。
如果 Operation 参数SQL_ADD,应用程序必须调用 SQLBindCol 以绑定要插入的数据。 它无法调用 SQLSetDescField 或 SQLSetDescRec 来绑定要插入的数据。
如果 Operation 参数SQL_ADD且要插入的行数与当前行集大小不同,则必须调用 SQLSetStmtAttr ,才能将 SQL_ATTR_ROW_ARRAY_SIZE 语句属性设置为在调用 SQLBulkOperations 之前要插入的行数。 若要还原回以前的行集大小,应用程序必须在调用 SQLFetch、SQLFetchScroll 或 SQLSetPos 之前设置SQL_ATTR_ROW_ARRAY_SIZE语句属性。
SQLColAttribute
驱动程序管理器将此映射到 SQLColAttributes。 对 SQLColAttribute 的以下调用:
SQLColAttribute(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);
将生成以下步骤序列:
如果 FieldIdentifier 是下列项之一:
SQL_DESC_PRECISION、SQL_DESC_SCALE、SQL_DESC_LENGTH、SQL_DESC_OCTET_LENGTH、SQL_DESC_UNNAMED、SQL_DESC_BASE_COLUMN_NAME、SQL_DESC_LITERAL_PREFIX、SQL_DESC_LITERAL_SUFFIX或SQL_DESC_LOCAL_TYPE_NAME
驱动程序管理器使用 SQLSTATE HY091 返回SQL_ERROR(描述符字段标识符无效)。 本部分的进一步规则不适用。
这个驱动程序管理器将SQL_COLUMN_COUNT、SQL_COLUMN_NAME或SQL_COLUMN_NULLABLE分别映射到SQL_DESC_COUNT、SQL_DESC_NAME或SQL_DESC_NULLABLE。 (ODBC 2.x 驱动程序只需要支持SQL_COLUMN_COUNT、SQL_COLUMN_NAME和SQL_COLUMN_NULLABLE,而不是SQL_DESC_COUNT、SQL_DESC_NAME和SQL_DESC_NULLABLE。对 SQLColAttribute 的调用映射到:
SQLColAttributes(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);所有其他 FieldIdentifier 值都传递给驱动程序, SQLColAttribute 映射到 SQLColAttributes ,如前所示。
如果 BufferLength 小于 0,驱动程序管理器将返回具有 SQLSTATE HY090(字符串或缓冲区长度无效)的SQL_ERROR。 本部分的进一步规则不适用。
如果 FieldIdentifier 为SQL_DESC_CONCISE_TYPE并且返回的类型是简洁的日期/时间数据类型,驱动程序管理器将映射日期、时间和时间戳代码的返回值。
驱动管理器执行必要的检查,以确定是否需要引发 SQLSTATE HY010(函数序列错误)。 如果是,驱动程序管理器将返回SQL_ERROR和 SQLSTATE HY010(函数序列错误)。 本部分的进一步规则不适用。
SQLEndTran
驱动程序管理器将此映射到 SQLTransact。 对 SQLEndTran 的以下调用:
SQLEndTran(HandleType, Handle, CompletionType);
将导致驱动程序管理器执行以下(概念性、无错误检查)映射:
switch (HandleType) {
case SQL_HANDLE_ENV:return(SQLTransact(Handle, SQL_NULL_HDBC, CompletionType));
case SQL_HANDLE_DBC:return(SQLTransact(SQL_NULL_HENV, Handle, CompletionType);
default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")
}
SQLFetch
驱动程序管理器使用 fetchOrientation 参数将此属性映射到 SQLExtendedFetch,该参数为 SQL_FETCH_NEXT。 对 SQLFetch 的以下调用:
SQLFetch (StatementHandle);
将导致驱动程序管理器调用 SQLExtendedFetch,如下所示:
rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, &RowCount, RowStatusArray);
在此调用中, pcRow 参数设置为应用程序通过调用 SQLSetStmtAttr 将 SQL_ATTR_ROWS_FETCHED_PTR 语句属性设置为的值。
注释
当应用程序调用 SQLSetStmtAttr 以将SQL_ATTR_ROW_STATUS_PTR设置为指向状态数组时,驱动程序管理器将缓存指针。 RowStatusArray 可以等于 null 指针。
如果驱动程序不支持 SQLExtendedFetch 并加载游标库,驱动程序管理器将使用游标库的 SQLExtendedFetch 将 SQLFetch 映射到 SQLExtendedFetch。 如果驱动程序不支持 SQLExtendedFetch ,并且游标库未加载,驱动程序管理器会将调用传递给 SQLFetch 到驱动程序。 如果应用程序调用 SQLSetStmtAttr 设置SQL_ATTR_ROW_STATUS_PTR,驱动程序管理器可确保填充数组。 如果应用程序调用 SQLSetStmtAttr 来设置SQL_ATTR_ROWS_FETCHED_PTR,驱动程序管理器会将此字段设置为 1。
SQLFetchScroll
驱动程序管理器将此映射到 SQLExtendedFetch。 对 SQLFetchScroll 的以下调用:
SQLFetchScroll(StatementHandle, FetchOrientation, FetchOffset);
将生成以下步骤序列:
当应用程序调用 SQLSetStmtAttr 以设置SQL_ATTR_ROW_STATUS_PTR(这将设置 IRD 中的SQL_DESC_ARRAY_STATUS_PTR字段)指向状态数组时,驱动程序管理器将缓存此指针。 让此指针成为 RowStatusArray;否则,请让 RowStatusArray 等于 null 指针。 如果 RowStatusArray 参数设置为 null 指针,驱动程序管理器将生成行状态数组。
如果 FetchOrientation 不是 SQL_FETCH_NEXT、SQL_FETCH_PRIOR、SQL_FETCH_ABSOLUTE、SQL_FETCH_RELATIVE、SQL_FETCH_FIRST、SQL_FETCH_LAST 或 SQL_FETCH_BOOKMARK 之一,则驱动管理器返回 SQL_ERROR 和 SQLSTATE HY106(提取范围外的类型)。 本部分的进一步规则不适用。
箱:
如果 FetchOrientation 等于 SQL_FETCH_BOOKMARK,则:
如果前面调用 了 SQLSetStmtAttr 来设置SQL_ATTR_FETCH_BOOKMARK_PTR的值,则让 Bmk 成为通过取消引用指针SQL_DESC_FETCH_BOOKMARK_PTR获取的值。
否则返回 SQL_ERROR,SQLSTATE 为 HY111(书签值无效)。 本部分的进一步规则不适用。
驱动程序管理器现在调用 SQLExtendedFetch,如下所示:
rc = SQLExtendedFetch(StatementHandle, FetchOrientation, Bmk, pcRow, RowStatusArray);否则,驱动程序管理器将调用 SQLExtendedFetch,如下所示:
rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, pcRow, RowStatusArray);在这些调用中, pcRow 参数设置为应用程序通过调用 SQLSetStmtAttr 将 SQL_ATTR_ROWS_FETCHED_PTR 语句属性设置为的值。
SQL_ATTR_ROW_ARRAY_SIZE映射到SQL_ROWSET_SIZE。
如果 rc 等于 SQL_SUCCESS 或 SQL_SUCCESS_WITH_INFO,并且 FetchOrientation 等于 SQL_FETCH_BOOKMARK 且 FetchOffset 不等于 0,则驱动程序管理器会发布警告 SQLSTATE 01S10(尝试按书签偏移量提取、忽略偏移值),并返回SQL_SUCCESS_WITH_INFO。
SQLFreeHandle
驱动程序管理器会根据需要将此映射到 SQLFreeEnv、 SQLFreeConnect 或 SQLFreeStmt 。 对 SQLFreeHandle 的以下调用:
SQLFreeHandle(HandleType, Handle);
将导致驱动程序管理器执行以下(概念性、无错误检查)映射:
switch (HandleType) {
case SQL_HANDLE_ENV: return (SQLFreeEnv(Handle));
case SQL_HANDLE_DBC: return (SQLFreeConnect(Handle));
case SQL_HANDLE_STMT: return (SQLFreeStmt(Handle, SQL_DROP));
default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")
}
SQLGetConnectAttr
驱动程序管理器将此映射到 SQLGetConnectOption。 对 SQLGetConnectAttr 的以下调用:
SQLGetConnectAttr(ConnectionHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);
将生成以下步骤序列:
如果 Attribute 不是驱动程序定义的连接或语句属性,并且不是 ODBC 2.x 中定义的属性,驱动程序管理器将返回具有 SQLSTATE HY092(属性/选项标识符无效)的SQL_ERROR。 本节中没有其他规则适用。
如果 Attribute 等于 SQL_ATTR_AUTO_IPD 或 SQL_ATTR_METADATA_ID,驱动程序管理器将返回具有 SQLSTATE HY092(属性/选项标识符无效)的SQL_ERROR。
驱动程序管理器执行必要的检查,以查看是否需要返回SQLSTATE08003(连接未打开)或SQLSTATEHY010(函数序列错误)。 如果是这样,驱动程序管理器将返回SQL_ERROR并发布相应的错误消息。 本部分的进一步规则不适用。
驱动程序管理器调用 SQLGetConnectOption ,如下所示:
SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);请注意,BufferLength 和 StringLengthPtr 被忽略。
SQLGetData
当使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序调用 COLUMNNumber 参数等于 0 的 SQLGetData 时,ODBC 3.x 驱动程序管理器会将它映射到对 SQLGetStmtOption 的调用,并将 Option 属性设置为SQL_GET_BOOKMARK。
SQLGetStmtAttr
驱动程序管理器将此映射到 SQLGetStmtOption。 对 SQLGetStmtAttr 的以下调用:
SQLGetStmtAttr(StatementHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);
将生成以下步骤序列:
如果 Attribute 不是驱动程序定义的连接或语句属性,并且不是 ODBC 2.x 中定义的属性,驱动程序管理器将返回具有 SQLSTATE HY092(属性/选项标识符无效)的SQL_ERROR。 本节中没有其他规则适用。
如果 Attribute 是下列属性之一:
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_AUTO_IPD
SQL_ATTR_ROW_BIND_TYPE
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_METADATA_ID
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PREDICATE_PTR
SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_ROW_BIND_OFFSET_PTR (行绑定偏移指针属性)
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_PARAM_OPERATION_PTR
驱动管理器返回 SQL_ERROR,SQLSTATE 为 HY092(无效的属性/选项标识符)。 本部分的进一步规则不适用。
驱动管理器执行必要的检查,以确定是否需要引发 SQLSTATE HY010(函数序列错误)。 如果是,驱动程序管理器将返回SQL_ERROR和 SQLSTATE HY010(函数序列错误)。 本部分的进一步规则不适用。
如果 Attribute 等于 SQL_ATTR_ROWS_FETCHED_PTR,驱动程序管理器将返回指向内部 Driver Manager 变量 cRow 的指针,该变量已在调用 SQLExtendedFetch 时使用或将使用该变量。 本部分的进一步规则不适用。
如果 Attribute 等于 SQL_DESC_FETCH_BOOKMARK_PTR,驱动程序管理器将返回在调用 SQLSetStmtAttr 期间缓存的相应指针。
如果 Attribute 等于 SQL_ATTR_ROW_STATUS_PTR,驱动程序管理器将返回在调用 SQLSetStmtAttr 期间缓存的相应指针。
驱动程序管理器调用 SQLGetStmtOption ,如下所示:
SQLGetStmtOption (hstmt, fOption, pvParam);其中 ,hstmt、 fOption 和 pvParam 将分别设置为 StatementHandle、 Attribute 和 ValuePtr 的值。 BufferLength 和 StringLengthPtr 被忽略。
SQLSetConnectAttr
驱动程序管理器将此映射到 SQLSetConnectOption。 对 SQLSetConnectAttr 的以下调用:
SQLSetConnectAttr(ConnectionHandle, Attribute, ValuePtr, StringLength);
将生成以下步骤序列:
如果 Attribute 不是驱动程序定义的连接或语句属性,并且不是 ODBC 2.x 中定义的属性,驱动程序管理器将返回具有 SQLSTATE HY092(属性/选项标识符无效)的SQL_ERROR。 本节中没有其他规则适用。
如果 Attribute 等于 SQL_ATTR_AUTO_IPD,驱动程序管理器将返回具有 SQLSTATE HY092(属性/选项标识符无效)的SQL_ERROR。
驱动程序管理器执行必要的检查,以查看是否需要引发 SQLSTATE 08003(连接未打开)或 SQLSTATE HY010(函数序列错误)。 如果需要引发其中一个错误,驱动程序管理器将返回SQL_ERROR并发布相应的错误消息。 本部分的进一步规则不适用。
驱动程序管理器调用 SQLSetConnectOption ,如下所示:
SQLSetConnectOption (hdbc, fOption, vParam);其中 ,hdbc、 fOption 和 vParam 将分别设置为 ConnectionHandle、 Attribute 和 ValuePtr 的值。 忽略 StringLengthPtr 。
注释
已弃用在连接级别上设置语句属性的功能。 ODBC 3.x 应用程序不应在连接级别设置语句属性。
SQLSetStmtAttr
驱动程序管理器将此映射到 SQLSetStmtOption。 对 SQLSetStmtAttr 的以下调用:
SQLSetStmtAttr(StatementHandle, Attribute, ValuePtr, StringLength);
将生成以下步骤序列:
如果 Attribute 不是驱动程序定义的连接或语句属性,并且不是 ODBC 2.x 中定义的属性,驱动程序管理器将返回具有 SQLSTATE HY092(属性/选项标识符无效)的SQL_ERROR。 本节中没有其他规则适用。
如果 Attribute 是下列属性之一:
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_AUTO_IPD
SQL_ATTR_ROW_BIND_TYPE
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_METADATA_ID
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PREDICATE_PTR
SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_ROW_BIND_OFFSET_PTR (行绑定偏移指针属性)
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_PARAM_OPERATION_PTR
驱动管理器返回 SQL_ERROR,SQLSTATE 为 HY092(无效的属性/选项标识符)。 本部分的进一步规则不适用。
驱动管理器执行必要的检查,以确定是否需要抛出 SQLSTATE HY010(函数序列错误)。 如果是,驱动程序管理器将返回SQL_ERROR和 SQLSTATE HY010(函数序列错误)。 本部分的进一步规则不适用。
如果 Attribute 等于 SQL_ATTR_PARAMSET_SIZE 或 SQL_ATTR_PARAMS_PROCESSED_PTR,请参阅本主题后面的“处理参数数组的映射”部分。 本部分的进一步规则不适用。
如果 Attribute 等于 SQL_ATTR_ROWS_FETCHED_PTR,驱动程序管理器将缓存指针值,以便稍后与 SQLFetchScroll 一起使用。
如果 Attribute 等于 SQL_ATTR_ROW_STATUS_PTR,驱动程序管理器将缓存指针值,以便稍后与 SQLFetchScroll 或 SQLSetPos 一起使用。 本部分的进一步规则不适用。
如果 Attribute 等于 SQL_ATTR_FETCH_BOOKMARK_PTR,驱动程序管理器将缓存 ValuePtr ,并在调用 SQLFetchScroll 后使用缓存的值。 本部分的进一步规则不适用。
驱动程序管理器调用 SQLSetStmtOption ,如下所示:
SQLSetStmtOption (hstmt, fOption, vParam);其中 ,hstmt、 fOption 和 vParam 将分别设置为 StatementHandle、 Attribute 和 ValuePtr 的值。 忽略 StringLength 参数。
如果 ODBC 2.x 驱动程序支持字符串、特定于驱动程序的语句选项,ODBC 3.x 应用程序应调用 SQLSetStmtOption 来设置这些选项。
处理参数数组的映射
应用程序调用时:
SQLSetStmtAttr (StatementHandle, SQL_ATTR_PARAMSET_SIZE, Size, StringLength);
驱动程序管理器调用:
SQLParamOptions (StatementHandle, Size, &RowCount);
驱动程序管理器稍后在应用程序调用 SQLGetStmtAttr 以检索SQL_ATTR_PARAMS_PROCESSED_PTR时返回指向此变量的指针。 驱动程序管理器在将语句句柄返回到已准备或分配的状态之前,无法更改此内部变量。
ODBC 3.x 应用程序可以调用 SQLGetStmtAttr 来获取SQL_ATTR_PARAMS_PROCESSED_PTR的值,即使它尚未在 APD 中显式设置SQL_DESC_ARRAY_SIZE字段。 例如,如果应用程序具有一个常规例程,用于检查 SQLExecute 返回SQL_NEED_DATA时正在处理的参数的当前“行”,则可能会出现这种情况。 无论SQL_DESC_ARRAY_SIZE是 1 还是大于 1,都调用此例程。 为此,驱动程序管理器需要定义此内部变量,无论应用程序是否调用 SQLSetStmtAttr 来设置 APD 中的SQL_DESC_ARRAY_SIZE字段。 如果未设置SQL_DESC_ARRAY_SIZE,驱动程序管理器必须确保此变量包含从 SQLExecDirect 或 SQLExecute 返回之前的值 1。
错误处理
在 ODBC 3.x 中,调用 SQLFetch 或 SQLFetchScroll 将填充 IRD 中的SQL_DESC_ARRAY_STATUS_PTR,给定诊断记录的SQL_DIAG_ROW_NUMBER字段包含此记录所对应的行集中的行数。 使用此方法,应用程序可以将错误消息与给定的行位置相关联。
ODBC 2.x 驱动程序无法提供此功能。 但是,它将提供 SQLSTATE 01S01 的错误标识(行中的错误)。 在使用 ODBC 2.x 驱动程序时使用 SQLFetch 或 SQLFetchScroll 的 ODBC 3.x 应用程序需要注意这种情况。 另请注意,此类应用程序将无法调用 SQLGetDiagField 来实际获取SQL_DIAG_ROW_NUMBER字段。 使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序只能使用 SQL_DIAG_MESSAGE_TEXT、SQL_DIAG_NATIVE、SQL_DIAG_RETURNCODE 或 SQL_DIAG_SQLSTATE 的 DiagIdentifier 参数调用 SQLGetDiagField。 ODBC 3.x 驱动程序管理器在使用 ODBC 2.x 驱动程序时维护诊断数据结构,但 ODBC 2.x 驱动程序仅返回这四个字段。
当 ODBC 2.x 应用程序使用 ODBC 2.x 驱动程序时,如果一个操作可能导致驱动程序管理器返回多个错误,ODBC 3.x 驱动程序管理器可能会返回与 ODBC 2.x 驱动程序管理器不同的错误。
书签操作的映射关系
当 ODBC 3.x 应用程序与 ODBC 2.x 驱动程序协作进行书签操作时,ODBC 3.x 驱动程序管理器将执行以下映射。
SQLBindCol
当使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序调用 SQLBindCol 以绑定到 fCType 等于 SQL_C_VARBOOKMARK 的列 0 时,ODBC 3.x 驱动程序管理器会检查 BufferLength 参数是否小于 4 或大于 4,如果是,则返回 SQLSTATE HY090(字符串或缓冲区长度无效)。 如果 BufferLength 参数等于 4,驱动程序管理器在将 fCType 替换为SQL_C_BOOKMARK后,在驱动程序中调用 SQLBindCol。
SQLColAttribute
当使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序调用 SQLColAttribute 且 ColumnNumber 参数设置为 0 时,驱动程序管理器将返回下表中列出的 FieldIdentifier 值。
| FieldIdentifier | 价值 |
|---|---|
| SQL_DESC_AUTO_UNIQUE_VALUE | SQL_FALSE |
| SQL_DESC_CASE_SENSITIVE | SQL_FALSE |
| SQL_DESC_CATALOG_NAME | “” (空字符串) |
| SQL_DESC_CONCISE_TYPE | SQL_BINARY |
| SQL_DESC_COUNT | SQLNumResultCols 返回的相同值 |
| SQL_DESC_DATETIME_INTERVAL_CODE | 0 |
| SQL_DESC_DISPLAY_SIZE | 8 |
| SQL_DESC_FIXED_PREC_SCALE | SQL_FALSE |
| SQL_DESC_LABEL | “” (空字符串) |
| SQL_DESC_LENGTH | 0 |
| SQL_DESC_LITERAL_PREFIX | “” (空字符串) |
| SQL_DESC_LITERAL_SUFFIX | “” (空字符串) |
| SQL_DESC_LOCAL_TYPE_NAME | “” (空字符串) |
| SQL_DESC_NAME | “” (空字符串) |
| SQL_DESC_NULLABLE | SQL_NO_NULLS |
| SQL_DESC_OCTET_LENGTH | 4 |
| SQL_DESC_PRECISION(SQL描述精度) | 4 |
| SQL_DESC_SCALE | 0 |
| SQL_DESC_SCHEMA_NAME | “” (空字符串) |
| SQL_DESC_SEARCHABLE | SQL_PRED_NONE |
| SQL_DESC_TABLE_NAME | “” (空字符串) |
| SQL_DESC_TYPE | SQL_BINARY |
| SQL_DESC_TYPE_NAME | “” (空字符串) |
| SQL_DESC_UNNAMED | SQL_UNNAMED |
| SQL_DESC_UNSIGNED | SQL_FALSE |
| SQL_DESC_UPDATEABLE | SQL_ATTR_READ_ONLY |
SQLDescribeCol
当使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序调用 SQLDescribeCol 时, ColumnNumber 参数设置为 0 时,驱动程序管理器将返回下表中列出的值。
| 缓冲区 | 价值 |
|---|---|
| ColumnName | “” (空字符串) |
| *NameLengthPtr | 0 |
| *DataTypePtr | SQL_BINARY |
| *ColumnSizePtr | 4 |
| *DecimalDigitsPtr | 0 |
| *NullablePtr | SQL_NO_NULLS (SQL不允许空值) |
SQLGetData
使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序对 SQLGetData 进行以下调用以检索书签时:
SQLGetData(StatementHandle, 0, SQL_C_VARBOOKMARK, TargetValuePtr, BufferLength, StrLen_or_IndPtr)
调用将映射到 SQLGetStmtOption,其中 fOption 为 SQL_GET_BOOKMARK,如下所示:
SQLGetStmtOption(hstmt, SQL_GET_BOOKMARK, TargetValuePtr)
其中 hstmt 和 pvParam 分别设置为 StatementHandle 和 TargetValuePtr 中的值。 书签在由参数 pvParam(TargetValuePtr)指向的缓冲区中返回。 调用 SQLGetData 时StrLen_or_IndPtr参数指向的缓冲区中的值设置为 4。
在调用 SQLGetData 之前调用 SQLFetch 并且 ODBC 2.x 驱动程序不支持 SQLExtendedFetch 的情况下,必须考虑此映射。 在这种情况下, SQLFetch 将传递到 ODBC 2.x 驱动程序,在这种情况下不支持书签检索。
无法在 ODBC 2.x 驱动程序中多次调用 SQLGetData 以分段检索书签。因此,当 SQLGetData 的 BufferLength 参数设置为小于 4 的值且 ColumnNumber 参数设置为 0 时,将返回 SQLSTATE HY090(字符串或缓冲区长度无效)。 但是,可以多次调用 SQLGetData 来检索同一书签。
SQLSetStmtAttr
当使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序调用 SQLSetStmtAttr 将SQL_ATTR_USE_BOOKMARKS属性设置为SQL_UB_VARIABLE时,驱动程序管理器会将该属性设置为基础 ODBC 2.x 驱动程序中的SQL_UB_ON。