Colorful Life2010

.NET调用AS/400上的程序(.NET CALL AS/400 PGM) 补遗
Weather:晴,2-7度

上篇写到用IBM.Data.DB2.iSeries调用AS400时,只能把AS400当做纯DB2数据库来用;后来左思右想,IBM既然出这么个单独的针对.NET2.0的工具,不可能功能就这么简单的啊。于是继续查红皮书,在成堆的蚯蚓文中,终于找到了,原来用IBM.Data.DB2.iSeries来进行AS400 CALL PRAGROM(RPG,RPGLE,COBOL)是如此之简单,虽然不像CWBX.DLL那样那么专业的设置各种参数,但是对于快捷开发以及代码简洁度上,还是前者更胜一筹吧。

下面的代码主要来自于红皮书。先上一个封装起来的方法

static bool CallPgm(String cmdtext, iDB2Connection cn)
{
  bool rc = true;
  // 构造QCMDEXEC可用的命令文本.
  // 由于 QCMDEXC 使用单引号,我们必须将命令文本中的单引号
  // 替换成”双单引号”
  String pgmParm = "CALL QSYS.QCMDEXC('"
    + cmdtext.Replace("'", "''")
    + "', "
    + cmdtext.Length.ToString("0000000000.00000")
    + ")";
  // 创建COMMAND对象(.NET的COMMAND).
  iDB2Command cmd = new iDB2Command(pgmParm, cn);
  try
  {cmd.ExecuteNonQuery();}
  catch (Exception)
  {rc = false;}
  cmd.Dispose();
  return rc;
}

接着是实例测试(如何使用):

// 建立服务器连接.
iDB2Connection cn = new iDB2Connection("Provider=IBMDA400.DataSource.1;Data Source=SERVER_IP;User ID=USERID;Password=USERPWD;Default Collection=LIBNAME;");
cn.Open();
// 调用 MYCLPGM 程序(测试,调用三次,不成功则不再调用).
String cmdtext = “call sampledb/myclpgm parm(‘不含引号的命令文本')";
bool rc = CallPgm(cmdtext, cn);
if (rc == true)
{
    cmdtext = “call sampledb/myclpgm parm(‘含单引号的文本('')')";
    rc = CallPgm(cmdtext, cn);
}
if (rc == true)
{
    cmdtext = “call sampledb/myclpgm parm(‘含双引号的文本(\")')";
    rc = CallPgm(cmdtext, cn);
}
if (rc == true)
    Console.WriteLine("The calls completed successfully.");
else
    Console.WriteLine("One of the calls failed.");
cn.Close(); //关闭连接

 PS:为了一个可能性的存在,就是可能会有同学会在LINUX,UNIX以及其它WINDOWS下等非.net环境下连接AS400进行操作,那请到IBM的网站搜索”IBM.Data.DB2“这个关键词,这是为你们而准备的,不用客气 :)

历史上的今天: [2011/12/08]「店」、「屋」、「みせ」的区别
[2005/12/08]山穷水尽,弹尽粮缺了~

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

trACY 于 2008-12-18 17:42:25 发表 | IP:119.109.20.*

园主 来杯热可可吧......

柠檬园主 于 2008-12-19 21:58:01 发表 | IP:119.109.17.*

来杯摩卡咖啡吧。

Gordon 于 2012-09-10 02:12:45 发表 | IP:116.228.229.*
东西是很好,但是PGM返回值不能获得,好处是可以搭配Microsoft Enterprise Library
柠檬园主 2012-09-10 04:20:35 回复:

AS400和前台一起用的好处在于,AS400的数据处理能力很强,那么,前台调用400的机能,直接去处理数据就是了。

至于处理的结果,可以再通过其它方式获得,这也可以解决没有返回值 的问题。

Post a Comment~