Frage

Ich habe folgendes Objekt:

[Serializable]
public class ExampleImage
{
    public int ID { get; set; }
    public string Filename { get; set; }
    public byte[] Content { get; set; }
}

Ich speichere diese in einem List<ExampleImage> die ich dann auf die folgende Funktion übergeben es in eine Zeichenfolge zu serialisiert:

static string SerializeObjectToXmlString(object o)
{
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(o.GetType());
    System.IO.StringWriter writer = new System.IO.StringWriter();
    serializer.Serialize(writer, o);
    return writer.ToString();
}

ich dann diese serialisierten String übergebe an eine gespeicherte Prozedur in SQL2000 als NTEXT, die zum Einfügen in die Datenbank dann behandelt:

SELECT * INTO #TempImages
FROM OpenXML(@iDoc, '/ArrayOfExampleImage/ExampleImage')
WITH ([Filename] VARCHAR(255) './Filename', [Content] IMAGE './Content')

Das Problem, das ich habe, ist das Bild im Papierkorb wird immer. Die btye[] ist nicht richtig an die DB gespeichert zu werden. Die anderen Felder sind einfach gut. Dies ist das erste Mal, dass ich versucht habe ein binären Daten über XML SQL zu senden, damit ich wahrscheinlich bin etwas falsch an dieser Stelle tun. Ist meine SerializeObjectToXmlString Funktion das Problem, und es ist die Serialisierung eines byte[] nicht richtig Handhabung, vielleicht die OpenXML SQL-Funktion oder auch die Tatsache, dass ich die XML in als NTEXT param sandte. Ich würde die Funktion Serialize erwartet, dass die binären richtig zu kodieren, aber ich könnte falsch sein.

Jede Idee, was das Problem ist, oder vielleicht ein besserer Ansatz ein paar Bilder auf einmal speichern?

Edit: Ich denke, was passiert, wird der Serializer die byte[] in einen Base64-String macht, die dann zusammen mit dem gespeicherten proc als base64 weitergegeben zu werden. Ich bin dann Speichern dieser base64 String in ein Bildfeld in SQL und es aus als btye[] lesen. Also ich glaube, ich muß es irgendwie bekommen von base64 zu einem byte[], bevor es in meiner Tabelle einfügen?

Edit: Ich beginne meine einzige Option zu denken, wird die gespeicherte Prozedur zu ändern, zu einem Zeitpunkt nur tun 1 Bild und nicht die XML verwenden und in der byte[] als Image Typ übergeben Sie einfach und Wrap alle Anrufe in einer Transaktion.

War es hilfreich?

Lösung

Wie Gaidin vorgeschlagen, base64 ist die beste Option. Es ist der üblicher Weg, binäre Daten in XML zu schreiben. Sie können den folgenden Code verwenden:

public class ExampleImage
{
    public int ID { get; set; }
    public string Filename { get; set; }

    [XmlIgnore]
    public byte[] Content { get; set; }

    [XmlElement("Content")]
    public string ContentBase64
    {
        get { return Convert.ToBase64String(Content); }
        set { Content = Convert.FromBase64String(value); }
    }
}

(übrigens, das Serializable Attribut hat keine Bedeutung für die XML-Serialisierung)

Andere Tipps

Statt es zu XML-Serialisierung, ich habe es in einem Byte Serialisierung würde [] und speichere, dass in varbinary (MAX) Typ-Feld in Ihrer DB.

Sie könnten versuchen, es zu Base64 Umwandlung, dann ist es zu TEXT-Feld oder etwas zu speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top