2011-03-08 42 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