使用SqlBulkCopy时,将流作为二进制列的数据源

我一

如果需要以流方式SqlServer读取数据,则可以使用某些功能。例如使用SqlDataReaderwith CommandBehavior.SequentialAccess,特别是当需要访问二进制列数据时,可以使用以下GetStream(int)方法:

var cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = @"select 0x0123456789 as Data";

using (var dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
    dr.Read();

    var stream = dr.GetStream(0);
    // access stream
}

但是,当需要使用将数据馈送SqlServer时SqlBulkCopy,尤其是如果需要将流作为二进制列的数据源来提供数据时,如何以相反的方向流数据呢?

我尝试了以下

var cmd2 = new SqlCommand();
cmd2.Connection = connection;
cmd2.CommandText = @"create table #Test (ID int, Data varbinary(max))";
cmd2.ExecuteNonQuery();

using (SqlBulkCopy sbc = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, null))
{
    sbc.DestinationTableName = "#Test";
    sbc.EnableStreaming = true;

    sbc.ColumnMappings.Add(0, "ID");
    sbc.ColumnMappings.Add(1, "Data");

    sbc.WriteToServer(new TestDataReader());
}

其中TestDataReader实现IDataReader如下:

class TestDataReader : IDataReader
{
    public int FieldCount { get { return 2; } }
    int rowCount = 1;
    public bool Read() { return (rowCount++) < 3; }
    public bool IsDBNull(int i) { return false; }

    public object GetValue(int i)
    {
        switch (i)
        {
            case 0: return rowCount;
            case 1: return new byte[] { 0x01, 0x23, 0x45, 0x67, 0x89 };
            default: throw new Exception();
        }
    }

    //the rest members of IDataReader
}

并按预期工作。

但是改变

case 1: return new byte[] { 0x01, 0x23, 0x45, 0x67, 0x89 };

case 1: return new MemoryStream(new byte[] { 0x01, 0x23, 0x45, 0x67, 0x89 });

导致System.InvalidOperationException消息异常

来自数据源的MemoryStream类型的给定值不能转换为指定目标列的varbinary类型。

是否有提供一个方式StreamIDataReader(或可能DbDataReader),以SqlBulkCopy作为数据的二进制列的源极,而无需首先将所有数据复制到存储器中(字节阵列)?

EVK

不确定此文件是否在任何地方都有记录,但是如果对SqlBulkCopy源代码进行简短检查,您可能会发现它以不同的方式对待不同的数据读取器。首先,SqlBulkCopy它确实支持流和GetStream,但是您可能会注意到该IDataReader接口不包含GetStreammethod。因此,当您将自定义IDataReader实现提供给SqlBulkCopy-时,它将不会将二进制列视为流,也不会接受Stream类型的

另一方面-DbDataReader 确实有此方法。如果您提供-继承类SqlBulkCopy的实例DbDataReader-它将以流方式处理所有二进制列,并将调用DbDataReader.GetStream

因此,要解决您的问题-DbDataReader像这样继承

class TestDataReader : DbDataReader
{
    public override bool IsDBNull(int ordinal) {
        return false;
    }

    public override int FieldCount { get; } = 2;
    int rowCount = 1;

    public override bool HasRows { get; } = true;
    public override bool IsClosed { get; } = false;

    public override bool Read()
    {
        return (rowCount++) < 3;
    }

    public override object GetValue(int ordinal) {
        switch (ordinal) {
            // do not return anything for binary column here - it will not be called
            case 0:
                return rowCount;
            default:
                throw new Exception();
        }
    }

    public override Stream GetStream(int ordinal) {
        // instead - return your stream here
        if (ordinal == 1)
            return new MemoryStream(new byte[] {0x01, 0x23, 0x45, 0x67, 0x89});
        throw new Exception();
    }
    // bunch of irrelevant stuff

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当源是二进制数据集时,接收器必须是二进制的

来自分类Dev

在Railo的cfpdf标签中使用二进制数据作为源

来自分类Dev

如何在asp.net中检索图像的二进制数据源

来自分类Dev

如何使用二进制数据作为SOLR字段索引HBase列?

来自分类Dev

如何使用二进制数据作为SOLR字段索引HBase列?

来自分类Dev

使用R将列中的分类数据重塑为行中的二进制数据

来自分类Dev

使用ifstream将二进制数据读入结构

来自分类Dev

使用ifstream将二进制数据读入结构

来自分类Dev

如何使用PowerShell将sha256哈希输出作为二进制数据而不是十六进制输出?

来自分类Dev

spark.sql.AnalysisException:文本数据源不支持二进制数据类型

来自分类Dev

使用java.net.HttpURLConnection中作为PARAM文件POST文件(如二进制流)= <文件二进制流>

来自分类Dev

我可以使用Izo压缩二进制数据的缩放源吗?

来自分类Dev

将字符串中的二进制数据作为COM事件参数传递

来自分类Dev

JavaScript-将图像作为二进制数据发送到服务器

来自分类Dev

将unicode二进制数据作为XLRD的open_workbook方法的参数传递

来自分类Dev

将结构作为二进制数据插入向量中以进行网络传输

来自分类Dev

获取文件输入值作为二进制数据

来自分类Dev

转换二进制流使用ghostscript API

来自分类Dev

将存储为 ASCII 的二进制数据转换为二进制

来自分类Dev

将列/变量作为二进制值传递以转换函数

来自分类Dev

使用hexBinary数据类型将二进制文件发送到Web服务时发生SAXParseException

来自分类Dev

如何使用HTTP作为传输读取通过Avro序列化的二进制数据?

来自分类Dev

将分类数据(在多列中)转换为二进制数据

来自分类Dev

使用每个二进制数将二进制转换为数组

来自分类Dev

将二进制数据写入ostream时减少代码

来自分类Dev

将十六进制字符串作为二进制数据写入新的 .mid 文件

来自分类Dev

将2列数据帧转换为完整的二进制矩阵

来自分类Dev

如何将列中的二进制数据转换为文件?

来自分类Dev

R:根据二进制“是/否”将“宽”数据折叠为单个串联列

Related 相关文章

  1. 1

    当源是二进制数据集时,接收器必须是二进制的

  2. 2

    在Railo的cfpdf标签中使用二进制数据作为源

  3. 3

    如何在asp.net中检索图像的二进制数据源

  4. 4

    如何使用二进制数据作为SOLR字段索引HBase列?

  5. 5

    如何使用二进制数据作为SOLR字段索引HBase列?

  6. 6

    使用R将列中的分类数据重塑为行中的二进制数据

  7. 7

    使用ifstream将二进制数据读入结构

  8. 8

    使用ifstream将二进制数据读入结构

  9. 9

    如何使用PowerShell将sha256哈希输出作为二进制数据而不是十六进制输出?

  10. 10

    spark.sql.AnalysisException:文本数据源不支持二进制数据类型

  11. 11

    使用java.net.HttpURLConnection中作为PARAM文件POST文件(如二进制流)= <文件二进制流>

  12. 12

    我可以使用Izo压缩二进制数据的缩放源吗?

  13. 13

    将字符串中的二进制数据作为COM事件参数传递

  14. 14

    JavaScript-将图像作为二进制数据发送到服务器

  15. 15

    将unicode二进制数据作为XLRD的open_workbook方法的参数传递

  16. 16

    将结构作为二进制数据插入向量中以进行网络传输

  17. 17

    获取文件输入值作为二进制数据

  18. 18

    转换二进制流使用ghostscript API

  19. 19

    将存储为 ASCII 的二进制数据转换为二进制

  20. 20

    将列/变量作为二进制值传递以转换函数

  21. 21

    使用hexBinary数据类型将二进制文件发送到Web服务时发生SAXParseException

  22. 22

    如何使用HTTP作为传输读取通过Avro序列化的二进制数据?

  23. 23

    将分类数据(在多列中)转换为二进制数据

  24. 24

    使用每个二进制数将二进制转换为数组

  25. 25

    将二进制数据写入ostream时减少代码

  26. 26

    将十六进制字符串作为二进制数据写入新的 .mid 文件

  27. 27

    将2列数据帧转换为完整的二进制矩阵

  28. 28

    如何将列中的二进制数据转换为文件?

  29. 29

    R:根据二进制“是/否”将“宽”数据折叠为单个串联列

热门标签

归档