Pregunta

Tengo el objeto siguiente:

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

guardo esto en un List<ExampleImage> que luego me pase a la siguiente función para serializar en una cadena:

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

I a continuación, pasar esta cadena serializado a un procedimiento almacenado en SQL2000 como un NTEXT que luego manejado para insertarlo en la base de datos:

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

El problema que estoy teniendo es la imagen que se evita caidas. El btye[] no está siendo guardado correctamente a la base de datos. Los otros campos están bien. Esta es la primera vez que tengo intento de enviar un conjunto de datos binarios a través de XML a SQL, así que estoy muy probablemente haciendo algo mal en este punto. Es mi función SerializeObjectToXmlString el problema y no está manejando la serialización de un byte[] correctamente, puede que la función OpenXML SQL o incluso el hecho de que estoy enviando el código XML en como un parámetro NTEXT. Yo esperaría que la función serialize para codificar el binario adecuadamente, pero podría estar equivocado.

Cualquier idea de lo que es el tema o tal vez un mejor enfoque para guardar un montón de imágenes a la vez?

Editar Creo que lo que está sucediendo, se está haciendo el serializador la byte[] en una cadena de base 64, que a su vez está consiguiendo pasa al procedimiento almacenado como base 64. entonces yo estoy ahorrando esta cadena de base 64 en un campo de imagen en SQL y leerlo como un btye[]. Así que creo que tengo que conseguir de alguna manera de base 64 a un byte[] antes de insertarlo en mi mesa?

Editar Estoy empezando a pensar que mi única opción es cambiar el procedimiento almacenado que acaba de hacer 1 imagen a la vez y no utilizar XML y sólo tiene que pasar en el byte[] como un tipo Image y envoltura todas las llamadas en una transacción.

¿Fue útil?

Solución

Como sugirió Gaidin, base 64 es la mejor opción. Es la forma habitual de escribir datos binarios a XML. Usted puede utilizar el siguiente código:

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

(por cierto, el atributo Serializable no tiene ningún significado para la serialización XML)

Otros consejos

En lugar de serializar a XML, me serializarlo a un byte [] y almacenar que en varbinary (max) tipo de campo en su base de datos.

Usted podría tratar de convertirlo en base 64, y luego guardarlo en el campo de texto o algo así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top