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

通过 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. 如果应用程序尝试更改对 SQLFetch 或 SQLFetchScrollSQLBulkOperations 的调用之间的SQL_ATTR_ROW_STATUS_PTR,驱动程序管理器将返回 SQLSTATE HY011(现在无法设置属性)。

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

  5. 如果 Operation 参数SQL_ADD且要插入的行数与当前行集大小不同,则必须调用 SQLSetStmtAttr ,才能将 SQL_ATTR_ROW_ARRAY_SIZE 语句属性设置为在调用 SQLBulkOperations 之前要插入的行数。 若要还原回以前的行集大小,应用程序必须在调用 SQLFetch、SQLFetchScrollSQLSetPos 之前设置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(函数序列错误)。 如果是,驱动程序管理器将返回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 并加载游标库,驱动程序管理器将使用游标库的 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 等于 null 指针。 如果 RowStatusArray 参数设置为 null 指针,驱动程序管理器将生成行状态数组。

  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 和 SQLSTATE HY106(提取范围外的类型)。 本部分的进一步规则不适用。

  3. 箱:

  • 如果 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

驱动程序管理器会根据需要将此映射到 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. 驱动程序管理器执行必要的检查,以查看是否需要返回SQLSTATE08003(连接未打开)或SQLSTATEHY010(函数序列错误)。 如果是这样,驱动程序管理器将返回SQL_ERROR并发布相应的错误消息。 本部分的进一步规则不适用。

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

    SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);  
    

    请注意,BufferLengthStringLengthPtr 被忽略。

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);  

将生成以下步骤序列:

  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

    驱动管理器返回 SQL_ERROR,SQLSTATE 为 HY092(无效的属性/选项标识符)。 本部分的进一步规则不适用。

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

  4. 如果 Attribute 等于 SQL_ATTR_ROWS_FETCHED_PTR,驱动程序管理器将返回指向内部 Driver Manager 变量 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

    驱动管理器返回 SQL_ERROR,SQLSTATE 为 HY092(无效的属性/选项标识符)。 本部分的进一步规则不适用。

  3. 驱动管理器执行必要的检查,以确定是否需要抛出 SQLSTATE HY010(函数序列错误)。 如果是,驱动程序管理器将返回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 应用程序只能使用 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 应用程序调用 SQLColAttributeColumnNumber 参数设置为 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)  

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

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

无法在 ODBC 2.x 驱动程序中多次调用 SQLGetData 以分段检索书签。因此,当 SQLGetDataBufferLength 参数设置为小于 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。