【问题标题】:Cannot implicitly convert type 'System.Data.SqlClient.SqlDataReader' to 'System.Data.OracleClient.OracleDataReader' in C#无法在 C# 中将类型“System.Data.SqlClient.SqlDataReader”隐式转换为“System.Data.OracleClient.OracleDataReader”
【发布时间】:2013-12-25 02:55:03
【问题描述】:

我在 C# 中创建了一个类,但我的代码显示错误。 错误是 =>无法将类型“System.Data.SqlClient.SqlDataReader”隐式转换为“System.Data.OracleClient.OracleDataReader”

我在 return SqlHelper.ExecuteReader(CnSettings.cnString1, CommandType.Text, commandText); 时遇到错误;

public OracleDataReader getWeightmntInfoForCenter(string startdate, string enddate, string unitcode)
{
   string commandText = string.Concat(new string[]
   {
      "select m.unitcode unit_code, to_char(tran_date, 'dd-MON-yy') m_date,
      to_char(m_purchy) m_number, net AS n_weight, to_number(substr(g.ryot_code,5))
      m_grow, to_number(substr(g.ryot_code,1,4)) m_vill, g.mob g_phoneno, 
      m.s_purchy indent_number from sisl_purpurchase m,cn_ryot_mst g where 
      m.unitcode=g.unit_code and lpad(v_code,4,0)||lpad(f_code,5,0)=g.ryot_code And
      length(g.mob)=10 And m.tran_date between '", startdate, "' and '", enddate, 
      "' And nvl(m_sms_send, 0)=0 AND m.unitcode = '",unitcode,"' And rownum <= 10"
   });
   return SqlHelper.ExecuteReader(CnSettings.cnString1, CommandType.Text, commandText);
}

【问题讨论】:

  • 你的SqlHelper.ExecuteReader返回错误类型,所以或者使用SqlDataReader insted of OracleDataReader或者修改你的助手
  • 显示 SqlHelper.ExecuteReader 的代码 - 可能返回错误的类型

标签: c#


【解决方案1】:

SqlHelper.ExecuteReader 返回错误的类型 - SqlDataReader;当您的 getWeightmntInfoForCenter 方法期望返回 OracleDataReader 时。

如果你想返回SqlDataReader,你可以改变这个方法的签名:

public IDataReader getWeightmntInfoForCenter(...)

这指定此方法将返回一个实现IDataReader 的类,但没有准确指定具体类型,这意味着您可以返回SqlDataReader @ 987654329@(因为两个类都实现了这个接口)。

【讨论】:

  • 您的解决方案很好,但如果他需要特定类型的方法,例如:reader.GetOracleString(0);
  • @YairNevet 然后他应该选择其他答案之一 ;) - 不过,根据方法的名称,任何调用方法都应该独立于特定于实现的细节,例如 @987654331 @.
  • 或者升级它:getWeightmntInfoForCenter(...) as OracleDataReader
  • @YairNevet 是的,强制转换是一种选择,但通常会暗示某些地方的设计很糟糕 - 如果您需要可能不可用的东西,则不应调用需要 IDataReader 的方法在返回的对象上,否则首先使用接口是没有意义的。
【解决方案2】:

SqlHelper.ExecuteReader() 返回一个 SqlDataReader 类型的对象,但您的方法的返回类型是 OracleDataReader,这是不同的。

您可以更改方法签名以返回 DbDataReader。 Oracle 和 Sql Server 的特定数据读取器类都派生自该通用类:

public DbDataReader getWeightmntInfoForCenter(...)
{
    ...
}

另一方面,如果您使用的是 Oracle 数据库,则不能使用 SqlHelper.ExecuteReader(),因为它是 SQL Server 的特定实现。改为查看OracleCommand.ExecuteReader()

【讨论】:

  • 是的,我试过了,但它不起作用@Davecz ans 是正确的。我对我的 sqlhelper 文件进行了更改,它工作正常。
【解决方案3】:

您的getWeightmntInfoForCenter 方法签名返回typeOracleDataReader,而您实际上返回的是SqlDataReader,请看:

return SqlHelper.ExecuteReader(...

更改您的代码以调用:OracleCommand.ExecuteReader 方法,以便正确返回 OracleDataReader

这样做:

    public OracleDataReader GetWeightmntInfoForCenter(string startdate, string enddate, string unitcode)
    {
        string commandText = string.Concat(new[]
            {
                "select m.unitcode unit_code, to_char(tran_date, 'dd-MON-yy') m_date, to_char(m_purchy) m_number, net AS n_weight, to_number(substr(g.ryot_code,5)) m_grow, to_number(substr(g.ryot_code,1,4)) m_vill, g.mob g_phoneno,m.s_purchy indent_number from sisl_purpurchase m,cn_ryot_mst g where m.unitcode=g.unit_code and lpad(v_code,4,0)||lpad(f_code,5,0)=g.ryot_code And length(g.mob)=10 And m.tran_date between '"
                , startdate, "' and '", enddate, "' And nvl(m_sms_send, 0)=0 AND m.unitcode = '", unitcode,
                "' And rownum <= 10"
            });

        using (var connection = new OracleConnection(CnSettings.cnString1))
        {
            var command = new OracleCommand(commandText, connection);
            connection.Open();
            return command.ExecuteReader();
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多