2015年10月30日 星期五

C# call AS400 RPG program



背景


因為有RPG程式老舊但一時間又不能轉出來,只能先靠程式去呼叫,
所以就用C#引用AS400元件去呼叫RPG,得到結果。

使用DLL

C:\Program Files (x86)\IBM\Client Access\Shared\cwbx.dll


加入參考的時候要注意內嵌 Interop 型別的問題


REF:http://blog.miniasp.com/post/2010/06/21/dot-net-4-Interop-type-cannot-be-embedded-Use-the-applicable-interface-instead.aspx


程式碼參考:


REF:http://forums.asp.net/t/1817332.aspx?calling+as400+programs+from+c+



using cwbx;
public string getRPGProgramReturnValue(string functionName, string LibraryName, string ProgramName, ProgramParameters parameters, string outputParameterName, out CUDResult msg)
{

    msg = new CUDResult();
    string result = string.Empty;
    StringConverter stringConverter = new StringConverterClass();
    AS400System system = new AS400System();

    try
    {
        // 定義 AS400 連線資訊
        system.Define("AS400");
        system.UserID = "你的帳號";
        system.Password = "你的密碼";
        //注意:一定要是IP,用domain網址會跳一個"CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87"的錯誤
        system.IPAddress = "你的伺服器IP";
        system.Connect(cwbcoServiceEnum.cwbcoServiceRemoteCmd);

        // 有連線才繼續
        if (system.IsConnected(cwbcoServiceEnum.cwbcoServiceRemoteCmd) == 1)
        {
            // 宣告程式物件 連到系統    
            cwbx.Program program = new cwbx.Program();
            program.LibraryName = LibraryName;
            program.ProgramName = ProgramName;
            program.system = system;

            // 呼叫程式
            try
            {
                program.Call(parameters);
            }
            catch (Exception ex)
            {
                msg.status = false;
                msg.msg += "呼叫程式時發生錯誤:" + ex.Message + "\n";

                if (system.Errors.Count > 0)
                {
                    msg.msg += "呼叫程式時發生system錯誤:";
                    foreach (cwbx.Error error in system.Errors)
                    {
                        msg.status = false;
                        msg.msg += error.Text + "\n";
                    }
                }

                if (program.Errors.Count > 0)
                {
                    msg.msg += "呼叫程式時發生program錯誤:";
                    foreach (cwbx.Error error in program.Errors)
                    {
                        msg.status = false;
                        msg.msg += error.Text + "\n";
                    }
                }
            }
            result = stringConverter.FromBytes(parameters[outputParameterName].Value);
        }
        else
        {
            msg.status = false;
            msg.msg += "無法連線到AS400 ServiceRemoteCmd\n";
        }
        system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll);
        msg.status = true;
    }
    catch (Exception ex)
    {
        system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll);
        msg.status = false;
        msg.msg += "執行" + functionName + "時發生錯誤:" + ex.Message + "\n";
    }
    return result;
}



追記

20180530 在改寫舊程式時我把IP換成DOMAIN,因應管理要求,
結果就跳出一個CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87的錯誤,
研究了半天想說自己沒改什麼東西,google也查不到什麼,
回頭看自己改的東西才想到那個欄位是IP,該不會不能填網址,
就改回IP,就正常了,算踩到一個雷。
但他還有一個IPAddressLookupMode屬性,我是沒試過。

沒有留言:

張貼留言