77家的会客2010

.NET调用AS/400上的程序(.NET CALL AS/400 PGM)
Weather:晴转阴,东北风5-6级转西北风5-6级,(-5~-2)℃

.NET连接AS/400有以下几种方式

  1. OLEDB(CA)
  2. ODBC(CA)
  3. IBM.Data.DB2.iSeries(CA*)
  4. CWBX(CA*)

后面标有(CA)说明,这四种连接方式都是基于CLIENT ACCESS的,而后面两种,其实只是需要CA装完后提取出两个相应的DLL就可以了,前两种则得依赖系统安装CA进行驱动支持。

几种连接方式能进行的操作也是各有区别的

  1. OLEDB,可进行SQL查询操作,可以CALL 400上的CL程序
  2. ODBC,实现的功能同OLEDB
  3. IBM.Data.DB2.iSeries,理论上也是支持上述2种,但目前我只用成了SQL查询和存储过程调用,CALL程序一直没试成功,也可能压根就不支持
  4. CWBX,IBM提供的标准的访问AS/400上的程序的DLL,当然,也只能进行程序的CALL操作

SQL查询操作没什么好说的,主要说一下CALL程序

第一种,OLEDB方式(ODBC同此,只是连接方式不同)

const string connStr = @"Provider=IBMDA400.DataSource.1;Data Source=192.168.101.8;User ID=AST009;Password=AST009;Default Collection=AST009OLIB";
OleDbConnection conn = new OleDbConnection(connStr);
OleDbCommand cmd = new OleDbCommand(@"{{CALL LCDOLIB/PAB010(?, ?)}}", conn);
conn.Open();
cmd.Parameters.Add("PARM1",OleDbType.Char, 128);
cmd.Parameters["PARM1"].Value = textBox2.Text;
cmd.Parameters["PARM1"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("PARM2", OleDbType.Char, 128);
cmd.Parameters["PARM2"].Value = string.Empty;
cmd.Parameters["PARM2"].Direction = ParameterDirection.Output;

cmd.ExecuteNonQuery();

string result = cmd.Parameters["PARM2"].Value;

//do something with result
//...

 

第二种,使用CWBX方式

using System;
using cwbx;

namespace dotNetTest
{
public class AS400Program
{
private cwbx.AS400System as400;
private cwbx.Program pgm;

public AS400Program()
{
as400 = new cwbx.AS400SystemClass();
pgm = new cwbx.Program();
//config program
as400.Define("192.168.101.8");
pgm.system = as400;
pgm.system.UserID = "ast009";
pgm.system.Password = "ast009";
pgm.libraryName = "AST009OLIB";
pgm.ProgramName = "PAB010";
//run program
as400.Connect(cwbx.cwbcoServiceEnum.cwbcoServiceRemoteCmd);
//define the as400 rpg's parameters
cwbx.ProgramParameters parameters = new cwbx.ProgramParametersClass();

parameters.Append("INPARM1", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 128);
parameters["INPARM1"].Value = stringConverter.ToBytes(partId.PadRight(128, ' '));
parameters.Append("OUTPARM1", cwbx.cwbrcParameterTypeEnum.cwbrcOutput, 128);

program.Call(parameters);

string result = stringConverter.FromBytes(parameters["OUTPARM1"].Value);

program.Close();
as400.Disconnect(cwbx.cwbcoServiceEnum.cwbcoServiceAll);

//do something with result
//...
}
}
}

那么,很重要的问题,IBM.Data.DB2.iSeries.dll和CWBX.dll从哪儿来呢?

答案:安装CLIENT ACCESS,安装时注意要选择.NET支持,这样在CA的程序目录里就会有第一个DLL,而后面的CWBX同样在CA程序目录的某个文件夹下,搜索吧。

历史上的今天: [2006/11/17]牙~~~痛~~~
[2005/11/17]CFLOCK参考说明--范例
[2005/11/17]CFLOCK参考说明(下)

[.NET调用AS/400上的程序(.NET CALL AS/400 PGM)]的回复

re 于 2008-11-18 00:20:57 发表 | IP:114.93.105.*

Google 又开始收录3rgb了: http://www.google.cn/search?q=site%3A3rgb.com 336项结果。

柠檬园主 于 2008-11-18 20:32:47 发表 | IP:119.109.17.*

哈哈,是哈。不過已經不再看重那些了。。。

俺的N3C已經打好基礎了,開始擴展了。

大雾雾 于 2008-11-20 09:17:37 发表 | IP:123.120.200.*

http://bbs.55bbs.com/thread-2115146-1-1.html柠檬这个是我发的地瓜面包的方子。。。。。不过微波炉肯定烤不了啦~~~

4#   Sutra 于 2008-11-25 22:50:15 发表 | IP:114.93.105.*

N3C是个啥子的缩写?

5#   柠檬园主 于 2008-11-26 22:31:38 发表 | IP:119.109.16.*

过阵就知道了,不过估计你也猜个差不多了

6#   Lao Tang 于 2020-04-15 02:11:01 发表 | IP:185.152.67.*
如果传入的参数是in out 的 decimal(15,2)应该怎么各回各家
Post a Comment~