【问题标题】:Cannot implicitly convert type System.Data.SqlClient.SqlDataReader to Microsoft.ReportingServices.DataProcessing.IDataReader无法将 System.Data.SqlClient.SqlDataReader 类型隐式转换为 Microsoft.ReportingServices.DataProcessing.IDataReader
【发布时间】:2015-04-29 21:48:35
【问题描述】:

我收到以下错误:

无法隐式转换类型“System.Data.SqlClient.SqlDataReader” 到“Microsoft.ReportingServices.DataProcessing.IDataReader”。一个 存在显式转换(您是否缺少演员表?)

public IDataReader ExecuteReader(CommandBehavior behavior)
{
    string query = "select * from Sales.Store";
    SqlConnection readerconn = new SqlConnection("Data Source=localhost;Initial Catalog=AdventureWorks2000;Integrated Security=SSPI");
    SqlCommand readercmd = new SqlCommand(query);

    try
    {
        readerconn.Open();
        readercmd = readerconn.CreateCommand();
        readercmd.CommandText = query;
        readercmd.CommandType = System.Data.CommandType.Text;
        SqlDataReader TestReader = readercmd.ExecuteReader();

        return TestReader; //Getting error at this line

        readerconn.Close();

    }
    catch (Exception e)
    {
        throw new Exception(e.Message);
    }
}

根据 Radin Gospodinov 的建议修改代码后,我没有收到错误,但我无法将数据放入数据集中。这是修改后的代码

public class MySqlDataReader:Microsoft.ReportingServices.DataProcessing.IDataReader
        {
            private System.Data.IDataReader sourceDataReader;
            private System.Data.DataTable dt;
            private System.Data.DataSet ds;
            public MySqlDataReader(System.Data.IDataReader datareader)
            {
                this.sourceDataReader = datareader;
            }

            public MySqlDataReader(System.Data.DataTable dt)
            {
                // TODO: Complete member initialization
                this.dt = dt;
            }

            public MySqlDataReader(System.Data.DataSet ds)
            {
                // TODO: Complete member initialization
                this.ds = ds;
             }
public IDataReader ExecuteReader(CommandBehavior behavior)
        {
            string query = "select * from Sales.Store";
            SqlConnection readerconn = new SqlConnection("Data Source=IE11DT4RJC6Q1;Initial Catalog=AdventureWorks2000;Integrated Security=SSPI");
            SqlCommand readercmd = new SqlCommand(query);

            try
            {
                readerconn.Open();
                readercmd = readerconn.CreateCommand();
                readercmd.CommandText = query;
                readercmd.CommandType = System.Data.CommandType.Text;
                SqlDataReader TestReader = readercmd.ExecuteReader();
                //TestReader.Close();
                readerconn.Close();
                //readerconn.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(query,readerconn);
                adapter.SelectCommand = readercmd;
                System.Data.DataSet ds = new System.Data.DataSet();
                adapter.Fill(ds, "result");
                System.Data.DataTable dt = new System.Data.DataTable();
                adapter.Fill(dt);

                readerconn.Close();
                return new MySqlDataReader(ds);

            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }

        }

【问题讨论】:

    标签: c#


    【解决方案1】:

    SqlDataReader 实现 System.Data.IDataReader,所以如果你想转换为 IDataRader 你应该使用public System.Data.IDataReader ExecuteReader(CommandBehavior behavior) 在 finally 块中也关闭连接:

    try
    {
      readerconn.Open()
    }
    catch{...}
    finally
    {
      readerconn.Close();
    }
    

    如果你想使用 Microsoft.ReportingServices.DataProcessing.IDataReader 那么你应该创建一个实现这个的类并将 SqlDataReader 传递给它:

    public class MySqlDataReaderWrapper:
        Microsoft.ReportingServices.DataProcessing.IDataReader
        {
          private System.Data.IDataReader sourceDataReader;
          public MySqlDataReaderWrapper(System.Data.IDataReader dataReader)
          {
            this.sourceDataReader = dataReader.
          }
        // Implementation of methods of Microsoft.ReportingServices.DataProcessing.IDataReader
        }
    

    然后在你的方法中使用return new MySqlDataReaderWrapper(testDataReader);

    【讨论】:

    • 您好,感谢您的帮助,我已按照您的建议进行操作,但无法获取数据。请检查代码。我在那里签到后编辑了我的问题。谢谢
    【解决方案2】:

    您有混合的命名空间。你在找System.Data.IDataReader:

    using System.Data;
    

    并添加对该程序集的引用,如果不需要,请删除 Microsoft.ReportingServices.DataProcessing

    【讨论】:

    • 我正在寻找 Microsoft.ReportingServices.DataProcessing.IDataReader
    • 但是SqlDataReader 没有实现它。它实现了System.Data.IDataReader
    【解决方案3】:

    您想要Microsoft.ReportingServices.DataProcessing.IDataReader,我假设不是,这表明您在 using 语句中引用了一些 ReportingServices 及其 IDataReader 的实现。

    因此您可以删除该引用,或完全限定方法中的IDataReader,即public System.Data.IDataReader ExecuteReader(CommandBehavior behavior)

    【讨论】:

    • 是的,我想要 Microsoft.ReportingServices.DataProcessing.IDataReader 而不是 System.Data.IDataReader
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多