【问题标题】:Read UTF8(XML) Data from SQL Server 2005 the most efficient way从 SQL Server 2005 读取 UTF8(XML) 数据最有效的方法
【发布时间】:2009-08-05 02:29:43
【问题描述】:

我想从 SQL Server 2005 中读取大量数据(单列 nvarchar(max))并将其反序列化为一个对象。我们目前正在使用以下方法,但这还不够快,是否有更好/有效的方法来做到这一点?

using(MemoryStream stream = Encoding.UTF8.GetBytes((string)cmd.ExecuteScalar()))
{
  XmlTextReader xmlReader;
  DataContractSerializer deserializer;

  deserializer = new DataContractSerializer(typeToDeserialize);
  xmlReader = new XmlTextReader(stream);
  return deserializer.ReadObject(xmlReader);
} 

我也尝试过使用 SqlDataReader 和 GetBytes 来执行此操作,但后来出现异常。

提前感谢。

【问题讨论】:

    标签: c# sql xml streaming serialization


    【解决方案1】:

    您可以选择切换到使用XML 数据类型吗?它以二进制格式存储数据,并将XML 结果公开为XmlReader 实例。当您从数据库中读取数据时,您正在解析数据,但如果您使用了 XML 列,则它已经被解析了。

    与此同时,尝试这样的事情:

    string s;
    using (SqlConnection conn = new SqlConnection(""))
    {
        using (SqlCommand cmd = new SqlCommand("", conn))
        {
            s = (string) cmd.ExecuteScalar();
        }
    }
    using (StringReader sr = new StringReader(s))
    {
        using (XmlReader reader = XmlReader.Create(sr))
        {
            DataContractSerializer deserializer = 
               new DataContractSerializer(typeToDeserialize);
            return deserializer.ReadObject(reader);
        }
    }
    
    1. 不要再使用XmlTextReader。
    2. 为什么要将字符串转换为字节然后再转换回字符串?

    【讨论】:

    • Johnthanx 我要试试这个。我会告诉你的
    • 奇怪的问题是从查询结果到 .NET 框架的延迟(查询的持续时间为 0 毫秒,并且没有网络延迟)。在我们的服务器(VM-ware)上,我平均获得 400 条记录 p/s 单线程(2K xml),处理器速率最高为 5%。这是通过一个空的 do while 循环来完成的。
    【解决方案2】:

    我自己没有对此进行测试,但是调用 GetSqlBytes 的 SqlDataReader 似乎是一个更好的选择,因为它公开了一个 Stream 属性,您应该能够直接将其传递给 XmlTextReader?

    MSDN上有一些关于GetSqlByteshere的信息。

    【讨论】:

      猜你喜欢
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多