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

在新系统中,我们理想地希望利用 C# DataTable 对象中的数据来创建本机 BCP 格式的数据文件。

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

有帮助吗?

解决方案

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

其他提示

如果它是旧的,那么BCP部分可能看起来非常像Sybase BCP部分。在Sybase中,我开始查看客户端库,并使用BCP API提供代码示例。相应API的CTLib和/或Java jar。对于Microsoft,可能存在涉及BCP的本机C或基本API的类似部分。您可能不需要API的通信部分,只需逐个记录准备和读/写文件。

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

有一种类似的方法可以做到这一点,但你必须引用SQLDMO,它将像BCP一样创建一个等效的格式。通过使用SQLDMO的BulkCopy对象,您可以执行您要查找的内容。这是vbscript中使用SQLDMO库的例程的链接,此处

希望这有帮助, 最好的祝福, 汤姆。

您可以将数据表中的数据放入 SQL Server 上的暂存区吗?如果是这样,您可以生成 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

假设你只修复了目标表中的列类型,没有任何可空,没有unicode字符串,并且愿意处理字节序,那么原生文件格式只是类型的字节。

我最近通过逐字节写入一个登台文件并使用BCP来批量导入c#脚本中的数据

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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top