将存储过程的结果传递到C#中的列表

时间:2012-03-06 19:49:55

标签: c# sql sql-server-2008 stored-procedures

我有一个返回列表的存储过程。现在我正在尝试编写一个函数,它将传递正确参数的存储过程,然后返回列表,以便它可以在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

请帮助,我不知道从哪里开始。

1 个答案:

答案 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));
}