Вопрос по image, c#, sqlite – Сохраните и загрузите изображение SQLite C #

10

Я пытаюсь сохранить и загрузить изображения с помощью 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 Files\Users.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, но сначала мне нужно загрузить изображение из БД. Есть идеи сделать это?

EDIT Я пытаюсь использовать блоб для сохранения изображения, как предложил Чарли. Я попробовал этот код:

Image photo = new Bitmap(@"\Photos\Image20120601_1.jpeg");
SaveImage(photo);

void SaveImage(Image pic){
string conString = @" Data Source = \Program Files\Users.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.

Любое предложение?

SOLUTION Этот код сохраняет изображение в базе данных, а затем загружает изображение, чтобы показать его в pictureBox:

namespace ImagenSQLite
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Image photo = new Bitmap(@"\Photos\Image20120601_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 Files\GPS___CAM\Data\DatosUsuarios.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 Files\Users.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   ответ
5

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;
}

Как и ваш код сохранения, мой пример кода для загрузки изображения использует только одно изображение, сохраненное в таблице. Чтобы загрузить и сохранить более одного изображения, необходимо вставить поле идентификатора в таблицу, а затем использоватьwhere пункт о вашем SQLselect заявление.

Я не уверен, что лично я сохраню изображение в виде строки в кодировке base64. Строковое представление изображения будет намного больше, чем двоичное представление.SQLite поддерживает тип данных BLOBтак что я бы хотел использовать это.

Я не спрашивал, является ли мое поле каплей, я знаю это. Я спрашивал, может ли проблема быть в том, что у меня есть поле, объявленное как blob. Я пытаюсь не использовать Base64. Я собираюсь редактировать свой пост сейчас Ignacio Gómez
Вы и только вы можете знать свою собственную схему! Я нахожу это забавным, вы спрашиваете, может быть, ваше поле является каплей !!!! Иди проверь это, лол
Если я не сохраню изображение как base64, я должен передать изображение непосредственно в базу данных? Я должен поставить & # xB4; SaveImage (Image Pic) & # xB4; и & # xB4; cmd.Parameters.Add (& quot; @ pic & quot; DbType.Binary); & # xB4 ;? Ignacio Gómez
Чарли, спасибо за твой ответ. Я попробовал ваш код, но в строке, где вы приводите читателя в строку, он ловит ошибку CastInvalidException. Это моя линияbase64EncodedImage = (string)reader["Photo"];, Может быть, я не могу успешно сохранить изображение? Ignacio Gómez
Может быть, проблема в том, что поле Photo является blob, это может быть? Ignacio Gómez

Похожие вопросы