我可以将SQL结果集存储到ADODB记录集或ADO.NET记录集中。在.NET中 我可以使用.NET连接管理器,获取.NET DataSet,从中提取DataTable 这个DataSet并使用它。问题是我在内存中得到大约30-40K行。 我不想那样做。我想把SqlDataReader变成“某种.NET记录集” 这样我就可以一行一行而不是一次性阅读。我该怎么办?我只想使用C#和.NET。
感谢。
答案 0 :(得分:2)
.NET有几种类型的集合List,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万的藏品。
答案 1 :(得分:1)
如果您想逐行处理数据而不是将其全部加载到内存中,那么为什么不编写自定义转换代码:以下内容可以为您提供一个想法:http://technet.microsoft.com/en-us/library/ms136027.aspx
使用现有的连接管理器作为源和目标,并在其间放置一个脚本组件,用于自定义逐行处理。
这将逐行处理数据,其优点是它使用所有SSIS本机功能将最佳行数移到内存缓冲区(并在不需要时再次退出)
答案 2 :(得分: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)
{
// .......
}