3

我必须从 SQL 中获取 DataTable,然后将其转换为 XML(我不能使用 SQL XML)并保存到文件中。问题是该文件将是 5 GB,我没有足够的内存来下载它并在内存中一次将其转换为 XML。我知道我应该能够使用 DataReader 将数据分块转换并推送到文件流,但我不知道如何真正做到这一点。我该怎么做?

  1. 异步连接到 SQL 服务器
  2. 异步调用存储过程
  3. 从 DataReader 异步读取数据
  4. 将数据从 DataReader 转换为 XML 并异步保存到文件

这一切都必须是异步的,因为它在处理多个请求的服务器上,我们不能为每个请求设置一个线程阻塞。

4

3 回答 3

2

为什么需要异步执行任何操作?这可能会表现得更好,但会复杂得多。

这样做的简单方法:

  • 执行查询以获取 DataReader
  • 创建一个写入文件的 XmlWriter
  • 尝试读取一行
    • 如果没有更多的行了,你就完成了。(确保关闭编写器/连接等)
    • 如果确实得到一行,请将其写入 XmlWriter(添加一个元素或您需要做的任何事情)。
  • 返回上一步。
于 2009-01-22T18:39:32.073 回答
1

大行 (BLOB) 少,还是小行多?对于大型 BLOB,这两篇文章包含从 C# 以流方式处理 SQL Server BLOB 所需的代码:

第一个处理普通 BLOB,第二个处理 FILESTREAM BLOB。

对于许多小行,您不需要任何花哨的东西,只需打开阅读器并开始流式传输到您的 XmlWriter 中。唯一可以异步的部分是初始查询执行,一旦结果开始返回,您的回调将完成并且读取结果 SqlDataReader 是一个同步操作。这意味着线程在结果读取和 XML 文件写入的整个持续时间内被阻塞,根本没有 ADO.Net API 可以避免这个问题。您担心这会导致问题(它会)是对的,但我不得不问:为什么您的系统要对 XML 文件进行如此大的下载?是否要将结果序列化回 HTTP 响应?

于 2011-07-26T20:59:39.930 回答
0

你需要的是一个XmlWriter

于 2009-01-22T18:39:12.213 回答