我们正在升级一个已有 15 年历史的代码库,需要创建一些本机 BCP 格式的数据文件。
在新系统中,理想情况下,我们希望利用 C# DataTable 对象中的数据来创建原生 BCP 格式的数据文件。
这可以做到吗?如果可以,最好的方法是什么?
我们正在升级一个已有 15 年历史的代码库,需要创建一些本机 BCP 格式的数据文件。
在新系统中,理想情况下,我们希望利用 C# DataTable 对象中的数据来创建原生 BCP 格式的数据文件。
这可以做到吗?如果可以,最好的方法是什么?
不,这做不到,我们发现创建本机 BCP 文件的唯一方法是使用 SQL Server。如果有人开发或找到另一种方式,请在此处发布!
您能否将数据表中的数据放入 SQL Server 上的暂存区?如果是这样,您可以生成一个 BCP 进程。
BCP:http: //msdn.microsoft.com/en-us/library/aa174646%28SQL.80%29.aspx
例如,我使用:
BCP Database.Schema.TableName OUT FileName.Ext -S ServerName -T -n
开关:
编辑+新想法:
如果您有权访问填充数据表的查询,则可以使用带有 BCP 或 SQLDMO 的查询来导出本机格式文件。以下查询使用 QUERYOUT 开关而不是 OUT 开关,因为它们包含内联查询
从视图中导出特定列:
BCP "SELECT Column1, Column2 FROM MyViewName" QUERYOUT FileName.Ext -S ServerName -T -n
从 JOIN 中导出特定列:
BCP "SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 on Table1.Column33 = Table2.Column33" QUERYOUT FileName.Ext -S ServerName -T -n
如果它是那么旧,那么 BCP 片段可能看起来非常像 Sybase BCP 片段。在 Sybase 中,我将开始查看客户端库和使用 BCP API 发布的代码示例。对应 API 的 CTLib 和/或 Java jar。对于 Microsoft,可能有类似的原生 C 或 Basic API 部分涉及 BCP。您可能不需要 API 的通信部分,只需逐个记录准备和读取/写入文件。
如果没有这样的东西,那么我会考虑使用由原始 BCP 程序生成/使用的手工制作的 FMT 文件和类似文本的数据文件的非原生格式。
有一种类似的方法可以做到这一点,但是您必须引用 SQLDMO,它会创建一个与 BCP 一样的等效格式。通过使用 SQLDMO 的 BulkCopy 对象,您可以做您正在寻找的事情。这是在使用 SQLDMO 库的 vbscript 中完成的例程的链接。
希望这会有所帮助,最好的问候,汤姆。
假设您只修复了目标表中的列类型,没有可以为空的内容,没有 unicode 字符串,并且愿意处理字节序,那么本机文件格式只是类型的字节。
我最近通过逐字节编写暂存文件并使用 BCP 从 ac# 脚本批量导入数据
bcp destTable in model.raw -T -S _serverName -n
model.raw 通过以下方式按字节创建:
fileBytes = new byte[theLength * 4]; // * 4 bytes per element for int and float
var offset =0;
foreach (var element in outputDimensions)
{
// fastCopy is a faster and "Unsafe" equivelent of BlockCopy , faster because it doesn't create an intermediate byte array.
//Buffer.BlockCopy(BitConverter.GetBytes(profileid), 0, fileBytes, offset, 4);
Utilities.fastCopy(profileid, fileBytes, offset);
offset += 4;
Utilities.fastCopy(element.index, fileBytes, offset);
offset += 4;
for (var i = 0; i < TimeSlices; i++, offset += 4)
{
float target = GetDataForTime(i,...);
Utilities.fastCopy(target, fileBytes, offset);
}
}
FileStream dataWriter.Write(fileBytes , 0, byteArray.Length);