c# OutOfMemoryException当我使用一个数据表从SqlDataReader加载数据



我写了下面的代码:

SqlConnection Conn = new SqlConnection("ConnectionString");
SqlCommand cmd = new SqlCommand("select * from tablename", conn);
SqlDataReader dr = cmd.ExecuteReader();
datatable dt = new datatable();
dt.load(dr);

但是,当我将数据加载到数据表中时,我得到了一个异常,如下所示,因为我有一个大尺寸(102 MB)的xml列。

类型为"System"的异常。OutOfMemoryException'被抛出。

如果有人能给我这个例外的解决方案,我将非常感激。

解决你的问题:

  1. 要么规范化数据库,这样存储的不是原始XML,而是适当的关系模型。这就是SQL的基本工作原理。希望这能解决你的问题。
  2. 然而,无论您的数据库规范化得多好,都存在一些限制,超过这些限制,数据就不适合可用内存。如果这是你的情况,你需要放弃强硬的select *方式,并重新实现它在fetch-next-batch大小,即重复获取固定预定义大小的批次,处理它们,标记为已处理,然后继续。

这是一个概念性的例子。T-SQL将XML数据类型列分解为矩形格式。c#这边的等式不会有任何问题。

/p>

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, product VARCHAR(20), xmldata XML);
INSERT INTO @tbl (product, xmldata) VALUES
('vase',  N'<root>
<r>red</r>
<r>blue</r>
<r>yellow</r>
</root>'),
('phone',  N'<root>
<r>black</r>
<r>white</r>
</root>');
-- DDL and sample data population, start
SELECT id, product
, c.value('(./text())[1]', 'VARCHAR(20)') AS color
FROM @tbl CROSS APPLY xmldata.nodes('/root/r') AS t(c);

+----+---------+--------+
| id | product | color  |
+----+---------+--------+
|  1 | vase    | red    |
|  1 | vase    | blue   |
|  1 | vase    | yellow |
|  2 | phone   | black  |
|  2 | phone   | white  |
+----+---------+--------+

相关内容

  • 没有找到相关文章

最新更新