-
- .NET调用AS/400上的程序(.NET CALL AS/400 PGM) 补遗
- Weather:晴,2-7度
- 2008-12-08
上篇写到用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“这个关键词,这是为你们而准备的,不用客气 :)
-
Views(10594) | Comments(3) |
In:
AS400について
|
(11/23)
N3C开发记事本
[.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的机能,直接去处理数据就是了。
至于处理的结果,可以再通过其它方式获得,这也可以解决没有返回值 的问题。
