7
votes

Conversion d'un objet Image OLE de MS Access pour une utilisation dans .NET

Je travaille sur le réaménagement d'un système basé sur l'accès à C # .NET, cependant, lorsque MS est passé d'Office 2003 à Office 2007, ils ont supprimé l'éditeur de photos dans l'accès - ce qui signifiait que des images stockées précédemment ne s'affichent plus dans le système. Les gars de la société ont fait un piratage qui a essentiellement sauvé les images avec VBA avec Excel à l'aide de l'arrière-plan (je peux obtenir plus d'informations si vous en avez besoin) mais cela signifiait que les commandes d'image d'accès peuvent toujours être utilisées (cadres liés à l'objet).

Cependant, j'ai maintenant le problème d'essayer de les afficher dans les applications .NET et, après d'innombrables jours d'essayer différentes manières de manipuler le réseau d'octets, je suis proche de l'abandon. J'ai essayé au moins 8 solutions suggérées différentes et chacune se termine par un "paramètre non reconnu" d'une exception lors de l'image.fromstream (). Vous trouverez ci-dessous le code qui m'a reçu le plus proche jusqu'à présent: xxx

Ce code a été adapté de ICI , je n'avais pas besoin de l'identification des différents doctypes, car je ne traite que des images, mais le type d'image pourrait être n'importe quel Nombre de choses - JPG, BMP, GIF, PNG, etc.

J'ai également essayé d'enregistrer le tableau d'octets sortidé, mais je n'ai pas eu de chance qui n'a pas été de la chance. Mais lorsque je pointe l'accès à la base de données et faites-le à la voir, tout va bien. De plus, le concepteur de rapports de cristal .NET est capable d'obtenir ces images comment - ils doivent donc être là quelque part ...

a des idées?

Marlon


0 commentaires

5 Réponses :



0
votes

Essayez ce kb http://support.microsoft.com/kb/317701 article de Microsoft. Il contient des informations sur la manière d'accéder à l'image BLOB à partir de l'accès et d'afficher l'application WinForms.


1 commentaires

Merci pour les informations mais je pense que vous comprenez malgré le problème. Cet article explique simplement comment stocker un fichier image dans une base de données. Pas comment convertir un objet OLE déjà stocké à une image. Apparemment, ole est juste magique ...



1
votes

Ce n'est pas le code C # mais voici un Exemple Delphi d'un moyen de résoudre ce problème.

Il utilise le ioleObject pour dessiner Tout ce qui est stocké au lieu d'essayer de lire les données brutes. Étapes:

  1. Lire l'en-tête d'accès devant l'objet OLE
  2. lire le flux OLE1
  3. Convertissez le flux OLE1 en Ole2 Istorage objet
  4. Utilisez oléload à "Run" l'ole ojbect.
  5. appelez OLEDRAW pour dessiner le image à une toile de votre choix.

0 commentaires

1
votes

Dans mon cas, la fonction suivante a fonctionné. Les données sont stockées par une application VB6.

public static byte[] ConvertOleBytesToRawBytes(byte[] oleBytes)
{
   // The default encoding is in my case - Western European (Windows), Code Page 1252
   return Encoding.Convert(Encoding.Unicode, Encoding.Default, (byte[])oleBytes);
}


0 commentaires

0
votes

Je devais faire exactement la même chose pour quelque 1 1600 objet de différents types d'extension. Dans mon cas, c'était une base de données héritée qui avait été littéralement utilisée depuis des décennies. Au fil des années, de nombreux types de fichiers ont été ajoutés via un cadre d'objet OLE. Certains des articles qui ressemblaient à des "images" se sont avérés sur des documents Word avec une image intégrée ... NON avoir dit quels autres types de fichiers étaient là? Tout ce que je sais, c'est que j'ai étudié et essayé différentes méthodes d'extraction pendant plus d'une semaine. Même tous Outils d'extraction Steven Leban tels que OLETODISK, A2KEXPORTOLETOJPEG et SauvedOutObitMap. Chacun d'entre eux extraire des images ... Mais leur taille n'était pas une taille unique qui convient à tous ... c'était un gâchis!

À la fin, j'ai fini par effectuer une prise d'écran automatisée de chaque image via VBA en utilisant la méthode ci-dessous. Bien que cela n'ait pas été le plus idéal, il fonctionnait pour chaque type de fichier. Cependant, la méthode de prise d'écran capture une prise d'écran de l'écran complet. Une fois que tous les autres ont été extraits, j'ai ensuite dû utiliser Photoshop pour faire un autre processus automatisé à la récolte de lots toutes les photos. Pas idéal mais cela a fonctionné! P>

Private Sub CaptureAllImages()
    On Error Resume Next
    Me.RecordsetClone.MoveFirst
    Do While Not Me.RecordsetClone.EOF
        Me.Bookmark = Me.RecordsetClone.Bookmark
        Call Pause(2)
        Call SaveClip2Bit("C:\Users\agriggs\Desktop\Parts Images\MasterPart_" & Me.MasterPartNumber & ".bmp")
        Me.RecordsetClone.MoveNext
    Loop

End Sub

Public Function Pause(NumberOfSeconds As Variant)
    On Error GoTo Error_GoTo

    Dim PauseTime As Variant
    Dim start As Variant
    Dim Elapsed As Variant

    PauseTime = NumberOfSeconds
    start = Timer
    Elapsed = 0
    Do While Timer < start + PauseTime
        Elapsed = Elapsed + 1
        If Timer = 0 Then
            ' Crossing midnight
            PauseTime = PauseTime - Elapsed
            start = 0
            Elapsed = 0
        End If
        DoEvents
    Loop

Exit_GoTo:
    On Error GoTo 0
    Exit Function
Error_GoTo:
    Debug.Print Err.Number, Err.Description, Erl
    GoTo Exit_GoTo
End Function


0 commentaires