Enregistrer et Charger l'image SQLite C#
Je suis en train de charger et d'enregistrer des images avec SQLite avec une application sur WinForm avec CF. J'ai trouvé un moyen pour enregistrer une image dans la base mais je ne sais pas si c'est juste parce que je ne pouvais pas trouver un moyen de charger l'image stockée dans la base de données.
J'ai un code pour convertir mon image en 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);
}
}
C'est mon code pour enregistrer l'image dans la base:
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();
}
J'ai un code pour faire le contraire de ImageToBase64 mais d'abord, j'ai besoin de charger l'image à partir de la db. Toute idée?
MODIFIER je suis en train d'utiliser le blob pour enregistrer l'image maintenant que Charlie a suggéré. J'ai essayé ce 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();}
Mais quand je ExcecuteNonQuery() attraper une erreur de InvalidCastException.
Toute suggérer?
SOLUTION Ce code d'enregistrer une image dans la base de données et puis il charge l'image pour l'afficher dans une 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();
}
}
}
Merci pour votre aide!
OriginalL'auteur Ignacio Gómez | 2012-06-01
Vous devez vous connecter pour publier un commentaire.
Pour charger l'image à partir de la base de données, vous utilisez SQL
select
pour obtenir les données de retour, tout comme vous le feriez pour tout autre type de données. Le base64 image est stockée comme une chaîne de caractères dans la base de données SQLite. Donc, vous permettra de récupérer sous forme de chaîne, juste comme si vous étiez le stockage de n'importe quelle autre chaîne (comme, par exemple, votre nom) dans la base de données.Comme votre épargne code, mon exemple de code pour charger l'image n'utilise qu'une seule image enregistrée à la table. De charger et d'enregistrer plus d'une image, vous devez insérer un champ ID dans la table, et ensuite utiliser un
where
clause SQLselect
déclaration.Je ne suis pas sûr que j'ai, personnellement, serait de stocker l'image en tant que chaîne base64. La représentation sous forme de chaîne de l'image sera beaucoup plus grand que la représentation binaire. SQLite prend en charge le type de données BLOB, donc je veux le regarder dans l'aide que.
base64EncodedImage = (string)reader["Photo"];
. Peut-être que je ne suis pas d'économie avec succès l'image, pourrait-il être?Peut-être le problème, c'est que la Photo champ blob, peut-être?
Si je n'enregistre pas l'image en base64 je dois passer de l'image directement à la base de données? Je devrais mettre SaveImage(Image Pic) et cmd.Les paramètres.Add("@pic",DbType.Binaire);?
Vous et vous seul pouvez connaître votre propre schéma!! Je trouve ça hilarant vous demandez si peut-être votre champ est une goutte!!!! Allez-y, lol
Je n'étais pas en train de demander si mon champ blob, je le sais. Je me demande si le problème pourrait-il être parce que j'ai le champ déclarée comme blob. J'essaie de ne pas utiliser le Base64. Je vais modifier mon post maintenant
OriginalL'auteur Charlie Kilian