我写了下面的代码:
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'被抛出。
如果有人能给我这个例外的解决方案,我将非常感激。
解决你的问题:
- 要么规范化数据库,这样存储的不是原始XML,而是适当的关系模型。这就是SQL的基本工作原理。希望这能解决你的问题。
- 然而,无论您的数据库规范化得多好,都存在一些限制,超过这些限制,数据就不适合可用内存。如果这是你的情况,你需要放弃强硬的
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 |
+----+---------+--------+