【问题标题】:Populate ArrayList from Stored Procedure result set从存储过程结果集中填充 ArrayList
【发布时间】:2011-08-29 23:47:28
【问题描述】:

我有一个返回一组整数的存储过程。我需要帮助在 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 是一项较旧的技术,我会接受不使用它的建议。谢谢。

【问题讨论】:

  • 除非您仍在使用 .NET 1.1,否则不应使用 ArrayList。相反,请使用List<int>
  • 另外,Data.GetCommand 是什么?
  • GetCommand是用于连接sql数据库并调用存储过程的方法。它是由以前的开发人员为此 CMS 编写的。

标签: c# sql-server-2005 arraylist


【解决方案1】:

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

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.ExecuteReader() 之前执行cmd.Connection.Open()

【讨论】:

  • 你的意思是 ExecuteReader() 吗?
  • 虽然原则上看起来不错,但我不想让阅读器和连接保持打开状态......
  • @Mitch,using 语句确保了命令和阅读器的处置,这将关闭它们。 OP 的代码中没有完成连接的处理,所以我也没有这样做。 @Jon,是的,我已经修正了错别字,对此感到抱歉。
  • @asbjornu:我很清楚这一点!
【解决方案2】:

根据您要排除的列表的百分比、随之而来的其他数据量、数据库的负载程度以及网络的速度,如果您在源而不是拉下一堆数据只是为了丢弃它。

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

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

【讨论】:

  • 我不会排除列表中的任何部分。我需要能够使用 Contains 方法找到列表中的所有值,以获得基于用户 ID 的可见性/访问权限。
【解决方案3】:

这样的事情怎么样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多