从存储过程结果集中填充ArrayList

时间:2011-08-29 23:47:29

标签: c# sql-server-2005 arraylist

我有一个存储过程,它返回一组整数。我需要帮助在C#(VS 2005)Web应用程序中填充这些结果的ArrayList。

我意识到这可能是一个非常简单的过程,但我显然没有技能,也没有研究它的词汇。

我的假设是这个DataTable正在正确填充:

public static DataTable GetAllVendors()
{
     OleDbCommand cmd = Data.GetCommand(Configuration.DatabaseOwnerPrefix + ".GetAllInformationAndHelpVendorIds", Connections.MyDbConnection);
     return Data.RunCommand(cmd).Tables[0];
 }

我不知道的是如何将结果返回到ArrayList或可以使用Contains()方法计算的其他数据类型。

编辑:ArrayList是一项较旧的技术,我会接受不使用它的建议。感谢。

3 个答案:

答案 0 :(得分:4)

您应该做的是在ExecuteReader()对象上调用cmd,如下所示:

public static IEnumerable<int> GetAllVendors()
{
    using (var cmd = Data.GetCommand(Configuration.DatabaseOwnerPrefix + ".GetAllInformationAndHelpVendorIds", Connections.MyDbConnection))
    {
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                yield return reader.GetInt32(0);
            }
        }
    }
}

这假设SQL将返回一个表,其第一列(由索引0标识到方法GetInt32())将是您要查找的ID。如果SQL返回另一列中的ID,只需将索引调整到您希望找到它们的列。

此解决方案还希望命令的连接已打开。如果不是,您可以在cmd.Connection.Open()之前cmd.ExecuteReader()进行。

答案 1 :(得分:2)

根据您要排除的列表的百分比,其中包含的其他数据量,数据库的加载速度以及网络的速度,如果您进行过滤,通常情况会更好来源而不是拉下一堆数据只是为了丢弃它。

在SQL Server 2008中,您可以采用相反的方式 - 将列表传递到table-valued parameter,然后在服务器上执行过滤器。

在SQL Server 2005中,您可以使用效率稍低的方法来模拟相同的事情 - 将逗号分隔的值列表传递给存储过程,然后存储过程解析列表并创建表或直接连接到存储过程源表,然后结果集仍然被过滤而不是整个查询。

答案 2 :(得分:1)

这样的事情怎么样:

public static IList GetAllVendors()
{
     OleDbCommand cmd = Data.GetCommand(Configuration.DatabaseOwnerPrefix + ".GetAllInformationAndHelpVendorIds", Connections.MyDbConnection);
     return Data.RunCommand(cmd).Tables[0].AsEnumerable().ToList();
}

此处有更多详情how-do-you-convert-a-datatable-into-a-generic-list