映射替换函数以实现应用程序后向兼容性

通过 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 SQLAllocEnvSQLAllocConnectSQLAllocStmt
SQLBulkOperations SQLSetPos
SQLColAttribute SQLColAttributes
SQLEndTran SQLTransact
SQLFetch SQLExtendedFetch
SQLFetchScroll SQLExtendedFetch
SQLFreeHandle SQLFreeEnvSQLFreeConnectSQLFreeStmt
SQLGetConnectAttr SQLGetConnectOption
SQLGetDiagRec SQLError
SQLGetStmtAttr SQLGetStmtOption[1]
SQLSetConnectAttr SQLSetConnectOption
SQLSetStmtAttr SQLSetStmtOption[1]

[1] 还可以执行其他操作,具体取决于所请求的属性。

SQLAllocHandle

驱动程序管理器会根据需要将此映射到 SQLAllocEnvSQLAllocConnectSQLAllocStmt。 对 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);  

将生成以下步骤序列:

  1. 如果 Operation 参数是 SQL_ADD,驱动程序管理器将如下所示调用 SQLSetPos

    SQLSetPos (hstmt, 0, SQL_ADD, SQL_LOCK_NO_CHANGE);  
    
  2. 如果 Operation 参数不是 SQL_ADD,驱动程序将返回 SQLSTATE HY092(属性/选项标识符无效)。

  3. 如果应用程序尝试更改对 SQLFetchSQLFetchScrollSQLBulkOperations 的调用之间的SQL_ATTR_ROW_STATUS_PTR,驱动程序管理器将返回 SQLSTATE HY011(现在无法设置属性)。

  4. 如果 Operation 参数为 SQL_ADD,应用程序必须调用 SQLBindCol 以绑定要插入的数据。 它无法调用 SQLSetDescFieldSQLSetDescRec 来绑定要插入的数据。

  5. 如果 Operation 参数为 SQL_ADD 且要插入的行数与当前行集大小不同,则必须调用 SQLSetStmtAttr,才能将 SQL_ATTR_ROW_ARRAY_SIZE 语句属性设置为在调用 SQLBulkOperations 之前要插入的行数。 要还原回以前的行集大小,应用程序必须在调用 SQLFetchSQLFetchScrollSQLSetPos 之前设置 SQL_ATTR_ROW_ARRAY_SIZE 语句属性。

SQLColAttribute

驱动程序管理器将此映射到 SQLColAttributes。 对 SQLColAttribute 的以下调用:

SQLColAttribute(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  

将生成以下步骤序列:

  1. 如果 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(描述符字段标识符无效)。 本部分的进一步规则不适用。

  2. 驱动程序管理器分别将 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);  
    
  3. 所有其他 FieldIdentifier 值都传递给驱动程序,SQLColAttribute 如前所示映射到 SQLColAttributes

  4. 如果 BufferLength 小于 0,驱动程序管理器将返回具有 SQLSTATE HY090 的 SQL_ERROR(字符串或缓冲区长度无效)。 本部分的进一步规则不适用。

  5. 如果 FieldIdentifier 是 SQL_DESC_CONCISE_TYPE 并且返回的类型是简洁的日期时间数据类型,驱动程序管理器将映射日期、时间和时间戳代码的返回值。

  6. 驱动程序管理器执行必要的检查,以查看是否需要引发 SQLSTATE HY010(函数序列错误)。 如果是,驱动程序管理器将返回S 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 参数 SQL_FETCH_NEXT 将此映射到 SQLExtendedFetch。 对 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 可以等于空指针。

如果驱动程序不支持 SQLExtendedFetch 并加载游标库,驱动程序管理器将使用游标库的 SQLExtendedFetchSQLFetch 映射到 SQLExtendedFetch。 如果驱动程序不支持 SQLExtendedFetch,并且游标库未加载,驱动程序管理器会将对 SQLFetch 的调用传递到驱动程序。 如果应用程序调用 SQLSetStmtAttr 来设置 SQL_ATTR_ROW_STATUS_PTR,则驱动程序管理器可确保填充数组。 如果应用程序调用 SQLSetStmtAttr 来设置 SQL_ATTR_ROWS_FETCHED_PTR,则驱动程序管理器会将此字段设置为 1。

SQLFetchScroll

驱动程序管理器将此映射到 SQLExtendedFetch。 对 SQLFetchScroll 的以下调用:

SQLFetchScroll(StatementHandle, FetchOrientation, FetchOffset);  

将生成以下步骤序列:

  1. 当应用程序调用 SQLSetStmtAttr 以设置 SQL_ATTR_ROW_STATUS_PTR(这将设置 IRD 中的 SQL_DESC_ARRAY_STATUS_PTR 字段)以指向状态数组时,驱动程序管理器将缓存此指针。 让此指针成为 RowStatusArray;否则,让 RowStatusArray 等于空指针。 如果 RowStatusArray 参数被设置为空指针,则驱动程序管理器将生成行状态数组。

  2. 如果 FetchOrientation 不是 SQL_FETCH_NEXT、SQL_FETCH_PRIOR、SQL_FETCH_ABSOLUTE、SQL_FETCH_RELATIVE、SQL_FETCH_FIRST、SQL_FETCH_LAST 或 SQL_FETCH_BOOKMARK 之一,驱动程序管理器将返回 SQL_ERROR h和 SQLSTATE HY106(提取超出范围的类型)。 本部分的进一步规则不适用。

  3. 大小写:

  • 如果 FetchOrientation 等于 SQL_FETCH_BOOKMARK,则:

    • 如果前面调用了 SQLSetStmtAttr 来设置 SQL_ATTR_FETCH_BOOKMARK_PTR 的值,则让 Bmk 成为通过取消引用指针 SQL_DESC_FETCH_BOOKMARK_PTR 获取的值。

    • 否则,请返回带有 SQLSTATE HY111 的 SQL_ERROR(书签值无效)。 本部分的进一步规则不适用。

    驱动程序管理器现在将调用 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

驱动程序管理器会根据需要将此映射到 SQLFreeEnvSQLFreeConnectSQLFreeStmt。 对 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);  

将生成以下步骤序列:

  1. 如果 Attribute 不是驱动程序定义的连接或语句属性,并且不是 ODBC 2.x 中定义的属性,驱动程序管理器将返回具有 SQLSTATE HY092 的 SQL_ERROR(属性/选项标识符无效)。 本部分的进一步规则不适用。

  2. 如果 Attribute 等于 SQL_ATTR_AUTO_IPD 或 SQL_ATTR_METADATA_ID,驱动程序管理器将返回具有 SQLSTATE HY092 的 SQL_ERROR(属性/选项标识符无效)。

  3. 驱动程序管理器执行必要的检查,以查看是否需要引发 SQLSTATE 08003(连接未打开)或 SQLSTATE HY010(函数序列错误)。 如果是这样,驱动程序管理器将返回S SQL_ERROR 并发布相应的错误消息。 本部分的进一步规则不适用。

  4. 驱动程序管理器调用 SQLGetConnectOption,如下所示:

    SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);  
    

    请注意,BufferLengthStringLengthPtr 被忽略。

SQLGetData

当使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序调用 SQLGetDataColumnNumber 参数等于 0 时,ODBC 3.x 驱动程序管理器会将它映射到对 SQLGetStmtOption 的调用,并将 Option 属性设置为 SQL_GET_BOOKMARKSQL_GET_BOOKMARK。

SQLGetStmtAttr

驱动程序管理器将此映射到 SQLGetStmtOption。 对 SQLGetStmtAttr 的以下调用:

SQLGetStmtAttr(StatementHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);  

将生成以下步骤序列:

  1. 如果 Attribute 不是驱动程序定义的连接或语句属性,并且不是 ODBC 2.x 中定义的属性,驱动程序管理器将返回具有 SQLSTATE HY092 的 SQL_ERROR(属性/选项标识符无效)。 本部分的进一步规则不适用。

  2. 如果 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

    驱动程序管理器将返回带有 SQLSTATE HY092 的 SQL_ERROR(描述符字段标识符无效)。 本部分的进一步规则不适用。

  3. 驱动程序管理器执行必要的检查,以查看是否需要引发 SQLSTATE HY010(函数序列错误)。 如果是,驱动程序管理器将返回S SQL_ERROR 和 SQLSTATE HY010(函数序列错误)。 本部分的进一步规则不适用。

  4. 如果 Attribute 等于 SQL_ATTR_ROWS_FETCHED_PTR,驱动程序管理器将返回指向内部驱动程序管理器变量 cRow 的指针,该变量已在对 SQLExtendedFetch 的调用中使用或即将使用。 本部分的进一步规则不适用。

  5. 如果 Attribute 等于 SQL_DESC_FETCH_BOOKMARK_PTR,驱动程序管理器将返回在调用 SQLSetStmtAttr 期间缓存的相应指针。

  6. 如果 Attribute 等于 SQL_ATTR_ROW_STATUS_PTR,驱动程序管理器将返回在调用 SQLSetStmtAttr 期间缓存的相应指针。

  7. 驱动程序管理器将调用 SQLGetStmtOption,如下所示:

    SQLGetStmtOption (hstmt, fOption, pvParam);  
    

    其中,hstmtfOptionpvParam 将分别设置为 StatementHandleAttributeValuePtr 的值。 BufferLengthStringLengthPtr 被忽略。

SQLSetConnectAttr

驱动程序管理器将此映射到 SQLSetConnectOption。 对 SQLSetConnectAttr 的以下调用:

SQLSetConnectAttr(ConnectionHandle, Attribute, ValuePtr, StringLength);  

将生成以下步骤序列:

  1. 如果 Attribute 不是驱动程序定义的连接或语句属性,并且不是 ODBC 2.x 中定义的属性,驱动程序管理器将返回具有 SQLSTATE HY092 的 SQL_ERROR(属性/选项标识符无效)。 本部分的进一步规则不适用。

  2. 如果 Attribute 等于 SQL_ATTR_AUTO_IPD,驱动程序管理器将返回具有 SQLSTATE HY092 的 SQL_ERROR(属性/选项标识符无效)。

  3. 驱动程序管理器执行必要的检查,以查看是否需要引发 SQLSTATE 08003(连接未打开)或 SQLSTATE HY010(函数序列错误)。 如果需要引发其中一个错误,驱动程序管理器将返回 SQL_ERROR 并发布相应的错误消息。 本部分的进一步规则不适用。

  4. 驱动程序管理器调用 SQLSetConnectOption,如下所示:

    SQLSetConnectOption (hdbc, fOption, vParam);  
    

    其中,hdbcfOptionvParam 将分别设置为 ConnectionHandleAttributeValuePtr 的值。 忽略 StringLengthPtr

注意

在连接级别上设置语句属性的功能已被弃用。 ODBC 3.x 应用程序不应在连接级别上设置语句属性。

SQLSetStmtAttr

驱动程序管理器将此映射到 SQLSetStmtOption。 对 SQLSetStmtAttr 的以下调用:

SQLSetStmtAttr(StatementHandle, Attribute, ValuePtr, StringLength);  

将生成以下步骤序列:

  1. 如果 Attribute 不是驱动程序定义的连接或语句属性,并且不是 ODBC 2.x 中定义的属性,驱动程序管理器将返回具有 SQLSTATE HY092 的 SQL_ERROR(属性/选项标识符无效)。 本部分的进一步规则不适用。

  2. 如果 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

    驱动程序管理器将返回带有 SQLSTATE HY092 的 SQL_ERROR(描述符字段标识符无效)。 本部分的进一步规则不适用。

  3. 驱动程序管理器执行必要的检查,以查看是否需要引发 SQLSTATE HY010(函数序列错误)。 如果是,驱动程序管理器将返回S SQL_ERROR 和 SQLSTATE HY010(函数序列错误)。 本部分的进一步规则不适用。

  4. 如果 Attribute 等于 SQL_ATTR_PARAMSET_SIZE 或 SQL_ATTR_PARAMS_PROCESSED_PTR,请参阅本主题后面的“处理参数数组的映射”部分。 本部分的进一步规则不适用。

  5. 如果 Attribute 等于 SQL_ATTR_ROWS_FETCHED_PTR,驱动程序管理器将缓存指针值,以便稍后与 SQLFetchScroll 一起使用。

  6. 如果 Attribute 等于 SQL_ATTR_ROW_STATUS_PTR,驱动程序管理器将缓存指针值,以便稍后与 SQLFetchScrollSQLSetPos 一起使用。 本部分的进一步规则不适用。

  7. 如果 Attribute 等于 SQL_ATTR_FETCH_BOOKMARK_PTR,驱动程序管理器将缓存 ValuePtr,并将在稍后调用 SQLFetchScroll 时使用缓存的值。 本部分的进一步规则不适用。

  8. 驱动程序管理器将调用 SQLSetStmtOption,如下所示:

    SQLSetStmtOption (hstmt, fOption, vParam);  
    

    其中, hstmtfOptionvParam 将分别设置为 StatementHandleAttributeValuePtr 的值。 忽略 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,则驱动程序管理器必须确保此变量在从 SQLExecDirectSQLExecute 返回之前包含值 1。

错误处理

在 ODBC 3.x 中,调用 SQLFetchSQLFetchScroll 将在 IRD 中填充 SQL_DESC_ARRAY_STATUS_PTR,而给定的诊断记录的 SQL_DIAG_ROW_NUMBER 字段包含此记录所对应的行集中的行数。 使用此方法,应用程序可以将错误消息与给定的行位置相关联。

ODBC 2.x 驱动程序无法提供此功能。 但是,它将使用 SQLSTATE 01S01 提供错误划分(行错误)。 在违背 ODBC 2.x 驱动程序时使用 SQLFetchSQLFetchScroll 的 ODBC 3.x 应用程序需要注意这一事实。 另请注意,此类应用程序将无法调用 SQLGetDiagField 来实际获取 SQL_DIAG_ROW_NUMBER 字段。 使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序只能使用 DiagIdentifier 参数 SQL_DIAG_MESSAGE_TEXT、SQL_DIAG_NATIVE、SQL_DIAG_RETURNCODE 或 SQL_DIAG_SQLSTATE 调用 SQLGetDiagField。 ODBC 3.x 驱动程序管理器在使用 ODBC 2.x 驱动程序时会维护诊断数据结构,但 ODBC 2.x 驱动程序仅返回这四个字段。

当 ODBC 2.x 应用程序使用 ODBC 2.x 驱动程序时,如果操作可能导致驱动程序管理器返回多个错误,ODBC 3.x 驱动程序管理器可能会返回与 ODBC 2.x 驱动程序管理器不同的错误。

书签操作的映射

当使用 ODBC 2.x 驱动程序的 ODBC 3.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 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 时,驱动程序管理器将返回下表中列出的值。

Buffer
ColumnName ""(空字符串)
*NameLengthPtr 0
*DataTypePtr SQL_BINARY
*ColumnSizePtr 4
*DecimalDigitsPtr 0
*NullablePtr SQL_NO_NULLS

SQLGetData

使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序对 SQLGetData 进行以下调用以检索书签时:

SQLGetData(StatementHandle, 0, SQL_C_VARBOOKMARK, TargetValuePtr, BufferLength, StrLen_or_IndPtr)  

调用将映射到具有 fOption 为 SQL_GET_BOOKMARK 的 SQLGetStmtOption,如下所示:

SQLGetStmtOption(hstmt, SQL_GET_BOOKMARK, TargetValuePtr)  

其中 hstmtpvParam 分别设置为 StatementHandleTargetValuePtr 中的值。 书签在 pvParam (TargetValuePtr) 参数指向的缓冲区中返回。 调用 SQLGetDataStrLen_or_IndPtr 参数指向的缓冲区中的值设置为 4。

在调用 SQLGetData 之前调用 SQLFetch 并且 ODBC 2.x 驱动程序不支持 SQLExtendedFetch 的情况下,需要考虑此映射。 在这种情况下,SQLFetch 将传递到 ODBC 2.x 驱动程序,此情况下不支持书签检索。

无法多次在 ODBC 2.x 驱动程序中调用 SQLGetData 以检索部件中的书签,因此,将 BufferLength 参数设置为小于 4 的值调用 SQLGetData,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。