Question

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 #.

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 non valide" est renvoyée à la ligne:

Bitmap bmp = new Bitmap(ms)

D'après le message d'exception, il est clair que "ms" est dans un format non reconnaissable. Une suggestion pour dépasser cela?

Était-ce utile?

La solution

Votre bytestream est corrompu d'une manière ou d'une autre, car j'ai essayé la méthode exacte mais en remplissant le tableau d'octets avec les données PNG d'un fichier.

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

Autres conseils

Malheureusement, je n'ai pas de bonne réponse à vous donner, 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 d'objet OLE stocke une sorte d'en-tête dans le champ afin qu'Access sache de quel type d'objet OLE il s'agit. Je ne trouvais pas de moyen fiable de déterminer exactement où cet en-tête s’arrêtait et où les données réelles commençaient, mais j’ai aussi abandonné, alors bonne chance:)

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

Vous ne pouvez pas lire les objets OLE aussi facilement. En fait, il est déconseillé 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 dans certains emplacements 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

Vous pouvez essayer:

pbPassport.Image = Image.FromStream(ms);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top