2011-03-08 36 views
3

我有一个调用SQLRPGLE程序的存储过程。程序运行良好,因为我已经在调试器中进行了验证并按预期发送了返回值。相反,当看着cmd.Parameters["@ISMATCH"].Value = {}时会返回什么结果。我猜测我做错了什么。会是什么呢?iSeries存储过程调用RPG程序不会将值返回给程序

存储过程:

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 

回答

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

1

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

+0

不,没有看到解决它。我猜INOUT只对这种情况下的汉堡包有好处。 :0) – 2011-03-08 22:31:15

0

如果将out参数更改为nvarchar(1),并更改sproc,该怎么办。 N型对应于iDB2Char型吗?

+0

类似的是我将要尝试接下来的事情。感谢这个想法。我只会返回Alpha,看看会发生什么。 – 2011-03-09 14:28:48