gpt4 book ai didi

c# - 在 SQLite 数据库中放置和检索图像

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:48 25 4
gpt4 key购买 nike

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

所以,使用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 的数据来做到这一点

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 中的无效字符。为什么?

非常感谢!

最佳答案

无需将字节数组转换为 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"];

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

关于c# - 在 SQLite 数据库中放置和检索图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com