Как получить несколько наборов записей из 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 если нужно.

Другие вопросы по тегам