【问题标题】:C# SQLite 3 read text field as binary dataC# SQLite 3 将文本字段读取为二进制数据
【发布时间】:2017-04-11 20:40:26
【问题描述】:

在 SQLite 数据库中,我有这个 fruit 表:

CREATE TABLE "fruit"
(
    "fruit_id" INTEGER PRIMARY KEY,
    "fruit_name" TEXT,
    "data" TEXT,
    "ex_data" BLOB
)

现在我想循环 每一行 并将 data 字段作为 byte[] 数据:

string stm = "SELECT * FROM fruit";

using (SQLiteCommand cmd = new SQLiteCommand(stm, conn))
{
    using (SQLiteDataReader rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
            if (rdr["fruit_name"] as string == "banana")
            {
                var ex_data = (byte[])rdr["ex_data"];
                var data = (byte[])rdr["data"];        // <------------------ Error Here
                // Do something
            }
            else
            {
                // Do other things
            }
        }
    }
}

虽然data字段是typeof text,但是DB作者在里面存储了二进制数据,所以我想把值作为二进制数据取回来。

我已成功获取ex_data,但无法获取data,因为:

无法将“System.String”类型的对象转换为“System.Byte[]”类型

如果我在 SQLite 查看器中浏览表,将 data 字段的类型更改为 BLOB,我可以得到它,但由于某种原因我根本不想修改数据库。

我也试试:

var data = Encoding.ASCII.GetBytes(rdr["data"] as string);

返回不正确的数据。

问题:

如何获取data文本字段为二进制数据?

【问题讨论】:

  • 尝试 Encoding.ASCII.GetBytes(rdr["data"].ToString());
  • SELECT typeof(data) FROM fruit WHERE ... 的输出是什么?是text 还是blob
  • @CL。在表定义代码中它是TEXT 类型,所以我得到text 结果。
  • SQLite 使用dynamic typing
  • @CL。如果数据以公共字符开头,即“abc”,则返回text,否则返回blob。我在我的程序和DB Browser for SQLite 中都对其进行了测试。

标签: c# select sqlite blob


【解决方案1】:

我自己终于找到了解决方案,尽管欢迎任何其他工作解决方案:

使用GetStream方法:

    byte[] h = null;
    using (MemoryStream mm = new MemoryStream())
    {
        using (var rs = rdr.GetStream(rdr.GetOrdinal("data")))
        {
            rs.CopyTo(mm);
        }
        h = mm.ToArray();
    }

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多