我有以下对象:
[Serializable]
public class ExampleImage
{
public int ID { get; set; }
public string Filename { get; set; }
public byte[] Content { get; set; }
}
我将其存储在List<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();
}
然后我将此序列化字符串作为NTEXT
传递给 SQL2000 中的存储过程,然后将其处理以将其插入数据库中:
SELECT * INTO #TempImages
FROM OpenXML(@iDoc, '/ArrayOfExampleImage/ExampleImage')
WITH ([Filename] VARCHAR(255) './Filename', [Content] IMAGE './Content')
我遇到的问题是图像被破坏了。 btye[]
未正确保存到数据库。其他领域都很好。这是我第一次尝试通过XML将二进制数据发送到SQL,所以我很可能在这一点上做错了。我的SerializeObjectToXmlString
函数是否正常运行,并且它没有正确处理byte[]
的序列化,可能是OpenXML
SQL函数,甚至是我正在以{{{{}发送XML的事实1}} param。我希望序列化函数能够正确编码二进制文件,但我可能错了。
任何想法是什么问题,或者更好的方法一次性保存一堆图像?
编辑:我认为正在发生的事情是,序列化程序正在将NTEXT
转换为base64字符串,然后将其作为base64传递给存储过程。然后我将这个base64字符串保存到SQL中的Image字段中,并将其作为byte[]
读出。所以我想我需要以某种方式从base64到btye[]
才能将它插入我的表中?
编辑:我开始认为我唯一的选择是将存储过程更改为一次只执行1个图像而不使用XML,只需将byte[]
作为byte[]
键入并包装事务中的所有调用。
答案 0 :(得分:2)
不是将其序列化为XML,而是将其序列化为byte []并将其存储在数据库中的varbinary(MAX)类型字段中。
答案 1 :(得分: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序列化没有意义)
答案 2 :(得分:0)
您可以尝试将其转换为base64,然后将其保存到TEXT字段或其他内容。