从 DB-Library 转换到 ODBC 大容量复制

将 DB-Library 大容量复制程序转换到 ODBC 很容易,因为由 SQL Server Native Client ODBC 驱动程序支持的大容量复制函数类似于 DB-Library 大容量复制函数,但有以下不同:

  • DB-Library 应用程序将 DBPROCESS 结构的指针作为大容量复制函数的第一个参数进行传递。在 ODBC 应用程序中,DBPROCESS 指针由 ODBC 连接句柄取代。

  • 在执行连接以便在 DBPROCESS 上启用大容量复制操作之前,DB-Library 应用程序将调用 BCP_SETL。而在执行连接以便在连接句柄上启用批量操作之前,ODBC 应用程序会调用 SQLSetConnectAttr

    SQLSetConnectAttr(hdbc, SQL_COPT_SS_BCP,
        (void *)SQL_BCP_ON, SQL_IS_INTEGER);
    
  • SQL Server Native Client ODBC 驱动程序不支持 DB-Library 消息和错误处理程序;您必须调用 SQLGetDiagRec 才能获得由 ODBC 大容量复制函数引发的错误和消息。大容量复制函数的 ODBC 版本返回标准的大容量复制返回代码 SUCCEED 或 FAILED,而不是 ODBC 样式的返回代码,比如 SQL_SUCCESS 或 SQL_ERROR。

  • 为 DB-Library bcp_bindvarlen 参数指定的值的解释方式与 ODBC bcp_bindcbData 参数不同。

    指示条件

    DB-Library varlen

    ODBC cbData

    提供 Null 值

    0

    -1 (SQL_NULL_DATA)

    提供变量数据

    -1

    -10 (SQL_VARLEN_DATA)

    零长度字符或二进制字符串

    不适用

    0

    在 DB-Library 中,varlen 值为 -1 指示正在提供可变长度数据,在 ODBC 中 cbData 解释为正在提供仅 NULL 值。请将任何 DB-Library varlen 指定值 -1 更改为 SQL_VARLEN_DATA,并将任何 varlen 指定值 0 更改为 SQL_NULL_DATA。

  • DB-Library bcp_colfmtfile_collen 和 ODBC bcp_colfmtcbUserData 有与上述 bcp_bindvarlencbData 参数相同的问题。请将任何 DB-Library file_collen 指定值 -1 更改为 SQL_VARLEN_DATA,并将任何 file_collen 指定值 0 更改为 SQL_NULL_DATA。

  • ODBC bcp_control 函数的 iValue 参数是 void 指针。在 DB-Library 中,iValue 是整数。请将 ODBC iValue 的值转换为 void *。

  • bcp_control 选项 BCPMAXERRS 指定在多少单独行有错误时引发大容量复制操作失败。在 bcp_control 的 DB-Library 版本中,BCPMAXERRS 的默认值是 0(在第一个错误后失败),而在 ODBC 版本中该值是 10。必须将依赖于默认值 0 以终止大容量复制操作的 DB-Library 应用程序更改为调用 ODBC bcp_control 将 BCPMAXERRS 设置为 0。

  • ODBC bcp_control 函数支持 bcp_control 的 DB-Library 版本所不支持的以下选项:

    • BCPODBC

      设置为 TRUE 时,指定以字符格式保存的 datetimesmalldatetime 值将有 ODBC 时间戳转义序列前缀和后缀。这仅适用于 BCP_OUT 操作。

      如果将 BCPODBC 设置为 FALSE,则转换为字符串的 datetime 值按以下格式输出:

      1997-01-01 00:00:00.000
      

      如果将 BCPODBC 设置为 TRUE,则相同的 datetime 值按以下格式输出:

      {ts '1997-01-01 00:00:00.000' }
      
    • BCPKEEPIDENTITY

      设置为 TRUE 时,指定大容量复制函数插入为具有标识约束的列提供的数据值。如果未进行设置,则为插入的行生成新标识值。

    • BCPHINTS

      指定各种大容量复制优化措施。该选项无法在 SQL Server 的 6.5 或更早版本上使用。

    • BCPFILECP

      指定大容量复制文件的代码页。

    • BCPUNICODEFILE

      指定字符模式大容量复制文件是 Unicode 文件。

  • ODBC bcp_colfmt 函数不支持 SQLCHAR 的 file_type 指示器,因为它与 ODBC SQLCHAR typedef 冲突。请对 bcp_colfmt 使用 SQLCHARACTER。

  • 在大容量复制函数的 ODBC 版本中,用于处理字符串格式的 datetimesmalldatetime 值的格式是 ODBC 格式 yyyy-mm-dd hh:mm:ss.sss;而 smalldatetime 值使用 ODBC 格式 yyyy-mm-dd hh:mm:ss。

    大容量复制函数的 DB-Library 版本接受使用几种格式的字符串格式的 datetimesmalldatetime 值:

    • 默认格式是 mmm dd yyyy hh:mmxx,其中,xx 是 AM 或 PM。

    • DB-Library dbconvert 函数支持任何格式的 datetimesmalldatetime 字符串。

    • 在 SQL Server 客户端网络实用工具的 DB-Library**“选项”选项卡上选中“使用国际设置”**框时,DB-Library 大容量复制函数可接受的日期格式还可以是为客户端计算机注册表的区域设置定义的区域日期格式。

    DB-Library 大容量复制函数不接受 ODBC datetimesmalldatetime 格式。

    如果 SQL_SOPT_SS_REGIONALIZE 语句属性设置为 SQL_RE_ON,则 ODBC 大容量复制函数接受的日期格式可以是为客户端计算机注册表的区域设置定义的区域日期格式。

  • 以字符格式输出 money 值时,ODBC 大容量复制函数提供四位数精度,并且没有逗号分隔符;DB-Library 版本仅提供两位数精度,并且包含逗号分隔符。