我收到以下错误:
无法隐式转换类型&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);
}
}
答案 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)