在程序变量和 SQL Server 列之间创建绑定。
语法
HRESULT BCPColFmt(
DBORDINALidxUserDataCol,
inteUserDataType,
intcbIndicator,
intcbUserData,
BYTE *pbUserDataTerm,
intcbUserDataTerm,
DBORDINALidxServerCol);
注解
BCPColFmt 方法用于在 BCP 数据文件字段和 SQL Server 列之间创建绑定。 它采用列的长度、类型、终止符和前缀长度作为参数,并设置各个字段的每个属性。
如果用户选择交互模式,则调用此方法两次;一次根据默认值设置列格式(根据服务器列的类型),一次根据在交互模式下选择的客户端选择的列类型设置格式。
在非交互式模式下,每列只调用一次,将每列的类型设置为字符或本机类型,并设置列和行终止符。
使用 BCPColFmt 方法可以指定大容量副本的用户文件格式。 对于大容量复制,格式包含以下部分:
从用户文件字段到数据库列的映射。
每个用户文件字段的数据类型。
每个字段的可选指示器的长度。
每个用户文件字段的最大数据长度。
每个字段的可选终止字节序列。
可选终止字节序列的长度。
每次调用 BCPColFmt 都会指定一个用户文件字段的格式。 例如,若要更改五字段用户数据文件中三个字段的默认设置,请先调用 BCPColumns(5)
,然后调用 BCPColFmt 五次,其中三个调用设置自定义格式。 对于其余两个调用,请将 eUserDataType 设置为 BCP_TYPE_DEFAULT,并将 cbIndicator、cbUserData 和 cbUserDataTerm 分别设置为 0、BCP_VARIABLE_LENGTH 和 0。 此过程复制所有五列,三列具有自定义格式,两列是默认格式。
注释
必须在调用 BCPColFmt 之前调用 IBCPSession::BCPColumns 方法。 必须为用户文件中的每一列调用 BCPColFmt 一次。 针对任何用户文件列多次调用 BCPColFmt 会导致错误。
无需将用户文件中的所有数据复制到 SQL Server 表。 若要跳过列,请指定将 idxServerCol 参数设置为 0 的列的数据格式。 若要跳过字段,仍需要该方法的所有信息才能正常工作。
注意IBCPSession::BCPWriteFmt 函数可用于保存通过 BCPColFmt 提供的格式规范。
论据
idxUserDataCol[in]
用户数据文件中的字段索引。
eUserDataType[in]
用户数据文件中字段的数据类型。 可用数据类型列在 SQL Server Native Client 头文件(sqlncli.h)中,BCP_TYPE_XXX格式,例如BCP_TYPE_SQLINT4。 如果指定了BCP_TYPE_DEFAULT值,提供程序将尝试使用与表或视图列类型相同的类型。 对于从 SQL Server 进行大容量复制作,并在参数BCP_TYPE_SQLDECIMAL或BCP_TYPE_SQLNUMERIC时 eUserDataType
进入文件中:
如果源列不是十进制列或数字,则使用默认精度和小数位数。
如果源列是小数或数值,则使用源列的精度和小数位数。
cbIndicator[in]
字段的前缀长度。 默认值为BCP_PREFIX_DEFAULT。 前缀的有效长度为 0、1、2、4 和 8。 前缀大小 8 最常用于指示字段已分块。 这用于有效地大容量复制大型值类型列。
cbUserData[in]
用户文件中此字段数据的最大长度(以字节为单位),不包括任何长度指示器或终止符的长度。
设置为 cbUserData
BCP_LENGTH_NULL表示数据文件字段中的所有值应设置为 NULL 或应设置为 NULL。 设置为 cbUserData
BCP_LENGTH_VARIABLE表示系统应确定每个字段的数据长度。 对于某些字段,这可能意味着生成长度/null 指示器以在从 SQL Server 复制的数据之前,或指示符在复制到 SQL Server 的数据中预期。
对于 SQL Server 字符和二进制数据类型, cbUserData
可以BCP_LENGTH_VARIABLE、BCP_LENGTH_NULL、0 或某些正值。 如果 cbUserData
BCP_LENGTH_VARIABLE,则系统使用长度指示器(如果存在)或终止符序列来确定数据的长度。 如果同时提供长度指示器和终止符序列,则大容量复制使用导致复制的数据量最少的序列。 如果 cbUserData
为BCP_LENGTH_VARIABLE,则数据类型为 SQL Server 字符或二进制类型,如果未指定长度指示器或终止符序列,则系统会返回错误消息。
如果 cbUserData
为 0 或正值,则系统用作 cbUserData
最大数据长度。 但是,如果除了提供正 cbUserData
数指示符或终止符序列外,系统还使用导致复制的数据量最少的方法来确定数据长度。
该值 cbUserData
表示数据的字节数。 如果字符数据由 Unicode 宽字符表示,则正 cbUserData
参数值表示字符数乘以每个字符的大小(以字节为单位)。
pbUserDataTerm[size_is][in]
要用于字段的终止符序列。 此参数主要用于字符数据类型,因为所有其他类型都是固定长度,或者,对于二进制数据,需要长度指示器来准确记录存在的字节数。
若要避免终止提取的数据,或指示用户文件中的数据未终止,请将此参数设置为 NULL。
如果使用了多个指定用户文件列长度的方法(例如终止符和长度指示器或终止符和最大列长度),则大容量复制选择导致复制的数据量最少的列。
大容量复制 API 根据需要执行 Unicode 到 MBCS 的字符转换。 必须确保正确设置终止符字节字符串和字节字符串的长度。
cbUserDataTerm[in]
要用于列的终止符序列的长度(以字节为单位)。 如果数据中不存在或不需要终止符,请将此值设置为 0。
idxServerCol[in]
列在数据库表中的序号位置。 第一列号为 1。
IColumnsInfo::GetColumnInfo 或类似方法报告列的序号位置。 如果此值为 0,大容量复制将忽略数据文件中的字段。
返回代码值
S_OK
方法成功。
E_FAIL
出现提供程序特定的错误,有关详细信息,请使用 ISQLServerErrorInfo 接口。
E_UNEXPECTED (意外错误)
意外调用了该方法。 例如,在调用此方法之前,未调用 IBCPSession::BCPInit 方法。
E_INVALIDARG
参数无效。
E_OUTOFMEMORY
内存不足错误。