21

1 対多の関係を持つ 2 つのテーブルを含む DataSet を埋めようとしています。私はこれを達成するために DataReader を使用しています:

    public DataSet SelectOne(int id)
    {
        DataSet result = new DataSet();
        using (DbCommand command = Connection.CreateCommand())
        {
            command.CommandText = "select * from table1";

            var param = ParametersBuilder.CreateByKey(command, "ID", id, null);
            command.Parameters.Add(param);

            Connection.Open();
            using (DbDataReader reader = command.ExecuteReader())
            {
                result.MainTable.Load(reader);
            }
            Connection.Close();
        }
        return result;
    }

しかし、テーブルが 1 つしか埋まっていません。両方のテーブルを埋めるという目標を達成するにはどうすればよいですか?

可能であれば、DataAdapter の代わりに DataReader を使用したいと思います。

4

9 に答える 9

29

DataSet に複数のテーブルを入力するには、複数のリクエストをデータベースに送信するか、より高速な方法で実行できます。1 つのリクエストで複数の SELECT ステートメントをデータベース サーバーに送信できます。ここでの問題は、クエリから生成されたテーブルに自動的に Table と Table1 という名前が付けられることです。ただし、生成されたテーブル名は、DataSet で使用される名前にマップできます。

SqlDataAdapter adapter = new SqlDataAdapter(
      "SELECT * FROM Customers; SELECT * FROM Orders", connection);
adapter.TableMappings.Add("Table", "Customer");
adapter.TableMappings.Add("Table1", "Order");

adapter.Fill(ds);
于 2012-12-19T19:17:16.780 に答える
23

複数の select ステートメントを含む 1 つのコマンドを発行する場合は、NextResult メソッドを使用して、datareader 内の次の結果セットに移動できます: http://msdn.microsoft.com/en-us/library/system.data.idatareader.nextresult。 aspx

以下に、それがどのように見えるかを示します。

public DataSet SelectOne(int id)
{
    DataSet result = new DataSet();
    using (DbCommand command = Connection.CreateCommand())
    {
        command.CommandText = @"
select * from table1
select * from table2
        ";

        var param = ParametersBuilder.CreateByKey(command, "ID", id, null);
        command.Parameters.Add(param);

        Connection.Open();
        using (DbDataReader reader = command.ExecuteReader())
        {
            result.MainTable.Load(reader);
            reader.NextResult();
            result.SecondTable.Load(reader);
            // ...
        }
        Connection.Close();
    }
    return result;
}
于 2012-07-05T13:54:24.707 に答える
3

ここにあなたの質問に対する非常に良い答えがあります

上記のMSDNページに記載されている例を参照してください:-

于 2012-07-05T13:56:58.797 に答える