【问题标题】:Unable to cast object of type 'System.Data.SqlClient.SqlDataReader' to type 'System.Collections.Generic.IEnumerable'无法将“System.Data.SqlClient.SqlDataReader”类型的对象转换为“System.Collections.Generic.IEnumerable”类型
【发布时间】:2010-12-08 16:45:03
【问题描述】:

我一直在试图理解为什么它给我这个错误,因为我没有使用 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 时出现的。在此先感谢...

【问题讨论】:

    标签: c# ienumerable casting sqldatareader idatareader


    【解决方案1】:

    使用SqlDataReader,因为这是command.ExecuteReader 返回的实际类型。然后您尝试将其转换为IEnumerable&lt;IDataReader&gt;,但尚不清楚原因。你为什么期望它会起作用?

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

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

    【讨论】:

    • foreach 循环原来是这样 do { var dataTable = new DataTable();数据表.加载(结果); dataSet.Tables.Add(dataTable); if (result.IsClosed) 中断; } while (result.NextResult());
    • @Victor:那么我建议你回到那个 :)
    • 问题是,例如,当结果有 3 个表时,数据集返回表 1 和 3...对不起我的英语,不是我的第一语言... :-D
    • @Victor:这表明你调用NextResult() 两次而不是一次。
    • 好的,我用 Read() 替换 NextResult() 并且 DataSet 返回正确的表集...谢谢...
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多