【问题标题】:Deserializing SQL varbinary in form of XML to C# byte[]将 XML 形式的 SQL varbinary 反序列化为 C# byte[]
【发布时间】:2013-08-07 20:47:12
【问题描述】:

我正在做一个小型的概念验证项目,其中客户端以byte[] 格式发送图像文件,服务器将数据插入到Image 列中的数据库中,即VarBinary(MAX)。这部分工作正常,但是,我在尝试将数据转换回字节数组并将其发送到客户端时遇到问题。

在数据库中,有一个存储过程负责获取数据并以 XML 形式返回:

SELECT 
    ...
    asset.Image AS 'Image'
FROM ASSETS AS asset
WHERE asset.Id = @Id
FOR XML PATH('Asset')

示例查询结果如下所示(Image 的实际值实际上比这长得多,但我将其缩短以使其更具可读性):

<Asset>
  ...
  <Image>/9j/4AAQSkZJRgABAQEAYABgAAD/2wB</Image>
</Asset>

在代码中,我有一个通用方法,可以将此 XML 反序列化为相应的对象:

internal static T ExecuteQuery<T>(StoredProcedures storedProcedure, ParameterList parameters)
    {
        using (var connection = GetSqlConnection())
        {
            using (var command = new SqlCommand(storedProcedure.ToString(), connection))
            {
                command.CommandType = System.Data.CommandType.StoredProcedure;

                foreach (var parameter in parameters)
                {
                    command.Parameters.Add(new SqlParameter(parameter.Key.ToString(), parameter.Value));
                }

                connection.Open();

                var data = command.ExecuteScalar();

                return DeserializeXml<T>(data.ToString());
            }
        }

Asset 类型(我将它传递给这个泛型方法的类型有几个属性,其中之一是Image

public class Asset
{
    public Asset()
    {
    }

    ...

    [DataMember]
    [XmlElement("Image")]
    public byte[] Image { get; set; }
}

现在当我执行程序时,我得到这个错误:

 There is an error in XML document

似乎反序列化器的 VarBinary 值存在问题(在我添加此 Image 属性之前它曾经正常工作)。任何想法为什么会发生这种情况?我需要使用内存流将数据转换回来吗?

【问题讨论】:

    标签: c# xml sql-server-2008 bytearray xml-deserialization


    【解决方案1】:

    您可能想看看如何将 XML 保存到数据库中。如果 byte order mark 与 XML 一起保存到数据库中,则 XML 反序列化将失败(通常是这种情况,具体取决于您的操作方式)。

    请参阅this similar question,了解如何在将 XML 数据保存到数据库时消除字节顺序标记。

    【讨论】:

    • 我没有将 XML 保存到数据库中,我只是从数据库中返回一个 XML。看看我的存储过程。
    • 我意识到这一点,但在某个时候 XML 被插入到数据库中。如果它是与 BOM 一起插入的,则在尝试检索它时会遇到问题。
    • XML 从未插入到数据库中,它是从存储过程调用中的列生成并返回的。
    • 啊,好吧,我的错了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多