【问题标题】:Store Byte array in SQLite using Blob使用 Blob 在 SQLite 中存储字节数组
【发布时间】: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 注入,则没有用户可能看不到的数据,因为这是来自他自己的数据和他自己进行的设置。
  • 我很惊讶没有人注意到他在字符串中连接 insertdatetimedata 而不是提供参数。

标签: c# sql sqlite bytearray


【解决方案1】:

你应该在语句中使用参数:

string SQL = "INSERT INTO ClockMessages (InsertDateTime, SendDateTime, Data) VALUES (@InsertDateTime, NULL, @Data)";

其他一切似乎都是正确的。

您现在拥有的是,在insertdatetimedata 上调用ToString() 方法并将结果连接到sql 语句。实际上你没有在语句中使用任何参数。

【讨论】:

    【解决方案2】:

    使用带有DBType 参数的SQLiteParameter 重载:

    var dataParameter = new SQLiteParameter("Data", DbType.Binary) { Value = data };
    pars.Add(dataParameter);
    

    【讨论】:

    • 现在要测试该方法编辑:尝试此方法后的问题是 DbType.Binary 不是有效参数
    • 你用的是什么库?是什么让您认为它不是有效参数:是否存在某种错误?
    • 它会告诉我:参数 3:无法从 byte[] 转换为 int
    • 抱歉,我误读了文档。你能试试上面的编辑吗?
    • 你确定字节数组本身不包含文本'System.Byte[]'?
    猜你喜欢
    • 2011-03-23
    • 2012-11-29
    • 1970-01-01
    • 2011-04-08
    • 2010-12-09
    • 2015-10-06
    • 1970-01-01
    • 2019-04-04
    • 2015-01-10
    相关资源
    最近更新 更多