複数のクエリを実行して、1回だけ実行した結果を返すことはできますSqlCommand
か?
97591 次
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 に答える