2012-06-01 15 views
8

मैं सीएफ के साथ WinForm पर एक ऐप के साथ SQLite के साथ छवियों को सहेजने और लोड करने का प्रयास कर रहा हूं। मुझे डीबी में एक छवि को सहेजने का एक तरीका मिला लेकिन मुझे नहीं पता कि यह सही है क्योंकि मुझे डीबी में संग्रहीत छवि को लोड करने का कोई तरीका नहीं मिला।छवि को सहेजें और लोड करें SQLite C#

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

मैं विपरीत बनाने के लिए एक कोड है:

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

इस डाटाबेस में छवि को बचाने के लिए मेरी कोड है:

मैं एक Base64 में मेरी छवि परिवर्तित करने के लिए एक कोड है 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 की एक त्रुटि पकड़ने: मैं इस कोड की कोशिश की।

कोई सुझाव?

समाधान इस कोड को डेटाबेस में एक छवि बचाने के लिए और फिर इसे छवि को लोड एक 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(); 
     }  
    } 
} 

आपकी मदद के लिए धन्यवाद!

उत्तर

4

डेटाबेस से छवि लोड करने के लिए, आप डेटा को वापस पाने के लिए SQL select कथन का उपयोग करते हैं, जैसा कि आप किसी अन्य प्रकार के डेटा के लिए करेंगे। बेस 64-एन्कोडेड छवि को 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; 
} 

अपने बचत कोड की तरह, छवि लोड करने के लिए मेरा उदाहरण कोड तालिका में सहेजी गई केवल एक छवि का उपयोग करता है। एक से अधिक छवियों को लोड और सहेजने के लिए, आपको तालिका में एक आईडी फ़ील्ड डालना होगा, और फिर अपने SQL select कथन पर where खंड का उपयोग करना होगा।


मुझे यकीन नहीं है कि मैं व्यक्तिगत रूप से छवि को आधार 64-एन्कोडेड स्ट्रिंग के रूप में संग्रहीत करूंगा। छवि का स्ट्रिंग प्रस्तुति द्विआधारी प्रतिनिधित्व से कहीं अधिक बड़ी होगी। SQLite supports the BLOB data type, इसलिए मैं इसका उपयोग करने में देखता हूं।

+0

चार्ली, आपके उत्तर के लिए धन्यवाद। मैंने आपके कोड की कोशिश की लेकिन उस लाइन में जहां आपने पाठक को स्ट्रिंग में डाला था, यह CastInvalidException की त्रुटि को पकड़ता है। यह मेरी लाइन 'base64EncodedImage = (स्ट्रिंग) पाठक है ["फोटो"]; '। शायद मैं सफलतापूर्वक छवि को सहेज नहीं रहा हूं, क्या यह हो सकता है? –

+0

शायद समस्या यह है कि फोटो फ़ील्ड ब्लॉब है, क्या वह हो सकता है? –

+0

अगर मैं तस्वीर को बेस 64 के रूप में संग्रहीत नहीं करता हूं तो मुझे छवि को सीधे डेटाबेस में पास करना चाहिए? मुझे 'सेव इमेज (छवि Pic)' और'cmd.Parameters.Add ("@ pic", DbType.Binary) डालना चाहिए; '? –

संबंधित मुद्दे