2014-02-28 74 views
0

我可以将我的SQL结果集存储到ADODB记录集或ADO.NET记录集中。在.NET 我可以使用.NET连接管理器,获取.NET数据集,从这个DataSet中提取数据表并从中使用它。问题是我在记忆中获得大约30-40K行。 我不想那样做。我想将SqlDataReader变成“某种.NET记录集” ,这样我就可以逐行读取,而不是一次全部读取。我如何做到这一点?我只想使用C#和.NET。在执行SQL任务中获取SqlDataReader而不是RecordSet

谢谢。

回答

2

.NET提供了几种类型集合列表中,一个HashSet ....
所有这些都将保留在内存中记录
DataTable中有许多功能和内存开销

创建适当的类物业

List<MyClass> MyClasses = new List<MyClass>(); 

String strSQL = "select * from Table01"; 
SqlCommand cmd = new SqlCommand { Connection = Cn, CommandText = strSQL }; 
try 
{ 
    Cn.Open(); 
    SqlDataReader sdr = cmd.ExecuteReader(); 
    while (sdr.Read()) 
    { 
     MyClasses.Add(new MyClass(sdr.GetValue(0)); 
    } 
    sdr.close();  
} 
catch (Exception Ex) {} 
finally 
{ 
    Cn.Close(); 
} 

30-40K并不是那么大,除非你的行很大。
我已经使用超过100万的收藏。

0
SqlDataReader sdr; 
var strSQL = "select * from Table01"; 
var cmd = new SqlCommand { Connection = Cn, CommandText = strSQL }; 
try 
{ 
    sdr = cmd.ExecuteReader(); 
    sdr.Read(); 
    if (sdr.HasRows) 
    { 
     var field = sdr.GetValue(0); 
     // and so on.... 
    } 
    dtrContID.Close(); 
} 
catch (Exception err) 
{ 
    // ....... 
} 
+0

这是一个有点晚优势排处理数据行在读取之后测试HasRows。这只会读一行。 – Paparazzi

1

如果您想通过行处理您的数据行,这一切无法加载到内存中,然后你为什么不编写自定义转换:这里是东西给你一个想法:http://technet.microsoft.com/en-us/library/ms136027.aspx

使用现有的连接管理器的源和目标,并将脚本组件置于您的自定义行之间进行处理。

这将通过它使用所有的SSIS原生能力(在不需要的时候再和回退)仅排的最佳量转移到内存缓冲区