Bonsoir !
Dans le cadre d'un projet, je souhaiterais sauvegarder des images en DB (Access).
Voici ma technique actuelle, mais visiblement il y a quelque chose de faux car à la fin, ça ne passe pas :
1. Je lis le fichier image sous forme de StreamReader
StreamReader streamReader = new StreamReader(new FileStream("image.jpg", FileMode.Open, FileAccess.Read));
2. Je le serialise avec une méthode ToBytes (testée dans le cas de sauvegarde d'objets en DB) et sauve le Byte[] en retour dans une row d'une DataTable ayant la même structure que la table dans laquelle j'aimerais sauvegarder l'image (le where 1=0 étant une condition impossible afin d'automatiquement obtenir la structure de la table de destination). Tous les champs requis sont remplis, mais ne sont pas repris ici pour raison de place.
1 2 3 4 5 6
|
String query = "SELECT * FROM movies WHERE 1=0";
DataTable dataTable = ADO.LoadData(query);
DataRow row = dataTable.NewRow();
row["picture"] = Serialization.ToBytes(streamReader.Read());
dataTable.Rows.Add(row); |
Contenu de la méthode ToBytes() :
1 2 3 4 5 6 7 8 9 10 11 12
|
public static byte[] ToBytes(object obj)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter b = new BinaryFormatter();
b.Serialize(ms, obj);
byte[] bytes = ms.GetBuffer();
ms.Close();
return bytes;
} |
3. Je sauvegarde ensuite le contenu de cette DataTable en DB :
1 2
|
ADO.UpdateDataTable(dataTable, query); |
contenu de la méthode UpdateDataTable() :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
public static void UpdateDataTable(DataTable dataTable, String query)
{
try
{
OleDbConnection connection = new OleDbConnection(connectionString);
connection.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(query, connection);
OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
adapter.Update(dataTable);
connection.Close();
}
catch (OleDbException e)
{
throw new ApplicationException(e.Message);
}
} |
Suite à cela, il se produit une exception "Erreur dans la clause INSERT INTO". J'ai utilisé cette technique ici car au boulot, cela fonctionne parfaitement dans le cas de la séralisation d'un objet en DB. J'ai donc essayé d'extrapoler dans le cas d'un fichier image, mais on dirait qu'il y a un twist quelque part...
Voilà, ma question et donc la suivante : que dois-je corriger dans ma technique pour que cela fonctionne ? Je suis également preneur d'éventuels conseils d'optimisation (par exemple, est-on obligé de passer par une DataTable pour sérialiser cette image ? Ne peut-on pas directement la sauvegarder d'une manière plus simple ?
Un grand merci d'avance !
A bientot
,
Tips
Partager