通过OleDb调用AS400程序会导致InvalidCastException

时间:2011-05-27 10:28:38

标签: .net oledb ibm-midrange

我正在尝试使用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();

我做错了什么?

2 个答案:

答案 0 :(得分:1)

日期格式(和二进制数字,例如,int / single等)在PC和大型机平台之间有所不同。您将需要将它们转换为文本,然后再将其转换回来,除非通信平台为您处理这个问题 - 显然这个没有做到。

可能有一种方法可以弄清楚如何做到这一点,但如果你是唯一一个使用大型机的人并且有能力改变它的人,那么你将会因为忘记它并自己完成转换而领先几个小时。两端。 (除非有人知道怎么读这个; - )

如果你不能改变as400作品,那么,不要接受这个答案......

答案 1 :(得分:1)

如果可以,请使用IBM i Access ADO.NET驱动程序并将程序调用放在存储过程中。他们可以将数据从i转换为PC。