2010-11-26 8 views
1

次のようなシナリオを考えてください。asp.net procから複数の結果セット:結果をクラスにマップする必要がありますか?もしそうなら、どうですか?

報告目的で実行される クエリのマルチプル結果セットを返すストアドプロシージャがあります。

また、procはテーブル値パラメータ(SQL 2008)も使用します。 http://www.sommarskog.se/arrays-in-sql-2008.html#LINQ_EF

これらの結果セットは読み取り専用です。つまり、 の更新、削除、または挿入を心配する必要はありません。

これらの結果セットは、データベース内のどのテーブルにもマップされません。 これはレポート結果であり、データベーステーブルのミラーではありません。

さて、私のバックグラウンドは、ASPの古典である、と私はすべての.NETデータアクセス戦略に を読み取ろうとしてきたが、そうです:(2)MSが持っている は、(1)MSは、Entity Frameworkの を推進しています(4)プロジェクトの状況によって適切なデータアクセス戦略が指示される ORMがこのデータアクセスシナリオに対して最適化されていないように思われる (5)複数の結果セットを格納するプロキシをマッピングするためのすぐに使えるソリューションはありません

また、私は完全なhtml出力を制御するので、コードを使用している場合は、 のみリピータとリテラルがデータバインディングに使用されます。

私は、Webフォームプログラミングモデルがコードとコンテンツの完全な分離 を提供するのに失敗し、asp classicと同じように "スパゲッティ"になり得ることを発見しました。

データアクセスとインラインスクリプト<%>を同じページに置くことでこれを実装するのはかなり簡単だと思うのですが、これは非常に簡単です。ここ は、結果となるコードのようなものの例です:その後、

<% 
' data access (skipping a bunch of code).... 
Dim myDataSet As New DataSet() 
myCommand.Fill(myDataSet) 
'...etc.  

Teachers = myDataSet.Tables(0).Rows 
Students = myDataSet.Tables(1).Rows 
'... etc.%> 

<% If Teachers.Count > 0 Then%> 
<table><% For Each _Teachers In Teachers%> 
    <tr> 
     <td><%= _Teachers(0)%></td> 
     <td><%= _Teachers(1)%></td> 
    </tr><% Next %>  
</table> 
<% Else%>Hey, there's no records.<% End If %> 

(私は下の背後にあるコードでのデータアクセスを分離しようとすると、「サブをPage_Load保護されました...」 、私は.aspxページで使用しているの背後にあるコードで 変数がエラーを与えておいてください。 「[変数]宣言されていないことは、その保護レベルにアクセスできないことがあります。。」)

結果セットの場合プロからcは強く型付けされていない、 それは世界の終わり、ひどいプログラミング実践、保守性の悪夢、 最悪の可能な選択などですか?

ストアドプロシージャの結果セットを強く型付けする必要がある場合は、 この場合、最も効果的な方法は何ですか? (私は がこのトピックに関する簡単なチュートリアルを見つけるわけではありません)

ご協力いただきありがとうございます。

答えて

0

引き続きADOを使用する必要があるかどうかを確認しているようです。データ用の.NETコンテナまたはカスタムドメインクラス。

クラスの厳密な型定義や入力の検証、または表示前にデータに適用された他のロジックが必要な場合は、DataTableをYourClassのコレクションに変換する方法を作成することを検討してください。それ以外の場合は、これが表示用の場合、DataTableに固執することに何も問題はありません。他のコンポーネントのためのインターフェイスを提供している場合、またはクラスが提供する機能が必要な場合は、クラスの厳密な型指定を行ってください。

public IEnumerable<Teacher> ConvertToTeachers(DataTable dt) 
{ 
    foreach (var row in dt.Rows.AsEnumerable()) 
    { 
     //create a teacher from this row. modify row indexers as required. 
     yield return new Teacher{ TeacherName = row["Name"].Value, 
            Location = row["Location"].Value }; 
    } 
} 

プレゼンテーション層では、ASP.NET Webフォームが提供するサーバーコントロールを活用することを検討してください。それらは、そのすべてのループを除去するデータバインディング機能を提供します。

  • グリッドビューが好きなようにデザインされていることを確認してください。必要なデータを含む適切な列:通常のバインドされたフィールドとハイパーリンク。

  • データをグリッドにバインドします。返信用

gridViewTeachers.DataSource = myDataSet.Tables(0).Rows 
gridViewTeachers.DataBind 
+0

感謝。 RE: "... DataTableをYourClassのコレクションに変換するメソッドを作成することを検討する"私は自分でこの部分をするにはあまりにも多くのOOPの初心者のようだと思う。それ以上の提案やリソースポインタを提供できると思いますか? – mg1075

+1

@ mg1075 - ソリューションを説明するために作成したコードを確認してください。 http://pastebin.ca/2017916 –

+0

私はVBではなくC#で作業していますが、明らかにVBの "yield"のサポートは不足していますか? http://stackoverflow.com/questions/97381/yield-in-vb-net – mg1075

関連する問題