请帮忙。我在这里阅读了一些主题,但没有得到我的问题的答案。我尝试将图像放在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));
如果我尝试使用
验证 rawDocbyte[] 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中的字符无效。为什么呢?
非常感谢!
答案 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"];
当循环遍历所有检索到的记录时,这仍然可能会被破坏,因此您最终会得到最后一条记录的图像。