无法将System.Data.SqlClient.SqlDataReader类型隐式转换为Microsoft.ReportingServices.DataProcessing.IDataReader

时间:2015-04-29 07:12:13

标签: c#

我收到以下错误:

  

无法隐式转换类型&System; 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);
            }

        }

3 个答案:

答案 0 :(得分:2)

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);

答案 1 :(得分:1)

您有混合名称空间。您正在寻找System.Data.IDataReader

using System.Data;

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

答案 2 :(得分:0)

你想要一个Microsoft.ReportingServices.DataProcessing.IDataReader,我假设没有,这表明在你的使用陈述中你已经引用了一些ReportingServices及其IDataReader的实现。< / p>

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