在执行SQL任务中获取SqlDataReader而不是RecordSet

时间:2014-02-28 19:15:34

标签: c# .net sql-server ssis

我可以将SQL结果集存储到ADODB记录集或ADO.NET记录集中。在.NET中 我可以使用.NET连接管理器,获取.NET DataSet,从中提取DataTable 这个DataSet并使用它。问题是我在内存中得到大约30-40K行。 我不想那样做。我想把SqlDataReader变成“某种.NET记录集” 这样我就可以一行一行而不是一次性阅读。我该怎么办?我只想使用C#和.NET。

感谢。

3 个答案:

答案 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)
{
    // .......
}