Как получить несколько наборов записей из StoredProcedure с помощью NReco.Data в Asp.NetCore
Я использую NReco.Data в своем приложении Asp.NetCore для выполнения db-вызовов, потому что я не хочу использовать EF, а DataTable пока не поддерживается.
Теперь мне нужно вызвать StoredProcedure и получить несколько наборов записей (или списков словарей).
На данный момент я назвал это:dbAdapter.Select($"STOREDNAME @{nameof(SQLPARAMETER)}", SQLPARAMETER).ToRecordSet()
Но сохраненный дает мне больше, чем 1 набор записей, может ли кто-нибудь помочь мне получить другие?
1 ответ
В настоящее время NReco.Data.DbDataAdapter
не имеет API для обработки нескольких наборов результатов, возвращаемых одним IDbCommand
,
Вы можете сочинять IDbCommand
самостоятельно запустите программу чтения данных и прочитайте несколько наборов результатов следующим образом:
IDbCommand spCmd; // lets assume that this is DB command for 'STOREDNAME'
RecordSet rs1 = null;
RecordSet rs2 = null;
spCmd.Connection.Open();
try {
using (var rdr = spCmd.ExecuteReader()) {
rs1 = RecordSet.FromReader(rdr);
if (rdr.NextResult())
rs2 = RecordSet.FromReader(rdr);
}
} finally {
spCmd.Connection.Close();
}
Как автор NReco.Data, я думаю, что поддержка нескольких наборов результатов может быть легко добавлена к DbDataAdapter
API (я только что создал проблему для этого на github).
-- ОБНОВИТЬ --
Начиная с NReco.Data v.1.0.2 можно обрабатывать несколько наборов результатов следующим образом:
(var companies, var contacts) = DbAdapter.Select("exec STOREDNAME").ExecuteReader(
(rdr) => {
var companiesRes = new DataReaderResult(rdr).ToList<CompanyModel>();
rdr.NextResult();
var contactsRes = new DataReaderResult(rdr).ToList<ContactModel>();
return (companiesRes, contactsRes);
});
Таким же образом DataReaderResult
можно сопоставить результаты со словарями или RecordSet
если нужно.