Question

Je l'objet suivant:

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

Je stocke cela dans un List<ExampleImage> que je passe ensuite à la fonction suivante pour sérialiser à une chaîne:

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();
}

Je passe ensuite cette chaîne sérialisée à une procédure stockée dans SQL2000 en tant NTEXT qui a ensuite traité pour l'insérer dans la base de données:

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

Le problème que j'ai est l'image est de se saccagé. Le btye[] ne reçoit pas correctement enregistré à la DB. Les autres domaines sont très bien. Ceci est la première fois que je tente d'envoyer des données binaires via XML à SQL, donc je suis plus en train de faire sans doute quelque chose de mal à ce point. Ma fonction SerializeObjectToXmlString le problème et il gère pas la sérialisation d'un byte[] bien, peut-être la fonction SQL OpenXML ou même le fait que je vous envoie le XML en tant que param NTEXT. J'attends la fonction serialize pour coder le binaire correctement, mais je peux me tromper.

Toute idée est la question ou peut-être une meilleure approche pour sauver un tas d'images à la fois?

Modifier Je pense que ce qui se passe, est le sérialiseur fait la byte[] dans une chaîne base64, qui est ensuite transmis à se la procédure stockée en base64. Je puis d'enregistrer cette chaîne base64 dans un champ d'image dans SQL et de le lire comme un btye[]. Donc, je pense que je dois obtenir en quelque sorte de base64 à un byte[] avant de l'insérer dans ma table?

Modifier Je commence à penser que ma seule option est de changer la procédure stockée pour faire seulement 1 image à la fois et ne pas utiliser XML et juste passer dans le byte[] comme un type de Image et wrap tous les appels dans une transaction.

Était-ce utile?

La solution

Comme suggéré Gaidin, base64 est la meilleure option. Il est de la manière habituelle d'écrire des données binaires en XML. Vous pouvez utiliser le code suivant:

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); }
    }
}

(par ailleurs, l'attribut Serializable n'a pas de sens pour la sérialisation XML)

Autres conseils

Au lieu de sérialisation en XML, je sérialisation à un octet [] et stocker que dans le champ de type varbinary (MAX) dans votre DB.

Vous pouvez essayer de le convertir en base64, il sauver ensuite au champ TEXT ou quelque chose.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top