2

我们正在升级一个已有 15 年历史的代码库,需要创建一些本机 BCP 格式的数据文件。

在新系统中,理想情况下,我们希望利用 C# DataTable 对象中的数据来创建原生 BCP 格式的数据文件。

这可以做到吗?如果可以,最好的方法是什么?

4

5 回答 5

3

不,这做不到,我们发现创建本机 BCP 文件的唯一方法是使用 SQL Server。如果有人开发或找到另一种方式,请在此处发布!

于 2010-01-14T00:33:12.843 回答
0

您能否将数据表中的数据放入 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

开关:

  • -S 用于服务器
  • -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
于 2009-11-27T22:20:44.857 回答
0

如果它是那么旧,那么 BCP 片段可能看起来非常像 Sybase BCP 片段。在 Sybase 中,我将开始查看客户端库和使用 BCP API 发布的代码示例。对应 API 的 CTLib 和/或 Java jar。对于 Microsoft,可能有类似的原生 C 或 Basic API 部分涉及 BCP。您可能不需要 API 的通信部分,只需逐个记录准备和读取/写入文件。

如果没有这样的东西,那么我会考虑使用由原始 BCP 程序生成/使用的手工制作的 FMT 文件和类似文本的数据文件的非原生格式。

于 2009-11-27T22:25:51.900 回答
0

有一种类似的方法可以做到这一点,但是您必须引用 SQLDMO,它会创建一个与 BCP 一样的等效格式。通过使用 SQLDMO 的 BulkCopy 对象,您可以做您正在寻找的事情。这是在使用 SQLDMO 库的 vbscript 中完成的例程的链接

希望这会有所帮助,最好的问候,汤姆。

于 2009-11-28T00:06:20.760 回答
0

假设您只修复了目标表中的列类型,没有可以为空的内容,没有 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);
于 2017-03-22T00:14:01.993 回答