使用 C# 从 QTEMP 调用 AS400 程序和 select 文件
Use C# to call AS400 program and select file from QTEMP
我有一个 ASP.Net 应用程序可以调用 AS400 程序以在 QTEMP 下创建文件。但是当我尝试从 QTEMP select 这个文件时,它不存在。
我明白了原因:调用程序和select文件是不同的工作。我无法访问其他作业的 QTEMP。
我对 AS400 了解不多,我唯一能找到的方法是在 QTEMP 以外的另一个库下创建这个文件。但它会影响我不想做的其他应用程序功能。
我正在使用 cwbx.dll 调用 AS400 程序,然后我正在使用 IBM.Data.DB2.iSeries 到 select 来自 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);
}
}
这是我的 select 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访问其他Jobs的问题?
QTEMP
是特定于会话的...您无法从其他作业访问它..
考虑使用可以从 .NET 调用的 SQL 存储过程。
存储过程可以一次调用 QTEMP
中的文件调用 RPG 程序和 return 结果。
我有一个 ASP.Net 应用程序可以调用 AS400 程序以在 QTEMP 下创建文件。但是当我尝试从 QTEMP select 这个文件时,它不存在。
我明白了原因:调用程序和select文件是不同的工作。我无法访问其他作业的 QTEMP。
我对 AS400 了解不多,我唯一能找到的方法是在 QTEMP 以外的另一个库下创建这个文件。但它会影响我不想做的其他应用程序功能。
我正在使用 cwbx.dll 调用 AS400 程序,然后我正在使用 IBM.Data.DB2.iSeries 到 select 来自 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);
}
}
这是我的 select 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访问其他Jobs的问题?
QTEMP
是特定于会话的...您无法从其他作业访问它..
考虑使用可以从 .NET 调用的 SQL 存储过程。
存储过程可以一次调用 QTEMP
中的文件调用 RPG 程序和 return 结果。