我在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();
}
}
我无法解决如何解决问题,但我无法找到有关错误本身的任何信息。我很感激人们可以提供的任何支持/建议。
答案 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
的错误声明引起的。由于myCommand
是iDB2Command
(并且不是 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的帖子都提供了我的问题的解决方案。谢谢你们两个。