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

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

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

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

  • DB-Library应用程序在连接之前调用 BCP_SETL ,以便在 DBPROCESS 上启用大容量复制操作。 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)
    零长度字符或二进制字符串 NA 0

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

  • DB-Library bcp_colfmtfile_collen 和 ODBC bcp_colfmtcbUserData 具有与上面所述的 bcp_bindvarlencbData 参数相同的问题。 将 -1 的任何DB-Library 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, (在 bcp_control DB-Library 版本中出现第一个错误 ) 失败,在 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,则转换为字符串的 日期/时间 值输出为:

      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 版本的大容量复制函数中,处理字符串中 datetimesmalldatetime 值的格式是 yyyy-mm-dd hh:mm:ss.sss; 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-Library选项”选项卡上选中“使用国际设置”框时,DB-Library大容量复制函数也会接受为客户端计算机注册表的区域设置定义的区域日期格式的日期。

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

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

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

另请参阅

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