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

C#-无法隐式转换类型';IBM.Data.DB2.iSeries.iDB2DataReader';至';System.Data.SqlClient.SqlDataReader';,c#,sql,db2,ibm-midrange,ranorex,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

我在一个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”

在第一个方法的“returnnewidb2connection(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();
    }
}

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

您的代码中有两个缺陷。我认为您将
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()) { ... }

你的代码有两个缺陷。我认为您将
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()) { ... }

首先,更新方法定义以返回
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()强制转换为
IDB2数据读取器
-您试图返回单个值,而不是数据读取器,因此请使用类似

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

首先,更新方法定义以返回
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()强制转换为
IDB2数据读取器
-您试图返回单个值,而不是数据读取器,因此请使用类似

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

我似乎无法将这两个回复都标记为正确答案,但勒内·沃格特和埃桑·乌拉·纳齐尔的帖子都为我的问题提供了答案。感谢你们两位。

我似乎无法将两个回复都标记为正确答案,但勒内·沃格特和埃桑·乌拉·纳齐尔的帖子都为我的问题提供了答案。谢谢你们两位。

您的方法sQlConnect有点多余。您的方法sQlConnect有点多余。谢谢您的帮助。我现在已经打开了连接器,但是需要处理第二种方法中的SQL。谢谢你的帮助。我现在已经打开了连接器,但是需要处理第二种方法中的SQL。谢谢你的帮助。我现在已经打开了连接器,但是需要处理第二种方法中的SQL。谢谢你的帮助。我现在已经设法打开了连接器,但需要处理第二种方法中的SQL。