使用C#调用AS400程序并从QTEMP中选择文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C#调用AS400程序并从QTEMP中选择文件相关的知识,希望对你有一定的参考价值。

我有一个ASP.Net应用程序来调用AS400程序,以便在QTEMP下创建一个文件。但是当我尝试从QTEMP中选择此文件时,它不存在。

我明白原因:调用程序和选择文件是不同的工作。我无法访问其他工作的QTEMP。

我对AS400知之甚少,我能找到的唯一方法就是在QTEMP以外的其他库下创建这个文件。但它会影响我不想做的其他应用功能。

我使用cwbx.dll来调用AS400程序,然后我使用IBM.Data.DB2.iSeries从QTEMP中选择文件。显然他们是两个连接打开。我不确定是否在as400概念下,它们可能是两个独立的工作。

这是调用程序的函数:

As400Caller1.CallAs400Program("myProgram", "myLibrary", paramsList1);

这是CallAs400Program函数:

public void CallAs400Program(string programName, string libraryName, List<AS400Param> parameters) {

            try
            {
                system.Connect(cwbcoServiceEnum.cwbcoServiceRemoteCmd);

                //check connection
                if (system.IsConnected(cwbcoServiceEnum.cwbcoServiceRemoteCmd) == 1)
                {
                    //create a program object and link to the system
                    Program program = new Program();
                    program.LibraryName = libraryName;
                    program.ProgramName = programName;
                    program.system = system;

                    //create a parameter collection associated with the program and pass data
                    ProgramParameters prms = new ProgramParameters();
                    foreach (AS400Param p in parameters)
                    {
                        prms.Append(p.ParameterName, cwbrcParameterTypeEnum.cwbrcInout, p.ParameterLength);
                        if (!p.OutParam)
                        {
                            prms[p.ParameterName].Value = AS400ParamStringConverter.ConvertASCIItoEBCDIC(p.ParameterValue.PadRight(p.ParameterLength, ' '));
                        }
                    }

                    //call the program
                    try
                    {
                        program.Call(prms);
                    }
                    catch (Exception ex)
                    {
                        if (system.Errors.Count > 0)
                        {
                            foreach (cwbx.Error error in system.Errors)
                            {
                                throw ex;
                            }
                        }

                        if (program.Errors.Count > 0)
                        {
                            foreach (cwbx.Error error in program.Errors)
                            {
                                throw ex;
                            }
                        }
                    }
                }
                else
                {
                    Console.WriteLine("No AS400 Service connection");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (system.IsConnected(cwbcoServiceEnum.cwbcoServiceRemoteCmd) == 1)
                    system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll);
            }
        }

这是我的选择SQL代码:

 try
    {
        List<TableRowModel> dataList = new List<TableRowModel>();
        string library = "QTEMP";
        string cmdText = $@"SELECT * FROM {library}.myFile";
        iDB2Command command = new iDB2Command(cmdText);
        command.Connection = IDB2Context.Current;
        iDB2DataReader reader = command.ExecuteReader();

        while (reader.Read())
        {

        }
        return dataList;
    }
    catch (Exception ex)
    {
        throw ex;
    }

抛出异常:

myFile in QTEMP type *FILE not found

如何使用C#解决访问其他作业QTEMP的问题?

答案

QTEMP是特定于会话的...您无法从其他工作访问它...

考虑使用可以从.NET调用的SQL存储过程。

存储过程可以调用RPG程序,并在一次调用中返回QTEMP中文件的结果。

以上是关于使用C#调用AS400程序并从QTEMP中选择文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 IBM SQL 导航锁定文件创建的 AS400 DB2 视图正在使用

使用 CL As400 命令抑制文件 IO

瘦客户端部分用户AS400数据传送无法使用的问题

直接从 Excel 中选择 AS400 查询记录

2AS400 开发环境

使用 SQL 从 AS400 中提取数据的问题