1

我有以下对象:

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

我将其存储在 aList<ExampleImage>中,然后将其传递给以下函数以将其序列化为字符串:

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

然后,我将此序列化字符串传递给SQL2000中的存储过程NTEXT,然后将其插入数据库中:

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

我遇到的问题是图像被破坏了。btye[]没有正确保存到数据库中。其他领域都很好。这是我第一次尝试通过 XML 向 SQL 发送二进制数据,所以我现在很可能做错了什么。我的SerializeObjectToXmlString函数是问题吗,它没有byte[]正确处理序列化,可能是OpenXMLSQL 函数,甚至是我将 XML 作为NTEXT参数发送的事实。我希望序列化函数能够正确编码二进制文件,但我可能是错的。

知道问题是什么,或者可能是一次保存一堆图像的更好方法吗?

编辑:我认为正在发生的事情是,序列化程序正在将其byte[]转换为 base64 字符串,然后将其作为 base64 传递给存储的 proc。然后,我将此 base64 字符串保存到 SQL 中的 Image 字段中,并将其作为btye[]. 所以我认为我需要以某种方式将它从 base64 到 a byte[],然后再将其插入我的表中?

编辑:我开始认为我唯一的选择是将存储的过程更改为一次只执行 1 个图像而不使用 XML,而只是将其byte[]作为Image类型传入并将所有调用包装在事务中。

4

3 回答 3

2

我不会将其序列化为 XML,而是将其序列化为 byte[] 并将其存储在数据库中的 varbinary(MAX) 类型字段中。

于 2009-08-12T17:32:06.573 回答
2

正如 Gaidin 所建议的,base64 是最好的选择。这是将二进制数据写入 XML 的常用方法。您可以使用以下代码:

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

(顺便说一下,该Serializable属性对于XML序列化没有意义)

于 2009-08-12T22:42:38.100 回答
0

您可以尝试将其转换为 base64,然后将其保存到 TEXT 字段或其他内容。

于 2009-08-12T22:32:06.687 回答