質問

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

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

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

役に立ちましたか?

解決

転送するデータの単純なクラスを作成し、コントローラー内のオブジェクトのリストをデータリーダーから手動で入力して、これをビューに渡すことができます。 (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);

他のヒント

MVCは、関心の分離に関するものです。 SqlDataReaders、DataTables、またはSystem.Data名前空間にあるクラスをビューに渡すことはお勧めできません。データベースと通信する可能性のあるモデルと、このモデルをビューに渡すコントローラーを定義する必要があります。会社のポリシーでORMを使用しないと言われている場合は、MVCパターンよりも古典的なWebFormsがシナリオに適している可能性があります。

Rashackに同意します。この記事では、詳細に説明します。リンクテキスト

簡単に言うと、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を使用するよりもはるかに優れたパフォーマンスが得られることがわかると思います。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top