Подтвердить что ты не робот

Таблица умножений в DataReader

Я обычно использую DataSet, потому что он очень гибкий. Недавно мне поставили задачу оптимизации кода. Чтобы уменьшить количество обращений к базе данных, я меняю два запроса в процедуре. один запрос возвращает count, а другой возвращает actual data. То есть My stored procedure возвращает две таблицы. Теперь я знаю, как читать обе таблицы, используя DataSets, но мне нужно читать обе таблицы, используя DataReader. В поисках этого я нашел этот.

Я следую за статьей и написал свой код так:

dr = cmd.ExecuteReader();
while (dr.Read())
{


}
if (dr.NextResult()) // this line throws exception
{
   while (dr.Read())
{

Но я получаю исключение в dt.NextResult. Исключение составляет

Invalid attempt to call NextResult when reader is closed.

Я также погуглил над ошибкой, но все еще не смог решить проблему. Любая помощь будет высоко ценится. Мне нужно прочитать несколько таблиц, используя datareader, это возможно?

4b9b3361

Ответ 1

Попробуйте это, потому что это приведет к закрытию соединения, считыванию данных и команде после завершения задачи, так что это не приведет к закрытию исключения datareader

Также проверьте, как это if(reader.NextResult()), чтобы проверить, есть ли следующий результат,

using (SqlConnection connection = new SqlConnection("connection string here"))
{
    using (SqlCommand command = new SqlCommand
           ("SELECT Column1 FROM Table1; SELECT Column2 FROM Table2", connection))
    {
        connection.Open(); 
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                MessageBox.Show(reader.GetString(0), "Table1.Column1");
            }

            if(reader.NextResult())
            {
               while (reader.Read())
              {
                MessageBox.Show(reader.GetString(0), "Table2.Column2");
              }
            }
        }
    }
}

Ответ 2

Я попытался воспроизвести эту проблему (также потому, что я раньше не использовал несколько таблиц в читателе). Но он работает так, как ожидалось, поэтому я предполагаю, что вы пропустили связанный код.

Здесь мой тестовый код:

using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
    using (var cmd = new SqlCommand("SELECT TOP 10 * FROM tabData; SELECT TOP 10 * FROM tabDataDetail;", con))
    {
        int rowCount = 0;
        con.Open();
        using (IDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                String object1 = String.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]);
            }
            if (rdr.NextResult())
            {
                rowCount = 0;
                while (rdr.Read())
                {
                    String object1 = String.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]);
                }
            }
        }
    }
}

Ответ 3

Я построил ответ Pranay Rana, потому что мне нравится держать его как можно меньше.

string rslt = "";
using (SqlDataReader dr = cmd.ExecuteReader())
{
    do
    {
        while (dr.Read())
        {
            rslt += $"ReqID: {dr["REQ_NR"]}, Shpr: {dr["SHPR_NR"]}, MultiLoc: {dr["MULTI_LOC"]}\r\n";
        }
    } while (dr.NextResult());
}