我有以下对象:
[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[]
正确处理序列化,可能是OpenXML
SQL 函数,甚至是我将 XML 作为NTEXT
参数发送的事实。我希望序列化函数能够正确编码二进制文件,但我可能是错的。
知道问题是什么,或者可能是一次保存一堆图像的更好方法吗?
编辑:我认为正在发生的事情是,序列化程序正在将其byte[]
转换为 base64 字符串,然后将其作为 base64 传递给存储的 proc。然后,我将此 base64 字符串保存到 SQL 中的 Image 字段中,并将其作为btye[]
. 所以我认为我需要以某种方式将它从 base64 到 a byte[]
,然后再将其插入我的表中?
编辑:我开始认为我唯一的选择是将存储的过程更改为一次只执行 1 个图像而不使用 XML,而只是将其byte[]
作为Image
类型传入并将所有调用包装在事务中。