从 DB-Library 转换到 ODBC 大容量复制
将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_bindvarlen 和 cbData 参数具有相同的问题。 将 -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, (在 DB-Library 版本的 bcp_control 的第一个错误 ) 失败,在 ODBC 版本中为 10。 必须更改依赖于默认值 0 以终止大容量复制操作的应用程序DB-Library调用 ODBC bcp_control ,以将 BCPMAXERRS 设置为 0。
ODBC bcp_control 函数支持 bcp_control DB-Library 版本不支持的以下选项:
BCPODBC
设置为 TRUE 时,指定以字符格式保存的 datetime 和 smalldatetime 值将具有 ODBC 时间戳转义序列前缀和后缀。 这仅适用于 BCP_OUT 操作。
如果 BCPODBC 设置为 FALSE,则转换为字符串的 datetime 值将输出为:
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; smalldatetime 值使用 yyyy-mm-dd hh:mm:ss 的 ODBC 格式。
DB-Library版本的大容量复制函数使用多种格式接受字符串中的 datetime 和 smalldatetime 值:
默认格式为 mmm dd yyyy hh:mmxx ,其中 xx 为 AM 或 PM。
DB-Library dbconvert 函数支持的任何格式的 datetime 和 smalldatetime 字符串。
在 SQL Server 客户端网络实用工具的“DB-Library选项”选项卡上选中“使用国际设置”框时,DB-Library大容量复制函数也会接受为客户端计算机注册表的区域设置定义的区域日期格式的日期。
DB-Library大容量复制函数不接受 ODBC datetime 和 smalldatetime 格式。
如果 SQL_SOPT_SS_REGIONALIZE 语句属性设置为 SQL_RE_ON,则 ODBC 大容量复制函数接受的日期格式可以是为客户端计算机注册表的区域设置定义的区域日期格式。
以字符格式输出 money 值时,ODBC 大容量复制函数提供四位数的精度和无逗号分隔符;DB-Library版本仅提供两位数的精度,并包含逗号分隔符。