Хранимая процедура iSeries, вызывающая программу RPG, не возвращает значение программе

У меня есть хранимая процедура, которая вызывает программу 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

person Mike Wills    schedule 08.03.2011    source источник


Ответы (3)


У меня смутное воспоминание, что, несмотря на то, что вы назвали его параметром OUT, на самом деле это должен быть параметр INOUT из-за того, как RPG обрабатывает параметры. Что произойдет, если вы измените процесс создания на INOUT и внесете соответствующее изменение в C #?

person Walden Leverich    schedule 08.03.2011
comment
Нет, это не помогло. Думаю, в этом случае INOUT подходит только для гамбургеров. : 0) - person Mike Wills; 09.03.2011

Решение должно быть

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';

Спасибо Шадду на MIDRANGE-L.

person Mike Wills    schedule 09.03.2011
comment
Вы можете использовать PARAMETER STYLE SQL, но тогда вам нужно изменить параметры RPG, чтобы включить параметры, неявно включенные в стиль параметра. В качестве примера ознакомьтесь с программами обслуживания iDate Алана Кампина. - person jmarkmurphy; 11.06.2019

А что, если вы измените параметр out на nvarchar (1) и измените sproc. Соответствует ли N-тип типу iDB2Char?

person Walter Hesius    schedule 09.03.2011
comment
Нечто подобное я собираюсь попробовать в следующий раз. Спасибо за идею. Я просто верну Альфу и посмотрю, что будет. - person Mike Wills; 09.03.2011