在SQLite数据库中放置和反转图像

时间:2011-07-10 16:09:58

标签: c# sqlite

请帮忙。我在这里阅读了一些主题,但没有得到我的问题的答案。我尝试将图像放在BLOB类型的SQLite DB中,然后将其检索,但它失败了。

所以,使用 rawDoc = File.ReadAllBytes(openFileDialog.FileName); 我得到某些图像(或其他文件)的 byte [] rawDoc 。然后

String dbConnection = "Data Source=dbase.s3db";
SQLiteConnection cnn = new SQLiteConnection(dbConnection);
cnn.Open();
String sql = String.Format("INSERT INTO registry" +
            "(NameDoc, YearDoc, MonthDoc, DayDoc, RawDoc) VALUES" +
            "('{0}', '{1}', '{2}', '{3}', '{4}')",
            txtNameDoc.Text, numUDYear.Value, numUDD.Value, numUDD.Value, Convert.ToBase64String(rawDoc));

如果我尝试使用

验证 rawDoc
byte[] imageBytes = Convert.FromBase64String(testRaw);
        MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
        ms.Write(imageBytes, 0, imageBytes.Length);
        pictureBox1.Image = Image.FromStream(ms, true);

我得到正常的照片。但是,如果我尝试使用SQLite base with

的数据
SQLiteCommand myCommand = new SQLiteCommand(query, cnn);
        SQLiteDataReader myDataReader = myCommand.ExecuteReader();

        string raw = null;
        while (myDataReader.Read())
        {
           raw += myDataReader["RawDoc"].ToString().Trim();

        }

        myDataReader.Close();
byte[] imageBytes = Convert.FromBase64String(raw);
        MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
        ms.Write(imageBytes, 0, imageBytes.Length);

        imageBox imgbox = new imageBox();
        PictureBox picBox = new PictureBox();
        picBox.Image = Image.FromStream(ms, true);
        imgbox.Controls.Add(picBox);
        imgbox.Show();

我收到错误:FormatException。字符串Base-64中的字符无效。为什么呢?

非常感谢!

1 个答案:

答案 0 :(得分:2)

无需将字节数组转换为base 64字符串。您最终将在数据库中使用更多空间。此外,您实际上将在您的sqlite数据库中拥有TEXT数据,而不是BLOB。

你需要做的是使用SqliteParameters,例如插入你的BLOB,你可以这样做:

SQLiteCommand command = cnn.CreateCommand();
command.CommandText = String.Format("INSERT INTO registry" +
        "(NameDoc, YearDoc, MonthDoc, DayDoc, RawDoc) VALUES" +
        "('{0}', '{1}', '{2}', '{3}', @0)",
        txtNameDoc.Text, numUDYear.Value, numUDD.Value, numUDD.Value);
SQLiteParameter parameter = new Parameter("@0", System.Data.DbType.Binary);
parameter.Value = rawDoc;
command.Parameters.Add(parameter);
command.ExecuteNonQuery();

当您检索BLOB时,以这种方式从SQliteDataReader获取它:

byte[] imageBytes = (System.Byte[])myDataReader["RawDoc"];

修改

要回答你的评论,我猜你的流需要重新加入。在任何情况下,我都是这样做的:

    MemoryStream ms = new MemoryStream(imageBytes);
    PictureBox picBox = new PictureBox();
    picBox.Image = Image.FromStream(ms, true);

编辑2

然后我认为问题在于如何从DataReader中检索;尝试更像这样的事情:

    string raw = "";
    while (myDataReader.Read())
       raw = (string)myDataReader["RawDoc"];

当循环遍历所有检索到的记录时,这仍然可能会被破坏,因此您最终会得到最后一条记录的图像。