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

时间:2018-01-19 17:42:37

标签: c# sql db2 ibm-midrange ranorex

我在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();
    }
}

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

3 个答案:

答案 0 :(得分:2)

您在该代码中有两个缺陷。我认为您将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的错误声明引起的。由于myCommandiDB2Command(并且不是 a SqlCommand),因此其ExecuteReader()方法会返回IBM.Data.DB2.iSeries.iDB2DataReader,而不是SqlDataReader {1}}。

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

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

答案 1 :(得分:1)

首先要做的事情,更新您的方法定义以返回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 - 您尝试返回单个值而不是datareader,因此请使用类似

的内容
int hasRecords = (int)cmd.ExecuteScalar();

答案 2 :(得分:0)

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