2008-10-20 8 views
3

J'ai essayé de lire une image enregistrée dans Access DB en tant qu'objet OLE dans un PictureBox dans une application Windows C#.Lire une image d'Access DB dans PictureBox

Le code qui fait cela est présenté ci-dessous:

 string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Rajesh\SampleDB_2003.mdb;"; 
     OleDbConnection oConn = new OleDbConnection(connString); 
     oConn.Open(); 
     string commandString = "select * from employee where id = " + id + ""; 
     OleDbCommand oCmd = new OleDbCommand(commandString, oConn); 
     OleDbDataReader oReader = oCmd.ExecuteReader(CommandBehavior.SequentialAccess); 

     while (oReader.Read()) 
     { 
      txtID.Text = ((int)oReader.GetValue(0)).ToString(); 
      txtName.Text = (string)oReader.GetValue(1); 
      txtAge.Text = ((int)oReader.GetValue(2)).ToString(); 
      txtType.Text = (string)oReader.GetValue(3); 
      byte[] imageBytes = (byte[])oReader.GetValue(4); 

      MemoryStream ms = new MemoryStream(); 
      ms.Write(imageBytes, 0, imageBytes.Length); 
      Bitmap bmp = new Bitmap(ms); 
      pbPassport.Image = bmp; 
     } 

Lorsque j'exécute le code ci-dessus, une exception « paramètre n'est pas » est jeté à la ligne:

Bitmap bmp = new Bitmap(ms) 

De la message d'exception, il est clair que ms est dans un format qui n'est pas reconnaissable. Une suggestion pour passer cela?

Répondre

-1

Votre bytestream est corrompu en quelque sorte, parce que j'ai essayé la méthode exacte de votre mais rempli le tableau d'octets avec des données PNG à partir d'un fichier à la place.

Je suggère de créer deux flux, un de la base de données, et un du fichier qui était la source de l'image dans la base de données. Puis comparez les octets par octet. S'il y a même un octet de différence, les données d'image de base de données sont corrompues.

0

Malheureusement, je n'ai pas de bonne réponse pour vous, mais je peux vous dire que lorsque j'ai essayé, j'ai eu les mêmes résultats. Parfois, sauter les 78 premiers octets du tableau d'octets fonctionnait, parfois non. Cela est dû au fait que le type de données OLE Object stocke une sorte d'en-tête dans le champ, afin qu'Access connaisse le type d'objet OLE. Je ne pouvais pas trouver un moyen fiable de déterminer exactement où cet en-tête s'est arrêté et les données réelles ont commencé, mais j'ai aussi abandonné, donc bonne chance :)

0

Vous pouvez essayer:

pbPassport.Image = Image.FromStream(ms); 
1

Faites une recherche Google pour AccessHdr. Vous trouverez des références à AccessHdr.cpp et AccessHdr.h. Ceux-ci illustreront ce qui est nécessaire pour extraire les flux sans l'en-tête.

1

Vous ne pouvez pas lire des objets OLE si facilement. En fait, il est mauvais de conserver les images en tant qu'objets OLE dans la base de données.

Il est préférable d'avoir em en tant qu'objets BLOB ou chemin et nom de fichier à un certain niveau de stockage. AccessImagine peut gérer les deux scénarios pour MS Access et C#. Vous pouvez le télécharger ici - http://access.bukrek.net