Невозможно привести объект типа «System.Data.SqlClient.SqlDataReader» к типу «System.Collections.Generic.IEnumerable»

Я пытался понять, почему он дает мне эту ошибку, потому что я не использую SqlDataReader, я понимаю, что использую SQL Server, и интерфейс возвращает определенный тип, но все же я говорю .NET вместо этого использовать IDataReader .

Вот код:

    public DataSet ExecuteSelectProcedure(string procedure, List<Parameter> parameters)
    {
        conexion.Open();

        try
        {
            IDbCommand command = conexion.CreateCommand();
            command.CommandType = CommandType.StoredProcedure;
            command.Connection = conexion;
            command.CommandText = procedure;

            foreach (var parameter in parameters)
            {
                IDbDataParameter dataParameter = command.CreateParameter();
                dataParameter.Direction = (System.Data.ParameterDirection) parameter.Direction;
                dataParameter.Value = parameter.Value;
                dataParameter.ParameterName = parameter.Name;
                dataParameter.DbType = (DbType) parameter.Type;
                command.Parameters.Add(dataParameter);
            }


            IDataReader result = command.ExecuteReader();
            DataSet dataSet = new DataSet();
            foreach (var table in (IEnumerable<IDataReader>) result)
            {
                DataTable dataTable = new DataTable();
                dataTable.Load(table);
                dataSet.Tables.Add(dataTable);
            }

            result.Close();

            return dataSet;
        }
        finally
        {
            conexion.Close();
        }

Ошибка возникает при использовании IEnumerable в цикле foreach. Заранее спасибо...


person Victor Gil    schedule 08.12.2010    source источник


Ответы (1)


Он использует SqlDataReader, потому что это фактический тип, который возвращает command.ExecuteReader. Затем вы пытаетесь привести это к IEnumerable<IDataReader>, но неясно, почему. Почему вы ожидали, что это сработает?

Вы перебираете несколько таблиц (и т. д.) в IDataReader, вызывая NextResult(). Например:

do
{
    // Read the current result; if reading manually, call Read()
    // to get to the next row within the result
} while (reader.NextResult());
person Jon Skeet    schedule 08.12.2010
comment
Первоначально цикл foreach был таким: do { var dataTable = new DataTable(); dataTable.Load(результат); Набор данных.Таблицы.Добавить(Таблица данных); если (результат.IsClosed) перерыв; } пока (результат.СледующийРезультат()); - person Victor Gil; 08.12.2010
comment
@Victor: Что ж, тогда я предлагаю вам вернуться к этому :) - person Jon Skeet; 08.12.2010
comment
Проблема в том, что, например, когда в результате есть 3 таблицы, набор данных возвращается с таблицей 1 и 3... Извините за мой английский, а не мой первый язык... :-D - person Victor Gil; 08.12.2010
comment
@Victor: Это говорит о том, что вы звоните NextResult() дважды, а не один раз. - person Jon Skeet; 08.12.2010
comment
Хорошо, я заменяю NextResult() на Read(), и DataSet возвращает правильный набор таблиц... Спасибо... - person Victor Gil; 08.12.2010
comment
@Victor: Вам вообще не нужно вызывать Read - это сделает DataTable.Load. Я подозреваю, что у вас было два вызова NextResult. Не видя вашего кода, невозможно сказать наверняка. - person Jon Skeet; 08.12.2010
comment
@Victor: Ах, я не видел кода в твоем комментарии. Это, конечно, выглядит нормально... если, конечно, DataTable.Load не вызовет NextResult... - person Jon Skeet; 08.12.2010