2012-03-06 118 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)); 
} 
相關問題