调用RPG程序的iSeries存储过程不会向程序返回值

时间:2011-03-08 21:57:12

标签: c# stored-procedures ibm-midrange rpgle

我有一个调用SQLRPGLE程序的存储过程。程序运行正常,因为我已在调试器中验证并按预期发送返回值。而是在查看cmd.Parameters["@ISMATCH"].Value = {}时返回的内容。我猜我做错了什么。它可能是什么?

存储过程:

CREATE PROCEDURE "MPRLIB"."CHECKHOURS" (EMPLOYEEID DECIMAL(10 , 0), 
    INOUT ISMATCH CHAR(1))
LANGUAGE RPGLE
PARAMETER STYLE SQL
NOT DETERMINISTIC
MODIFIES SQL DATA 
SPECIFIC CHECKHOURS 
NEW SAVEPOINT LEVEL
EXTERNAL NAME 'MPRLIB/MPRLRCHK';

我的方法:

    public bool IsValidTimesheet(int id)
    {
        bool isValid = false;

        // Get the data from the iSeries
        using (iDB2Connection conn = new iDB2Connection(ConfigurationManager.ConnectionStrings["IbmIConnectionString"].ConnectionString))
        {
            using (iDB2Command cmd = conn.CreateCommand())
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "LIB.CHECKHOURS";

                cmd.Parameters.Add("@EMPLOYEEID", iDB2DbType.iDB2Decimal).Value = id;
                cmd.Parameters.Add("@ISMATCH", iDB2DbType.iDB2Char).Direction = ParameterDirection.Output;
                conn.Open();
                cmd.ExecuteNonQuery();
                isValid = (cmd.Parameters["@ISMATCH"].Value.ToString() == "1") ? true : false;
                conn.Close();
            }
        }

        return isValid;
    }

我的RPG程序参数:

 D CHECKHOURS      PR                  extpgm('CHECKHOURS')
 D  id                           10P 0
 D  isMatch                       1A

3 个答案:

答案 0 :(得分:1)

我有一个模糊的回忆,尽管你把它称为OUT参数,它确实应该是一个INOUT parm,因为RPG处理parms的方式。如果将创建过程更改为INOUT并在C#中进行相关更改,会发生什么?

答案 1 :(得分:1)

解决方案应该是

CREATE PROCEDURE "MPRLIB"."CHECKHOURS" (EMPLOYEEID DECIMAL(10 , 0), 
    INOUT ISMATCH CHAR(1))
    LANGUAGE RPGLE
    PARAMETER STYLE GENERAL
    NOT DETERMINISTIC
    MODIFIES SQL DATA 
    SPECIFIC CHECKHOURS 
    NEW SAVEPOINT LEVEL
    EXTERNAL NAME 'MPRLIB/MPRLRCHK';

感谢Schadd on MIDRANGE-L

答案 2 :(得分:0)

如果将out参数更改为nvarchar(1),然后更改sproc,该怎么办? N型是否对应于iDB2Char类型?