65

複数のクエリを実行して、1回だけ実行した結果を返すことはできますSqlCommandか?

4

7 に答える 7

99

SqlDataReader.NextResultを参照してください( SqlDataReader は SqlCommand.ExecuteReader の呼び出しから返されます)。

バッチ Transact-SQL ステートメントの結果を読み取るときに、データ リーダーを次の結果 [セット] に進めます。

例:

string commandText = @"SELECT Id, ContactId
FROM dbo.Subscriptions;

SELECT Id, [Name]
FROM dbo.Contacts;";


List<Subscription> subscriptions = new List<Subscription>();
List<Contact> contacts = new List<Contact>();

using (SqlConnection dbConnection = new SqlConnection(@"Data Source=server;Database=database;Integrated Security=true;"))
{
    dbConnection.Open();
    using (SqlCommand dbCommand = dbConnection.CreateCommand())
    {
        dbCommand.CommandText = commandText;
        using(SqlDataReader reader = dbCommand.ExecuteReader())
        {
            while(reader.Read())
            {
                subscriptions.Add(new Subscription()
                {
                    Id = (int)reader["Id"],
                    ContactId = (int)reader["ContactId"]
                });
            }

            // this advances to the next resultset 
            reader.NextResult();

            while(reader.Read())
            {
                contacts.Add(new Contact()
                {
                    Id = (int)reader["Id"],
                    Name = (string)reader["Name"]
                });
            }
        }
    }
}

その他の例:

于 2012-10-03T19:43:16.417 に答える
56

複数の選択がある を作成しStored Procedure、 を埋めますDataSet

using (SqlConnection conn = new SqlConnection(connection))
{
    DataSet dataset = new DataSet();
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = new SqlCommand("MyProcedure", conn);
    adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
    adapter.Fill(dataset);
    return dataset;
}

返されたデータセットにはDataTable、ストアド プロシージャの選択ごとに Tables 配列が含まれます。

于 2012-10-03T19:40:32.227 に答える
10

「dapper」などのツールを使用すると、アドホック テキスト クエリを使用するか、ストアド プロシージャを使用するかに関係なく、これが非常に簡単になります。例えば:

using(var multi = conn.QueryMultiple(sql, args))
{
    var customers = multi.Read<Customer>().AsList(); // first grid
    var regionName = multi.ReadFirstOrDefault<string>(); // second grid
    var addresses = multi.Read<Address>().AsList(); // third grid
    // todo: use those things
}

個々のグリッドは、オプションのパラメータ to を使用して、バッファリングせずにIEnumerable<T>(リーダー自体のオープンとして)読み取ることもできますRead[<T>]

于 2017-06-19T09:49:11.677 に答える
1

私は辞書のアプローチを使用しています。Newton Json を使用して json に変換できます。このようにして、タイプと IDataRecord に縛られません

public List<List<Dictionary<string, object>>> ExecuteSqlReader(string cmd, int commandTimeout = 30, CommandType commandType = CommandType.Text)
        {
           var sqlCmd = new SqlCommand(cmd);
           var allRecord = new List<List<Dictionary<string, object>>>();
            using (var connection = GetSqlConnection(commandTimeout, commandType, ref sqlCmd))
            {
                using (var reader = sqlCmd.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        var result = new List<Dictionary<string, object>>();
                        while (reader.Read())
                        {
                            result = GetTableRowData(reader);
                        }

                        allRecord.Add(result);
                    }
                    while (reader.NextResult())
                    {
                        if (reader.HasRows)
                        {
                            var result = new List<Dictionary<string, object>>();
                            while (reader.Read())
                            {
                                result = GetTableRowData(reader);
                            }
                            allRecord.Add(result);
                        }
                    }
                }
            }
            return allRecord;
        }
于 2020-01-12T18:21:48.063 に答える