10

ASP MVCアプリケーションでは、データベースのクエリに標準SQL(Linq to SQLまたはその他のORMではなく)を使用しています。

データベースの結果をビューに渡し、ビューの結果を繰り返し処理したいと思います。しかし、これを行う方法がわかりません。私が見たすべての例は、いくつかの文字列を渡すか、L2Sを使用しています。ネストされたハッシュテーブルのようなものを渡したいのですが、考えられるのはSqlDataReaderオブジェクトをビューに渡すことだけですが、これは本当に悪い考えのように思えます。

標準のSQLクエリからのデータベース結果をビューに表示するにはどうすればよいですか?本当にLinqまたは他のORMを使用したいのですが、要件により、使用しないように指示されています(理由を聞かないでください、わかりません)。私はこれをVBで行っています。提供されているC#の例を変換するように最善を尽くします。

4

5 に答える 5

12

転送したいデータ用の単純なクラスを作成し、コントローラーのオブジェクトのリストをデータリーダーから手動で入力し、これをビューに渡すことができます-たとえば(C#ですが、これは簡単に変換できるはずです)

// open your connection / datareader etc.

List<Customer> customers = new List<Customer>();

while(dataReader.Read())
{
 Customer c = new Customer();
 c.Id = dataReader.GetInt32(0);
 c.Name = dataReader.GetString(1);
 // etc (you might want to use string indexers instead of ints for the get methods)

 customers.Add(c);
}

// close and dispose your datareader / connection etc as usual

return View("List", customers);
于 2009-05-03T19:19:56.190 に答える
8

MVC は、関心の分離に関するものです。SqlDataReaders、DataTables、または System.Data 名前空間に存在するクラスをビューに渡すことはお勧めできません。データベースと対話する可能性のあるモデルと、このモデルをビューに渡すコントローラーを定義する必要があります。会社のポリシーで ORM を使用しないと規定されている場合は、MVC パターンよりも従来の Web フォームの方がシナリオに適している可能性があります。

于 2009-05-03T19:19:08.437 に答える
8

私はラシャックに同意します。この記事では、それについて少し詳しく説明します。リンクテキスト

簡単に言えば、DataTable と DataReader を使用してそれを行う方法は次のとおりです。

private DataTable GetData()
{
    DataTable dt = new DataTable();

    using (SqlConnection connection
             = new SqlConnection("ConnectionString"))
    using (SqlCommand command = new SqlCommand())
    {
        command.Connection = connection;
        command.CommandText = "SELECT * FROM Customers";

        connection.Open();
        using (SqlDataReader reader =
            command.ExecuteReader
                (CommandBehavior.CloseConnection))
        {
            dt.Load(reader);
        }
    }

    return dt;
}

次に、その DataTable をエンティティ オブジェクトに読み込んで渡すことができます。

これにより、Linq や ORM を使用するよりもはるかに優れたパフォーマンスが得られることがわかると思います。

于 2009-05-03T19:19:18.670 に答える
5

DataTables を使用してみてください - DataTable は IDataReader からデータをロードできます... (このメソッドは Load と呼ばれていると思います)

于 2009-05-03T19:10:02.437 に答える
4

独自のData Transfer Objectクラスを作成し、ADO.Net コードを使用してそれらのインスタンスを設定できます。これらの DTO クラスは、プロパティの get/set アクセサーのみを含み、メソッドを含まない単純なPOCOスタイルのクラスになります。POCO オブジェクトの使用は、DataSets/DataTables よりも軽量 (余分な状態がない) であり、オブジェクト指向の観点から操作するのがより直感的であるため、ほぼ間違いなく推奨されます。

于 2009-05-03T19:18:36.677 に答える