簡體   English   中英

c# OutOfMemoryException 當我使用數據表從 SqlDataReader 加載數據時

[英]c# OutOfMemoryException When I use a datatable to load data from 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. 規范化您的數據庫,以便存儲適當的關系 model 而不是原始 XML。 這就是 SQL 的工作原理。 希望這能解決您的問題。
  2. 但是,無論您的數據庫的規范化程度如何,都存在一些限制,超出該限制的數據根本不適合可用的 memory。 如果是你的情況,你需要放棄艱難的select *方式並以 fetch-next-batch 大小重新實現它,即重復獲取固定預定義大小的批次,處理它們,標記為在某處處理,然后 go 上。

這是一個概念性的例子。 T-SQL 將 XML 數據類型列分解為矩形格式。 等式的 c# 一側不會有任何問題。

SQL

-- 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);

Output

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM