IBCPSession::BCPColFmt (OLE DB)

在程序变量和 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,并将 cbIndicatorcbUserData 和 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
内存不足错误。

另请参阅

IBCPSession (OLE DB)
执行大容量复制操作