2009-01-22 49 views
3

我必须从SQL中获取DataTable,然后将其转换为XML(我不能使用SQL XML)并保存到文件中。问题是该文件将为5 GB,并且我没有足够的内存将其全部下载,并将其全部内存转换为XML。我知道我应该可以使用DataReader将数据转换并以块的形式推送到文件流,但我不知道如何真正做到这一点。我怎样才能做到以下几点?在.NET中,将数据从SQL流式传输到文件

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

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

+0

什么类型的服务器处理多个请求? ASP.NET? Windows服务? – Kev 2009-01-23 01:27:13

回答

2

为什么你需要异步做什么?这可能表现更好,但会更复杂。

做的简单的方法:

  • 执行查询以获得一个DataReader
  • 创建的XmlWriter写入文件
  • 尝试读取一行
    • 如果有没有更多的行了,你就完成了。 (确保你关闭了写入器/连接等)
    • 如果你得到一行,把它写入XmlWriter(添加一个元素或任何你需要做的)。
  • 返回上一步。
+0

我需要它全部是异步的,以便我没有为每个请求阻塞线程。线程数可能会很大,我需要处理大量的请求。 – skb 2009-01-22 22:44:45

1

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

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

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

相关问题