Вызов программ AS400 через OleDb вызывает InvalidCastException - PullRequest
0 голосов
/ 27 мая 2011

Я пытаюсь вызвать программу RPG на нашей машине AS / 400, используя OleDb.Как только появятся более сложные типы, такие как даты и десятичные числа, я получаю следующую ошибку:

Значение данных не может быть преобразовано по причинам, отличным от несоответствия знака или переполнения данных.Например, данные были повреждены в хранилище данных, но строка все еще была извлекаема.

Вот код, вызывающий проблему:

            //            '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 ]

1 голос
/ 31 мая 2011

Если вы можете, используйте драйверы IBM i Access ADO.NET и поместите программный вызов в хранимую процедуру. Они могут конвертировать данные из i в ПК.

1 голос
/ 27 мая 2011

Форматы даты (и двоичные числа, например, int / single и т. Д.) Различаются для платформ ПК и мэйнфреймов.Вам нужно будет преобразовать их в текст, а затем обратно, если только коммуникационная платформа не позаботится об этом за вас - чего, очевидно, этот не делает.

Возможно, есть способ выяснить, как это сделать, но если вы единственный, кто использует мэйнфрейм и имеет возможность его изменить, вы будете на несколько часов раньше, забыв об этом и выполниобращает себя на обоих концах.(если кто-то, кто знает, как это читает; -)

Если вы не можете изменить часть as400, ну, не принимайте этот ответ ...

...