Сохранить и загрузить изображение SQLite C#
Я пытаюсь сохранить и загрузить изображения с SQLite с приложением на WinForm с CF. Я нашел способ сохранить изображение в БД, но я не знаю, правильно ли это, потому что я не мог найти способ загрузить изображение, хранящееся в БД.
у меня есть код для преобразования моего изображения в Base64:
public void ImageToBase64(Image image, System.Drawing.Imaging.ImageFormat format){
using (MemoryStream ms = new MemoryStream()){
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);
SaveImage(base64String);
}
}
Это мой код для сохранения изображения в БД:
void SaveImage(string pic){
string query = "insert into Table (Photo) values (@pic);";
string conString = @" Data Source = Program FilesUsers.s3db ";
SQLiteConnection con = new SQLiteConnection(conString);
SQLiteCommand cmd = new SQLiteCommand(query, con);
cmd.Parameters.Add("@pic",DbType.String);
con.Open();
try{
cmd.ExecuteNonQuery();
}
catch (Exception exc1){
MessageBox.Show(exc1.Message);
}
con.Close();
}
у меня есть код, чтобы сделать противоположность ImageToBase64, но сначала мне нужно загрузить изображение из БД. Есть идеи сделать это?
редактировать я пытаюсь использовать blob для сохранения изображения сейчас, как предложил Чарли. Я попробовал этот код:
Image photo = new Bitmap(@"PhotosImage20120601_1.jpeg");
SaveImage(photo);
void SaveImage(Image pic){
string conString = @" Data Source = Program FilesUsers.s3db ";
SQLiteConnection con = new SQLiteConnection(conString);
SQLiteCommand cmd = con.CreateCommand();
cmd.CommandText = String.Format("INSERT INTO Table (Photo) VALUES (@0);");
SQLiteParameter param = new SQLiteParameter("@0", System.Data.DbType.Binary);
param.Value = pic;
cmd.Parameters.Add(param);
con.Open();
try{
cmd.ExecuteNonQuery();
}
catch (Exception exc1){
MessageBox.Show(exc1.Message);
}
con.Close();}
но, когда я ExcecuteNonQuery () это поймать ошибку InvalidCastException.
любой предлагаешь?
решение этот код сохраняет изображение в базе данных, а затем загружает изображение, чтобы показать его в pictureBox:
namespace ImagenSQLite
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Image photo = new Bitmap(@"PhotosImage20120601_1.jpeg");
byte[] pic = ImageToByte(photo, System.Drawing.Imaging.ImageFormat.Jpeg);
SaveImage(pic);
LoadImage();
}
public byte[] ImageToByte(Image image, System.Drawing.Imaging.ImageFormat format){
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
return imageBytes;
}
}
//public Image Base64ToImage(string base64String)
public Image ByteToImage(byte[] imageBytes)
{
// Convert byte[] to Image
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = new Bitmap(ms);
return image;
}
/***************** SQLite **************************/
void SaveImage(byte[] imagen){
string conStringDatosUsuarios = @" Data Source = Program FilesGPS___CAMDataDatosUsuarios.s3db ";
SQLiteConnection con = new SQLiteConnection(conStringDatosUsuarios);
SQLiteCommand cmd = con.CreateCommand();
cmd.CommandText = String.Format("INSERT INTO Empleados (Foto) VALUES (@0);");
SQLiteParameter param = new SQLiteParameter("@0", System.Data.DbType.Binary);
param.Value = imagen;
cmd.Parameters.Add(param);
con.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception exc1)
{
MessageBox.Show(exc1.Message);
}
con.Close();
}
void LoadImage(){
string query = "SELECT Photo FROM Table WHERE ID='5';";
string conString = @" Data Source = Program FilesUsers.s3db ";
SQLiteConnection con = new SQLiteConnection(conString);
SQLiteCommand cmd = new SQLiteCommand(query, con);
con.Open();
try
{
IDataReader rdr = cmd.ExecuteReader();
try
{
while (rdr.Read())
{
byte[] a = (System.Byte[])rdr[0];
pictureBox1.Image = ByteToImage(a);
}
}
catch (Exception exc) { MessageBox.Show(exc.Message); }
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
con.Close();
}
}
}
спасибо твоя помощь!
1 ответов
чтобы загрузить изображение из базы данных, вы используете SQL select
оператор для возврата данных, как и для любых других данных. Образ в кодировке base64 хранится в виде строки в базе данных SQLite. Таким образом, вы получите его как строку, как если бы вы хранили любую другую строку (например, ваше имя) в базе данных.
string LoadImage() {
string query = "select Photo from Table;";
string conString = @" Data Source = \Program Files\Users.s3db ";
SQLiteConnection con = new SQLiteConnection(conString);
SQLiteCommand cmd = new SQLiteCommand(query, con);
string base64EncodedImage = null;
con.Open();
try {
IDataReader reader = cmd.ExecuteReader();
reader.Read(); // advance the data reader to the first row
base64EncodedImage = (string) reader["Photo"];
reader.Close();
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
con.Close();
return base64EncodedImage;
}
как и ваш код сохранения, мой пример кода для загрузки изображения использует только одно изображение, сохраненное в таблице. Чтобы загрузить и сохранить больше чем одно изображение, вам нужно будет вставить поле ID в таблицу, а затем использовать where
предложение на вашем SQL select
заявление.
Я не уверен, что я лично буду хранить изображение как строку, закодированную в base64. Строковое представление изображения будет намного больше двоичного представления. SQLite поддерживает тип данных BLOB, поэтому я бы посмотрел на использование этого.