【问题标题】:Is it possible to create a SQL Server native file from c# (like BCP native format)是否可以从 c# 创建 SQL Server 本机文件(如 BCP 本机格式)
【发布时间】:2009-11-27 22:12:59
【问题描述】:

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

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

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

【问题讨论】:

  • 我很好奇。为什么需要 Native 格式的文件中的数据?
  • 下游系统坚持!

标签: c# sql-server etl bcp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      希望这会有所帮助, 此致, 汤姆。

      【讨论】:

      • 他的数据在 C# 中的数据表中 - 它不在 SQL Server 中。
      【解决方案4】:

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

      【讨论】:

      • 有没有办法处理来自 C# 对象而不是来自数据库的数据?
      【解决方案5】:

      假设您只修复了目标表中的列类型,没有可以为空的内容,没有 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 2010-12-02
        • 1970-01-01
        • 2011-12-29
        • 2011-12-12
        相关资源
        最近更新 更多