2012-03-06 117 views
-2

我有一个存储过程返回一个列表。现在我试图编写一个函数,它将传递正确参数的存储过程,然后返回列表,以便它可以在asp网页上使用。我完全失去了。将存储过程的结果传递给C#中的列表

到目前为止,我已经试过这无济于事

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; 
} 

但是,这并不做任何事情,它不通过是@MuseumID

帮助SP的参数,请我不知道从哪里出发。

+0

您发布的代码的哪部分内容您希望对存储过程做任何事情? – 2012-03-06 19:53:16

+1

你已经设置了用于执行存储过程的基础设施(安装一个'新的MuseumDB(...'),然后创建一个空列表并返回它),你需要添加一些实际执行SP的代码。 – phoog 2012-03-06 19:54:01

回答

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)); 
} 
相关问题