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 [关闭]