2012-03-06 4 views
-2

私はリストを返すストアドプロシージャを持っています。今私は正しいパラメータをストアドプロシージャを渡す関数を記述しようとしているし、ASP Webページで使用できるようにリストを返します。私は完全に失われています。私は無駄にこれまでのところ、これを試してみたストアドプロシージャの結果を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

投稿されたコードのどの部分をストアドプロシージャで処理する予定ですか? –

+1

ストアドプロシージャを実行するためのインフラストラクチャをセットアップしました( 'new MuseumDB(...')をインストールした後、空のリストを作成して返します)実際にSPを実行するコードを追加する必要があります。 – phoog

答えて

3

Asp.netデータソースの場合:List == bad、Enumerable == good。どちらもデータソースとして使用できますが、特にメモリ使用が非常に重要なasp.netの場合、列挙型の方がパフォーマンスが向上する傾向があります。リストは、結果セット全体をメモリに保存するよう強制します。あなたのカードを列挙可能なものと一緒にプレイしてください。一度に1つのレコードしかメモリに保存する必要はありません。

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タイプはIDataRecordを受け入れ、(これはFactoryパターンを次の)新しいRetrieveActiveMuseumByMuseumID_Resultオブジェクトを返す静的Create()方法を必要とします。

私はこのようになり、一般的な方法で使用して、このパターン離れた「ミニ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)); 
} 
関連する問題