對於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