0

これを行うためのより良い方法があるかどうかはわかりませんが、これが私の現在の設定です。

  1. データベースからテーブル構造を表す XSD ファイルを作成しました。
  2. 以下のような関数を保持するクラス ファイルを作成しました。

コードサンプル:

Public Function GetUser(ByVal UserID As String) As xsdUser.UserDataTable

        Dim SqlConn As New SqlConnection(ConfigurationManager.ConnectionStrings("MyDatabase").ConnectionString)
        Dim SqlCom = New SqlCommand("User_Retrieve", SqlConn)
        Dim Adapter As SqlDataAdapter
        Dim UserDT As New xsdUser.UserDataTable

        Using SqlCom
            SqlCom.Parameters.Add(New SqlParameter("@I_UserID", SqlDbType.NVarChar, 4)).Value = UserID
            Adapter = New SqlDataAdapter(SqlCom)
            Adapter.Fill(UserDT)
        End Using

        If UserDT IsNot Nothing AndAlso UserDT.Rows.Count > 0 Then    
             'Return DataTable here or I guess DataRow since there should just be one.
        Else
             'Handle Error here if there is no row
        End If
End Function

たった1つのファイルに含まれるべきことを2つのファイルで行うのは奇妙に思えます。「User」という名前のクラスファイルが1つあり、そこにメンバー変数があり、上記のようなクラス関数が必要だと思います。しかし、私が目にするチュートリアルはすべて、これらのデータ テーブルを使用しています。その上、関数の最後の if ステートメントを処理する方法がわかりません。行が 1 つしかないため、DataTable 全体を返す必要はないと思います。また、関数がデータ テーブルを返すことになっている場合にエラーを処理する方法もわかりません。空のテーブルを返すことができ、コードでテーブルが空の場合はそこで処理すると思いますが、これも面倒です。

では、誰でもこれらのことのいくつかを解決できますか? これは、ストアド プロシージャから情報を取得する一般的な方法ですか? または、検索結果に表示されない最新の方法はありますか?

ありがとう!

4

2 に答える 2

1

最終的には大量のファイルが作成され、機能が 2 つ以上のアセンブリ (クラス ライブラリ) に分散する可能性があるため、心配する必要はありません。データテーブルを返し、何らかのエラーを示す例外を (コード サンプルの ELSE スイッチで) スローすることができます。

データテーブルを返すことはできますが、問題は「最も便利なインターフェイスは何ですか?」ということです。このメソッドを使用するものはすべて、そのデータテーブルを概念的な「ユーザー」に変換/解析する方法を知る必要があることを考慮してください (テーブルに行が 1 つしかないかどうかを確認し、ユーザー名列からユーザー名を取得するなど)。

データテーブルは、 「テーブル モジュール」パターンと呼ばれるものの実装です。アプリが非常に単純なビジネス ロジックをモデル化し、データベース エンティティをオブジェクト指向エンティティにマッピングする手間が無駄になる場合に適しています。.net での作業の最初の数年間、私はデータテーブルを自由に使用しましたが (データのグリッドを表示する必要があるシナリオを除いて)、それらがオブジェクト指向ではないことに不満を感じました: 基本的に、あなたは「ユーザー」、「車」、「ショッピング カート」、またはモデリングしている現実世界のシナリオに対応するその他のエンティティではなく、常にデータベース行を扱います。アプリが少し複雑になると、これらすべてのデータテーブル、データ行ビュー、テーブルアダプターなどはかなり面倒になる可能性があります (少なくとも私の経験では)。

つまり、「ユーザー」クラスを作成し、関数の戻り値の型を「ユーザー」に変更し、メソッドで「ユーザー」インスタンスを取得するために必要なすべてのデータベース/検証ロジックを処理します。作成済みのデータセットを引き続き使用して、「ユーザー」関連データを取得し、返されたデータを検証して、そこから「ユーザー」インスタンスを作成できます。あなたが参照する「より最新の方法」は、Entity FrameworkやNHibernateなどのオブジェクトリレーショナルマッパーです。

于 2012-06-03T20:52:44.833 に答える
1

UserDataTable を返すことはまったく問題ありません。1行しか含まれていない場合でも。順不同に見える唯一のことは、ユーザー インターフェイスよりも下位のレイヤーに属するこのメソッド内の結果をチェックすることです。また、UserDataTable が何もないかどうかを確認する必要がないことに注意してください。

そして、私はこの行が必要だと思います

 SqlCom.CommandType = CommandType.StoredProcedure
于 2012-06-03T15:52:55.600 に答える