我有一个返回列表的存储过程。现在我正在尝试编写一个函数,它将传递正确参数的存储过程,然后返回列表,以便它可以在asp网页上使用。我完全迷失了。
到目前为止,我已经尝试了这一点无济于事
public static List<RetrieveActiveMuseumByMuseumID_Result> GetActiveMuseum()
{
using (MuseumDB db = new MuseumDB(ConfigurationManager.ConnectionStrings["MuseumDB"].ConnectionString))
{
List<RetrieveActiveMuseumByMuseumID_Result> listOrdered = new List<RetrieveActiveRigsWithEquipmentByOffice_Result>();
}
return listOrdered;
}
但是这没有做任何事情,也没有传递SP的参数@MuseumID
请帮助,我不知道从哪里开始。
答案 0 :(得分:3)
对于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));
}