我正在尝试使用OleDb在我们的AS / 400机器上调用RPG程序。一旦有更复杂的类型,如日期和小数,我似乎得到以下错误:
由于符号不匹配或数据溢出以外的原因,无法转换数据值。例如,数据在数据存储中已损坏,但该行仍可检索。
以下是产生问题的代码:
// 'p_refno 9a ()
//'p_projdat *date (output parm)
//'p_amount 13p, 2 (output parm)
//'p_rtnsts 1a (output parm)
using (OleDbConnection cn = new OleDbConnection("Provider=IBMDA400;Data Source=MyAs400;User ID=MyUser;Password=MyPassword;"))
{
cn.Open();
OleDbCommand cmd = new OleDbCommand("{{call PGMLIB.MYPROGRAM(?,?,?,?,?,?,?)}}", cn);
cmd.CommandType = System.Data.CommandType.Text;
OleDbParameter p_refno = new OleDbParameter("p_refno","ED4565654");
OleDbParameter p_projdat = new OleDbParameter("p_projdat", new DateTime());
p_projdat.Direction = System.Data.ParameterDirection.Output;
p_projdat.Size = 8;
OleDbParameter p_amount = new OleDbParameter("p_amount", new Decimal());
p_amount.Direction = System.Data.ParameterDirection.Output;
OleDbParameter p_rtnsts = new OleDbParameter("p_rtnsts", " ");
p_rtnsts.Direction = System.Data.ParameterDirection.Output;
p_rtnsts.Size = 1;
p_amount.DbType = System.Data.DbType.Decimal;
cmd.Parameters.Add(p_refno);
cmd.Parameters.Add(p_mode);
cmd.Parameters.Add(p_source);
cmd.Parameters.Add(p_type);
cmd.Parameters.Add(p_projdat);
cmd.Parameters.Add(p_amount);
cmd.Parameters.Add(p_rtnsts);
cmd.ExecuteNonQuery();
Console.WriteLine(p_projdat.Value.ToString());
Console.WriteLine(p_amount.Value.ToString());
Console.WriteLine(p_rtnsts.Value.ToString());
}
Console.WriteLine("Press any key to quit...");
Console.ReadKey();
我做错了什么?
答案 0 :(得分:1)
日期格式(和二进制数字,例如,int / single等)在PC和大型机平台之间有所不同。您将需要将它们转换为文本,然后再将其转换回来,除非通信平台为您处理这个问题 - 显然这个没有做到。
可能有一种方法可以弄清楚如何做到这一点,但如果你是唯一一个使用大型机的人并且有能力改变它的人,那么你将会因为忘记它并自己完成转换而领先几个小时。两端。 (除非有人知道怎么读这个; - )
如果你不能改变as400作品,那么,不要接受这个答案......
答案 1 :(得分:1)
如果可以,请使用IBM i Access ADO.NET驱动程序并将程序调用放在存储过程中。他们可以将数据从i转换为PC。