我可以将我的SQL结果集存储到ADODB记录集或ADO.NET记录集中。在.NET 我可以使用.NET连接管理器,获取.NET数据集,从这个DataSet中提取数据表并从中使用它。问题是我在记忆中获得大约30-40K行。 我不想那样做。我想将SqlDataReader变成“某种.NET记录集” ,这样我就可以逐行读取,而不是一次全部读取。我如何做到这一点?我只想使用C#和.NET。在执行SQL任务中获取SqlDataReader而不是RecordSet
谢谢。
我可以将我的SQL结果集存储到ADODB记录集或ADO.NET记录集中。在.NET 我可以使用.NET连接管理器,获取.NET数据集,从这个DataSet中提取数据表并从中使用它。问题是我在记忆中获得大约30-40K行。 我不想那样做。我想将SqlDataReader变成“某种.NET记录集” ,这样我就可以逐行读取,而不是一次全部读取。我如何做到这一点?我只想使用C#和.NET。在执行SQL任务中获取SqlDataReader而不是RecordSet
谢谢。
.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万的收藏。
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)
{
// .......
}
如果您想通过行处理您的数据行,这一切无法加载到内存中,然后你为什么不编写自定义转换:这里是东西给你一个想法:http://technet.microsoft.com/en-us/library/ms136027.aspx
使用现有的连接管理器的源和目标,并将脚本组件置于您的自定义行之间进行处理。
这将通过它使用所有的SSIS原生能力(在不需要的时候再和回退)仅排的最佳量转移到内存缓冲区
这是一个有点晚优势排处理数据行在读取之后测试HasRows。这只会读一行。 – Paparazzi