对于Asp.net数据源:List == bad,Enumerable == good。两者都可以用作数据源,但枚举类型往往表现更好,特别是对于内存使用非常重要的asp.net。列表强制您将整个结果集放入内存中。用可枚举的方式播放你的卡片,一次只能在内存中存储一条记录。
public static IEnumerable<RetrieveActiveMuseumByMuseumID_Result> GetActiveMuseum()
{
using (var cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MuseumDB"].ConnectionString))
using (var cmd = new SqlCommand("StoredProcedureName", cn)
{
cmd.CommandType = CommandTypes.StoredProcedure;
//you need to supply some of the information for this line: you didn't include it in your question
cmd.Parameters.Add("@ParameterName", SqlDbTypes.???).Value = ParameterValue;
cn.Open();
using (var rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{ //you'll need to implement the static create method I used here
yield return new RetrieveActiveMuseumByMuseumID_Result.Create(rdr);
}
}
}
}
为了使这项工作,你RetrieveActiveMuseumByMuseumID_Result
类型需要一个静态Create()
方法接受一个IDataRecord
,并返回一个新的RetrieveActiveMuseumByMuseumID_Result
对象(这个后面的工厂模式)。
我倾向于抽象这种模式带到一个“微型ORM”,使用看起来像这样一个通用的方法:
public static IEnumerable<IDataRecord> GetData(string command, Action<SqlParameterCollection> addParameters)
{
using (var cn = new SqlConnection(/* generic code for connection string here */));
using (var cmd = new SqlCommand(command, cn))
{
addParameters(cmd.Parameters);
cn.Open();
using (var rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
yield return rdr;
}
}
}
}
然后,我会说这就是您所查询的是这样的:
public static IEnumerable<RetrieveActiveMuseumByMuseumID_Result> GetActiveMuseum()
{
return GetData("exec StoredProcedureName @ParameterName", p =>
{
p.Add("@ParameterName", SqlDbTypes.???).Value = ParameterValue;
}).Select(r => RetrieveActiveMuseumByMuseumID_Result.Create(r));
}
您发布的代码的哪部分内容您希望对存储过程做任何事情? – 2012-03-06 19:53:16
你已经设置了用于执行存储过程的基础设施(安装一个'新的MuseumDB(...'),然后创建一个空列表并返回它),你需要添加一些实际执行SP的代码。 – phoog 2012-03-06 19:54:01