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