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'

我在 Ranorex 项目中工作,但这不是 Ranorex 特有的问题。我需要打开到 AS400 DB2 数据库的连接,然后 运行 对其进行 SQL 查询。

我有成功打开连接的代码和 returns 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 命令,但出现以下错误:

Cannot implicitly convert type 'IBM.Data.DB2.iSeries.iDB2DataReader' to '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();
    }
}

我不知道如何解决这个问题,也找不到关于错误本身的任何信息。如果有任何 support/advice 人可以提供,我将不胜感激。

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

混淆了

首先,您的 sQlConnect 方法声明为 return 和 SqlConnection,但 return 是 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() 方法 return 是一个 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()) { ... }

首先 要做的事情,将您的方法定义更新为 return 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 - 您正在尝试 return 单个值而不是数据读取器,因此请使用类似

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

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