无法将类型为“System.Data.SqlClient.SqlDataReader”的对象强制转换为“System.Collections.Generic.IEnumerable”

时间:2010-12-08 16:45:04

标签: c# ienumerable casting sqldatareader idatareader

我一直在努力理解为什么它会给我这个错误,因为我没有使用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();
        }

错误是在foreach循环上转换IEnumerable时。提前谢谢......

1 个答案:

答案 0 :(得分:3)

使用SqlDataReader,因为这是command.ExecuteReader返回的实际类型。然后你试图将其转换为IEnumerable<IDataReader>,但目前尚不清楚原因。为什么期望能够发挥作用?

通过调用NextResult()来迭代IDataReader中的多个表(等)。例如:

do
{
    // Read the current result; if reading manually, call Read()
    // to get to the next row within the result
} while (reader.NextResult());