title: Save and Load image SQLite C#
body: <p>I'm trying to save and load images with SQLite with an app on WinForm with CF. I found a way to save an image into the db but I don't know if it's right because I couldn't find a way to load the image stored in the db. </p>
  
  <p>I have a code to convert my image into a Base64:</p>
  
  <pre><code>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);
          }
      }
  </code></pre>
  
  <p>This is my code to save the image into the db:</p>
  
  <pre><code>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();
      }
  </code></pre>
  
  <p>I have a code to make the opposite of ImageToBase64 but first I need to load the image from the db. Any idea to do that?</p>
  
  <p><strong>EDIT</strong> I am trying to use the blob to save the image now as Charlie suggested. I tried this code:</p>
  
  <pre><code>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();}
  </code></pre>
  
  <p>But when I <em>ExcecuteNonQuery()</em> it catch an error of <em>InvalidCastException</em>.</p>
  
  <p>Any suggest?</p>
  
  <p><strong>SOLUTION</strong> This code save an image into the database and then it load the image to show it in a pictureBox:</p>
  
  <pre><code>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();
          }       
      }
  }
  </code></pre>
  
  <p>Thanks for your help!</p>