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

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics 平台系统(PDW)

将 DB 库大容量复制程序转换为 ODBC 非常简单,因为 SQL Server Native Client ODBC 驱动程序支持的大容量复制函数类似于 DB 库大容量复制函数,但有以下例外:

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

  • DB 库应用程序在连接之前调用 BCP_SETL ,以便在 DBPROCESS 上启用大容量复制操作。 ODBC 应用程序改为在连接句柄上启用批量操作之前调用 SQLSetConnectAttr

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

  • 为 DB 库bcp_bindvarlen 参数指定的值的解释方式不同于 ODBC bcp_bindcbData 参数。

    指示条件 DB-Library varlen ODBC cbData
    提供 Null 值 0 -1 (SQL_NULL_DATA)
    提供变量数据 -1 -10 (SQL_VARLEN_DATA)
    零长度字符或二进制字符串 NA 0

    在 DB-Library 中,varlen 值为 -1 表示正在提供可变长度数据,ODBC cbData将解释为仅提供 NULL 值。 将 -1 的任何 DB 库 varlen 规范更改为SQL_VARLEN_DATA,将 0 的任何 varlen 规范更改为SQL_NULL_DATA。

  • DB 库bcp_colfmtfile_collen和 ODBC bcp_colfmtcbUserData 的问题与上面提到的 bcp_bindvarlencbData 参数相同。 将 -1 的任何 DB 库 file_collen 规范更改为SQL_VARLEN_DATA,将 0 的任何 file_collen 规范更改为 SQL_NULL_DATA。

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

  • bcp_control选项 BCPMAXERRS 指定在大容量复制操作失败之前可能有多个行可能出错。 BCPMAXERRS 的默认值为 0(首次错误时失败),在 ODBC 版本中的 DB-Library 版本 bcp_control 和 10。 必须更改依赖于默认值 0 以终止大容量复制操作的 DB-Library 应用程序,以调用 ODBC bcp_control 将 BCPMAXERRS 设置为 0。

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

    • BCPODBC

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

      将 BCPODBC 设置为 FALSE 时, 转换为字符串的日期/时间 值将输出为:

      1997-01-01 00:00:00.000  
      

      将 BCPODBC 设置为 TRUE 时,输出的日期/时间值与以下值相同

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

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

    • BCPHINTS

      指定各种大容量复制优化措施。 此选项不能用于 6.5 或更低版本的 SQL Server。

    • BCPFILECP

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

    • BCPUNICODEFILE

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

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

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

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

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

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

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

    DB 库大容量复制函数不接受 ODBC 日期/时间和 smalldatetime 格式。

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

  • 当以字符格式输出 货币 值时,ODBC 大容量复制函数提供四位数的精度和无逗号分隔符;DB 库版本仅提供两位数的精度,并包含逗号分隔符。

另请参阅

执行大容量复制操作 (ODBC)
大容量复制函数