【发布时间】: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中都对其进行了测试。