使用 Blob 在 SQLite 中存储字节数组
Posted
技术标签:
【中文标题】使用 Blob 在 SQLite 中存储字节数组【英文标题】:Store Byte array in SQLite using Blob 【发布时间】:2013-02-08 02:44:24 【问题描述】:对于我的应用程序,我试图在我的 SQLite 应用程序中存储一个字节数组,我正在以这种方式填充我的 SQLite 数据库:
public bool InsertMessage()
//create string SQl and fill it with the SQLite query for inserting a message.
string SQL = "Insert into ClockMessages(InsertDateTime, SendDateTime, Data) Values('"+ insertdatetime + "', null, '" + data + "');";
List<SQLiteParameter> pars = new List<SQLiteParameter>();
pars.Add(new SQLiteParameter("InsertDateTime", insertdatetime));
pars.Add(new SQLiteParameter("Data", data));
//send the SQl query and it's parameters to the SQLiteDatabase class
return SQLiteDatabase.ExecuteNonQuery(SQL, pars);
其中 InsertDateTime 是 DateTime.UtcNow,Data 是一个字节数组。此结果的输出导致字段数据包含: System.Byte[],我不能只在该字段中显示真正的字节数组,而不显示字符串吗?我在任何地方都使用 Byte[] 类型来填充数据库,因此我不会将其转换为字符串。我想在Data字段中看到这样的内容:01、54、32、23、11、02、53。数据库中Data字段的DataType是:BLOB。
谁能帮我实现这个目标?
【问题讨论】:
您没有正确使用参数。您编写的代码容易受到 sql 注入的影响。 没关系,这个数据库是本地数据库,我知道要使用它的人,除了黑客/程序员等之外,他们什么都做 这种态度是最严重的安全漏洞。 如果他们应该在该数据库中进行 SQL 注入,则没有用户可能看不到的数据,因为这是来自他自己的数据和他自己进行的设置。 我很惊讶没有人注意到他在字符串中连接insertdatetime
和 data
而不是提供参数。
【参考方案1】:
你应该在语句中使用参数:
string SQL = "INSERT INTO ClockMessages (InsertDateTime, SendDateTime, Data) VALUES (@InsertDateTime, NULL, @Data)";
其他一切似乎都是正确的。
您现在拥有的是,在insertdatetime
和data
上调用ToString()
方法并将结果连接到sql 语句。实际上你没有在语句中使用任何参数。
【讨论】:
【参考方案2】:使用带有DBType
参数的SQLiteParameter 重载:
var dataParameter = new SQLiteParameter("Data", DbType.Binary) Value = data ;
pars.Add(dataParameter);
【讨论】:
现在要测试该方法编辑:尝试此方法后的问题是 DbType.Binary 不是有效参数 你用的是什么库?是什么让您认为它不是有效参数:是否存在某种错误? 它会告诉我:参数 3:无法从 byte[] 转换为 int 抱歉,我误读了文档。你能试试上面的编辑吗? 你确定字节数组本身不包含文本'System.Byte[]'?以上是关于使用 Blob 在 SQLite 中存储字节数组的主要内容,如果未能解决你的问题,请参考以下文章
以字节数组和二进制 (BLOB) 存储图像之间的区别以及哪个更快