c# - C#调用AS400程序,从QTEMP中选择文件

标签 c# asp.net-mvc db2 ibm-midrange

我有一个 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;
    }

异常抛出:

QTEMP 类型中的 myFile *FILE 未找到

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

最佳答案

QTEMP 是特定于 session 的...您无法从其他作业访问它..

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

存储过程可以调用 RPG 程序并从 QTEMP 中的文件返回结果,所有这些都在一次调用中完成。

关于c# - C#调用AS400程序,从QTEMP中选择文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53784833/

相关文章:

sql - 为什么调用大数据量的IBM DB2 SELECT存储过程很慢?

c# - (413) 请求实体太大 - 在 Azure 上上传 Wcf 时

c# - 由于过时的 CAS 政策,寻求替代 AppDomain.CreateDomain(string, evidence)

c# - 循环缓冲区的用途是什么?

c# - MVC 3 表单例份验证 User.Identity.Name 返回 false

c# - 存储可以循环编辑的列表?

asp.net-mvc - Owin 在结构图配置之前运行

c# - 线程和委托(delegate)——我不完全理解它们的关系

java - DB2 JDBC SSL 连接

mysql - 如何将 DB2 中的 for 语句转换为 MYSQL