如何在 C# 中将二进制 (4) 参数的数组 (*) 传递给 IBM iSeries api?
How to pass an array(*) of binary(4) parameter to IBM iSeries api in C#?
我正在尝试在 C# 中检索假脱机文件,并且我使用 cwbx.dll.
在我的程序中成功地显示了 WRKSPLF 中的大部分信息
然而,事实证明我使用的格式 SPLF0100 和 SPLF0300 没有用,因为第一个没有 return 我需要的一些字段,比如日期,另一个 return内部作业和假脱机文件标识符我需要使用 QSPOPNSP API 来实际读取文件。所以我需要使用 SPLF0200。
问题是,该格式要求您将二进制 (4) 的数组 (*) 与您想要 returned 的字段的键一起传递,我不知道该怎么做在 C# 上。
我看到一个使用这样的数据结构的 RPG 示例:
IKEYARA DS (7)
I I 201 B 1 40KEY1
I I 216 B 5 80KEY2
I I 211 B 9 120KEY3
C CALL 'QUSLSPL' (3)
C PARM SPCNAM
C PARM 'SPLF0200'FORMAT 8 (4)
C PARM '*CURRENT'USRNAM 10
C PARM '*ALL' OUTQ 20
C PARM '*ALL' FRMTYP 10
C PARM '*ALL' USRDTA 10
C PARM QUSBN
C PARM JOBNAM 26
C PARM KEYARA
C PARM 3 KEY#
所以我尝试使用 cwbx.Structure 来做同样的事情:
Program programSpool = new Program();
programSpool.LibraryName = "QSYS";
programSpool.ProgramName = "QUSLSPL";
programSpool.system = system;
ProgramParameters parametersQuslpl = new ProgramParameters();
//nombre userspace creado anteriormente
parametersQuslpl.Append("usrspcnam", cwbrcParameterTypeEnum.cwbrcInout, 20);
StringConverter stringConverterUsrspcnam = new cwbx.StringConverterClass();
stringConverterUsrspcnam.Length = 20;
parametersQuslpl["usrspcnam"].Value = stringConverterUsrspcnam.ToBytes("FLEON QGPL ");
//tipo de formato a leer del spool
parametersQuslpl.Append("frmname", cwbrcParameterTypeEnum.cwbrcInout, 8);
StringConverter stringConverterFrmname = new cwbx.StringConverterClass();
stringConverterFrmname.Length = 8;
parametersQuslpl["frmname"].Value = stringConverterFrmname.ToBytes("SPLF0200");
//nombre de usuario del spool a bajar
parametersQuslpl.Append("usrnam", cwbrcParameterTypeEnum.cwbrcInout, 10);
StringConverter stringConverterUsrnam = new cwbx.StringConverterClass();
stringConverterUsrnam.Length = 10;
parametersQuslpl["usrnam"].Value = stringConverterUsrnam.ToBytes("*CURRENT");
//nombre de cola de salida
parametersQuslpl.Append("cola", cwbrcParameterTypeEnum.cwbrcInout, 20);
StringConverter stringConverterCola = new cwbx.StringConverterClass();
stringConverterCola.Length = 20;
parametersQuslpl["cola"].Value = stringConverterCola.ToBytes("*ALL");
//tipo de formulario
parametersQuslpl.Append("frmtyp", cwbrcParameterTypeEnum.cwbrcInout, 10);
StringConverter stringConverterFrmtyp = new cwbx.StringConverterClass();
stringConverterFrmtyp.Length = 10;
parametersQuslpl["frmtyp"].Value = stringConverterFrmtyp.ToBytes("*ALL");
//data de usuario
parametersQuslpl.Append("usrdta", cwbrcParameterTypeEnum.cwbrcInout, 10);
StringConverter stringConverterUsrdta = new cwbx.StringConverterClass();
stringConverterUsrdta.Length = 10;
parametersQuslpl["usrdta"].Value = stringConverterUsrdta.ToBytes("*ALL");
//error?
parametersQuslpl.Append("error", cwbrcParameterTypeEnum.cwbrcInout, 116);
StructureClass sc2 = new StructureClass();
sc2.Fields.Append("bytesprov", 4);
sc2.Fields.Append("bytesavail", 4);
sc2.Fields.Append("messageid", 7);
sc2.Fields.Append("err", 1);
sc2.Fields.Append("messagedta", 100);
parametersQuslpl["error"].Value = sc2.Bytes;
//nombre trabajo
parametersQuslpl.Append("nombretrabajo", cwbrcParameterTypeEnum.cwbrcInput, 26);
stringConverterUsrdta.Length = 26;
parametersQuslpl["nombretrabajo"].Value = stringConverterUsrdta.ToBytes("* ");
//keys
parametersQuslpl.Append("keys", cwbrcParameterTypeEnum.cwbrcInput, 103);
StructureClass keys = new StructureClass();
keys.Fields.Append("nombrearchivo", 10); //char10 201
keys.Fields.Append("usuario", 10); //char10 203
keys.Fields.Append("nombrecola", 10); //206
keys.Fields.Append("datosusuario", 10); //209
keys.Fields.Append("estado", 10); //210
keys.Fields.Append("paginas", 4); //bin 211
keys.Fields.Append("copias", 4); //bin 213
keys.Fields.Append("fecha", 7); //216
keys.Fields.Append("hora", 6); //217
keys.Fields.Append("idtrabajo", 16); //218
keys.Fields.Append("idarchivo", 16); //219*/
parametersQuslpl["keys"].Value = keys.Bytes;
//cantidad keys a devolver
parametersQuslpl.Append("cantidadkeys", cwbrcParameterTypeEnum.cwbrcInput, 4);
LongConverterClass LongConverterKeys = new cwbx.LongConverterClass();
parametersQuslpl["cantidadkeys"].Value = LongConverterKeys.ToBytes(11);
但是,我收到以下错误:
"CPF34C2 - Too many selection criteria specified."
有人知道如何进行吗?
如果您使用 DSPMSGD 查看消息详细信息...
原因。 . . . . : 当合格的作业名称被指定为选择时
条件、用户名、表单类型、用户指定数据和输出队列
名称选择标准必须为空。
我正在尝试在 C# 中检索假脱机文件,并且我使用 cwbx.dll.
在我的程序中成功地显示了 WRKSPLF 中的大部分信息然而,事实证明我使用的格式 SPLF0100 和 SPLF0300 没有用,因为第一个没有 return 我需要的一些字段,比如日期,另一个 return内部作业和假脱机文件标识符我需要使用 QSPOPNSP API 来实际读取文件。所以我需要使用 SPLF0200。
问题是,该格式要求您将二进制 (4) 的数组 (*) 与您想要 returned 的字段的键一起传递,我不知道该怎么做在 C# 上。 我看到一个使用这样的数据结构的 RPG 示例:
IKEYARA DS (7)
I I 201 B 1 40KEY1
I I 216 B 5 80KEY2
I I 211 B 9 120KEY3
C CALL 'QUSLSPL' (3)
C PARM SPCNAM
C PARM 'SPLF0200'FORMAT 8 (4)
C PARM '*CURRENT'USRNAM 10
C PARM '*ALL' OUTQ 20
C PARM '*ALL' FRMTYP 10
C PARM '*ALL' USRDTA 10
C PARM QUSBN
C PARM JOBNAM 26
C PARM KEYARA
C PARM 3 KEY#
所以我尝试使用 cwbx.Structure 来做同样的事情:
Program programSpool = new Program();
programSpool.LibraryName = "QSYS";
programSpool.ProgramName = "QUSLSPL";
programSpool.system = system;
ProgramParameters parametersQuslpl = new ProgramParameters();
//nombre userspace creado anteriormente
parametersQuslpl.Append("usrspcnam", cwbrcParameterTypeEnum.cwbrcInout, 20);
StringConverter stringConverterUsrspcnam = new cwbx.StringConverterClass();
stringConverterUsrspcnam.Length = 20;
parametersQuslpl["usrspcnam"].Value = stringConverterUsrspcnam.ToBytes("FLEON QGPL ");
//tipo de formato a leer del spool
parametersQuslpl.Append("frmname", cwbrcParameterTypeEnum.cwbrcInout, 8);
StringConverter stringConverterFrmname = new cwbx.StringConverterClass();
stringConverterFrmname.Length = 8;
parametersQuslpl["frmname"].Value = stringConverterFrmname.ToBytes("SPLF0200");
//nombre de usuario del spool a bajar
parametersQuslpl.Append("usrnam", cwbrcParameterTypeEnum.cwbrcInout, 10);
StringConverter stringConverterUsrnam = new cwbx.StringConverterClass();
stringConverterUsrnam.Length = 10;
parametersQuslpl["usrnam"].Value = stringConverterUsrnam.ToBytes("*CURRENT");
//nombre de cola de salida
parametersQuslpl.Append("cola", cwbrcParameterTypeEnum.cwbrcInout, 20);
StringConverter stringConverterCola = new cwbx.StringConverterClass();
stringConverterCola.Length = 20;
parametersQuslpl["cola"].Value = stringConverterCola.ToBytes("*ALL");
//tipo de formulario
parametersQuslpl.Append("frmtyp", cwbrcParameterTypeEnum.cwbrcInout, 10);
StringConverter stringConverterFrmtyp = new cwbx.StringConverterClass();
stringConverterFrmtyp.Length = 10;
parametersQuslpl["frmtyp"].Value = stringConverterFrmtyp.ToBytes("*ALL");
//data de usuario
parametersQuslpl.Append("usrdta", cwbrcParameterTypeEnum.cwbrcInout, 10);
StringConverter stringConverterUsrdta = new cwbx.StringConverterClass();
stringConverterUsrdta.Length = 10;
parametersQuslpl["usrdta"].Value = stringConverterUsrdta.ToBytes("*ALL");
//error?
parametersQuslpl.Append("error", cwbrcParameterTypeEnum.cwbrcInout, 116);
StructureClass sc2 = new StructureClass();
sc2.Fields.Append("bytesprov", 4);
sc2.Fields.Append("bytesavail", 4);
sc2.Fields.Append("messageid", 7);
sc2.Fields.Append("err", 1);
sc2.Fields.Append("messagedta", 100);
parametersQuslpl["error"].Value = sc2.Bytes;
//nombre trabajo
parametersQuslpl.Append("nombretrabajo", cwbrcParameterTypeEnum.cwbrcInput, 26);
stringConverterUsrdta.Length = 26;
parametersQuslpl["nombretrabajo"].Value = stringConverterUsrdta.ToBytes("* ");
//keys
parametersQuslpl.Append("keys", cwbrcParameterTypeEnum.cwbrcInput, 103);
StructureClass keys = new StructureClass();
keys.Fields.Append("nombrearchivo", 10); //char10 201
keys.Fields.Append("usuario", 10); //char10 203
keys.Fields.Append("nombrecola", 10); //206
keys.Fields.Append("datosusuario", 10); //209
keys.Fields.Append("estado", 10); //210
keys.Fields.Append("paginas", 4); //bin 211
keys.Fields.Append("copias", 4); //bin 213
keys.Fields.Append("fecha", 7); //216
keys.Fields.Append("hora", 6); //217
keys.Fields.Append("idtrabajo", 16); //218
keys.Fields.Append("idarchivo", 16); //219*/
parametersQuslpl["keys"].Value = keys.Bytes;
//cantidad keys a devolver
parametersQuslpl.Append("cantidadkeys", cwbrcParameterTypeEnum.cwbrcInput, 4);
LongConverterClass LongConverterKeys = new cwbx.LongConverterClass();
parametersQuslpl["cantidadkeys"].Value = LongConverterKeys.ToBytes(11);
但是,我收到以下错误:
"CPF34C2 - Too many selection criteria specified."
有人知道如何进行吗?
如果您使用 DSPMSGD 查看消息详细信息...
原因。 . . . . : 当合格的作业名称被指定为选择时
条件、用户名、表单类型、用户指定数据和输出队列
名称选择标准必须为空。