C# - 无法将类型“IBM.Data.DB2.iSeries.iDB2DataReader”隐式转换为“System.Data.SqlClient.SqlDataReader”

Posted

技术标签:

【中文标题】C# - 无法将类型“IBM.Data.DB2.iSeries.iDB2DataReader”隐式转换为“System.Data.SqlClient.SqlDataReader”【英文标题】:C# - Cannot implicitly convert type 'IBM.Data.DB2.iSeries.iDB2DataReader' to 'System.Data.SqlClient.SqlDataReader' 【发布时间】:2018-01-19 17:42:36 【问题描述】:

我正在从事 Ranorex 项目,但这不是 Ranorex 特定的问题。我需要打开一个到 AS400 DB2 数据库的连接,然后对其运行 SQL 查询。

我有成功打开连接并返回 SQL 查询结果的代码。

iDB2Connection cn = new iDB2Connection("Data Source=as400_DB;User ID=CLIENT;Password=CLIENT;Default Collection=XXXXXX;Naming=System");
 cn.Open();
 iDB2Command cmd = new iDB2Command("select count(*) from ABC_table where xxxx = 'WC' AND xxxx = 'L302328'", cn);
 int count = Convert.ToInt32(cmd.ExecuteScalar());
 Report.Log(ReportLevel.Info, "count", count.ToString());
 cn.Close(); 

在代码中,第二种方法调用第一种方法打开连接,然后允许第二种方法运行SQL命令,但我得到以下错误:

无法隐式转换类型“IBM.Data.DB2.iSeries.iDB2DataReader” 到'System.Data.SqlClient.SqlDataReader'

在第一种方法中的“return new iDB2Connection(cn.ToString())”点。

    public static class sQlHelper

    private static SqlConnection sQlConnect()
       

            iDB2Connection cn = new iDB2Connection("Data Source=as400_DB;User ID=CLIENT;Password=CLIENT;Default Collection=XXXXXX;Naming=System");

            return new iDB2Connection(cn.ToString());

    

    public static void validateResult()
    
            var myConnection = sQlConnect();
            myConnection.Open();

            string sqlStatementForCheckHeaders = "select count(*) from ABC_table where xxxx = 'WC' AND xxxx = 'L302328'";
            int count = Convert.ToInt32(cmd.ExecuteScalar());

            SqlDataReader myReader = null;
            iDB2Command myCommand = new iDB2Command(sqlStatementForCheckHeaders, myConnection);
            myReader = myCommand.ExecuteReader();
            while(myReader.Read())
            
                Console.WriteLine(myReader["Column1"].ToString());
                Console.WriteLine(myReader["Column2"].ToString());
            

            myConnection.Close();
    

我无法确定如何解决问题,也无法找到有关错误本身的任何信息。我将不胜感激人们可以提供的任何支持/建议。

【问题讨论】:

你的方法 sQlConnect 有点多余。 【参考方案1】:

你的代码有两个缺陷。我认为您将 System.Data.SqlClient 命名空间与 IBM.Data.DB2.iSeries 混淆了。

首先,您的sQlConnect 方法被声明为返回SqlConnection,但改为返回iDB2Connection。修复签名:

private static iDB2Connection sQlConnect() // returns a IDB2Connection!
   
    return new iDB2Connection("Data Source=as400_DB;User ID=CLIENT;Password=CLIENT;Default Collection=XXXXXX;Naming=System");

第二条错误信息是由myReader 的错误声明引起的。由于myCommand 是一个iDB2Command(并且不是一个SqlCommand),它的ExecuteReader() 方法返回一个IBM.Data.DB2.iSeries.iDB2DataReader,而不是一个SqlDataReader

所以你只需要更改myReader的声明:

 iDB2Command myCommand = new iDB2Command(sqlStatementForCheckHeaders, myConnection);
 // use the correct type (or var)
 iDB2DataReader myReader = myCommand.ExecuteReader();
 while(myReader.Read())  ... 

【讨论】:

感谢您的帮助。我现在已经设法打开了连接器,但需要处理第二种方法中的 SQL。【参考方案2】:

第一件事,更新你的方法定义以返回iDB2Connection而不是SQLConnection

 private static iDB2Connection sQlConnect()
  
        return new iDB2Connection("Data Source=as400_DB;User ID=CLIENT;Password=CLIENT;Default Collection=XXXXXX;Naming=System");

 

其次

cmd.ExecuteScalar(); 不能转换为 iDB2DataReader - 您试图返回单个值而不是数据读取器,因此请使用类似

int hasRecords = (int)cmd.ExecuteScalar();

【讨论】:

感谢您的帮助。我现在已经设法打开了连接器,但需要处理第二种方法中的 SQL。【参考方案3】:

我似乎无法将这两个回复都标记为正确答案,但 René Vogt 和 Ehsan Ullah Nazir 的帖子都为我的问题提供了解决方案。谢谢你们俩。

【讨论】:

以上是关于C# - 无法将类型“IBM.Data.DB2.iSeries.iDB2DataReader”隐式转换为“System.Data.SqlClient.SqlDataReader”的主要内容,如果未能解决你的问题,请参考以下文章

无法将“System.String”类型的对象转换为 C# 中的“Oracle.DataAccess.Client.OracleParameter”类型

无法将“System.Object []”类型的对象转换为我的类 C#

C# 无法将类型 system.DateTime转换成 string[]

C# Unity 无法将浮点类型隐式转换为 int [关闭]

向启用文本框 (C#) 的 Web 部件添加按钮,出现错误:无法将类型“bool”隐式转换为“字符串”

C#:无法从程序集中加载类型