Calling a program on an iSeries with .net
Here's an easy way to call a program on the AS/400 with .net. What's neat about this function is that it also accepts a return argument.
Requirements:
- Client Access
This method uses the Client Access library so you will need to have Client Access installed on your PC. Specifically you need cwbx.dll which is in the Iseries access folder C:\Program Files\IBM\Client Access\Shared
Add this into your Visual Studio project as a reference - The host server on the iSeries must be started using STRHOSTSVR SERVER(*ALL)
Copy the code below into Visual Studio
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using cwbx; // cwbx.dll is in the Iseries access folder C:\Program Files\IBM\Client Access\Shared
// YOu must add it in to you project; Click on your references folder in solution explorer to add it in.
namespace CallAS400pgm
{
class Program
{
static void Main(string[] args)
{
// Modify the following for your own iSeries
string AS400Name = "192.168.0.1"; // Change this to the IP address of your machine
string AS400User = "USER"; // User name to sign on to AS/400
string AS400Password = "password"; // Password used to sign on to the AS/400
string AS400Pgm = "DOTNET1"; //Name of program you wish to call on the AS/400
string AS400Lib = "QGPL"; // Name of library where the program is located
Console.WriteLine("Creating AS/400 object....");
cwbx.AS400System AS400 = new cwbx.AS400SystemClass(); // creates an as/400 object
cwbx.Program program = new cwbx.Program(); // Create a program object
AS400.Define(AS400Name); // IP of AS/400
program.system = AS400;
program.system.UserID = AS400User; // Your user name
program.system.Password = AS400Password; // Your password
// define the name of the program you want to call on the iSeries
program.LibraryName = AS400Lib; //Library where your program is located
program.ProgramName = AS400Pgm; // Program that this app will call
// NOTE: before you sign on, the host server on the iSeries must be started using STRHOSTSVR SERVER(*ALL)
Console.WriteLine("Signing on to " + AS400Name);
AS400.Signon();
AS400.Connect(cwbcoServiceEnum.cwbcoServiceRemoteCmd);
if (AS400.IsConnected(cwbcoServiceEnum.cwbcoServiceAll) == 0)
{
Console.WriteLine("Not connected");
}
else
{
ProgramParameters parms = new ProgramParameters(); // must create parameter collection
// parms.Clear(); // if you have no parm use this statement
// Define the parms you are sending and receiving from the iSeries pgm
parms.Append("MsgToAS400", cwbrcParameterTypeEnum.cwbrcInput, 30); // // Input parm called 'MsgToAS400;
parms.Append("ReplyFromAS400", cwbrcParameterTypeEnum.cwbrcOutput, 30); // create a parameter object name, type & length
// puts a value into the parameter object
StringConverter strcon = new StringConverterClass();
strcon.Length = 30;
parms["MsgToAS400"].Value = strcon.ToBytes(" This is from a dot net pgm, hi");
try
{
Console.WriteLine("Sending a message to the iSeries....");
Console.WriteLine("Calling program on the AS400....");
program.Call(parms); // Runs until job is completed
// Get the return value from the ISeries pgm
String reply = strcon.FromBytes(parms["ReplyFromAS400"].Value);
Console.WriteLine(reply);
//This program dotnet1 is called on the iSeries. dotnet1 has 2 parameters
// it takes the first and displays it to a user
// it then sends back a message to this class in ReplyFromAS400
Console.ReadLine();
}
catch (Exception e)
{
foreach (Error error in AS400.Errors)
{
Console.WriteLine(error.ToString());
}
throw;
}
}
}
}
}
Labels: ado.net, as/400, as400 .net, c sharp, C#, db2, ibm, iseres, visual studio
7 Comments:
hi,
we are using this dll and found that if you call an iSeries program more than once within the same job. It fails with errors such as 'library qgpl already in library list'
The .net developer says he is disconnecting after each call and reconnecting. Any ideas?
I have two articles I have written on calling AS/400 RPG programs from .NET. Here are the links:
http://www.netsplore.com/PublicPortal/Default.aspx?tabid=246
http://www.netsplore.com/PublicPortal/Blog/tabid/284/EntryID/13/Default.aspx
Somehow, that last link got corrupted. I have tried it again (with preview this time), but there is a bug or something preventing the URL from wrapping, so I have broken the URL across multiple lines. You will have to piece it back together.
Here it is again:
http://www.netsplore.com/PublicPortal/Blog/tabid/284
/EntryID/13/Default.aspx
Thanks Joe for the link! I will have a look at it.
I'm not receiving any data back from the RPG program? Anybody have any ideas?
Hello,
My program call rpg function but i wont intercept error when the call of program go to in MSGW.
If possible see the error if the program go in MSGW or set the timout?
thanks
Hi All,
I'm wondering how to use this .dll with a Library List and not a single library, so that once the call is done a hunt will be performed for the correct object to be run?
Thanks in advance, AB.
Post a Comment
Subscribe to Post Comments [Atom]
<< Home