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 都为我的问题提供了解决方案。谢谢你们。
我在 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 都为我的问题提供了解决方案。谢谢你们。