Zum Inhalt springen

CL Call auf DB/2 via C#


Fraggla

Empfohlene Beiträge

Hey ho,

versuch gerade ein wenig mit C# und der AS/400, i5, iSeries (was auch immer) zu kommunizieren.

Ich möchte ein Programm schreiben, welches unter Windows ein Call auf die i5 absetzt und anschließend die Daten weiter verarbeitet.

Die Verarbeitung an sich ist nicht das Problem, Daten der i5 werden im CSV Format an ein Transferlaufwerk, welches unter Windows erreichbar ist exportiert und verarbeitet.

Das Problem ist vielmehr der Call.

Nach diversen Internetrecherchen bin ich auf die cwbx (Active X) Schnittstelle der i5 gestoßen.

Nach diesem Tutorial (Calling AS/400 (AS400) RPG Programs From ASP.NET)

habe ich dann auch meine Klasse gebaut.

Normale Calls ohne Parameter funktionieren dabei einigermaßen Sorgenfrei.

Da ich das ganze allerdings zum ersten Mal überhaupt sehe, tu ich mir mit der Parameterkonstruktion ein wenig schwer. Versteh nicht so wirklich, was da in dem Artikel mit enum, Byte usw. gemeint ist. Hab jetzt diverse Möglichkeiten ausprobiert und scheitere leider immernoch. Das Debuggen bringt mich hier leider nicht weiter, da der Fehler auf der i5 sitzt und die Nachrichten dort keine Erkenntniss bringen.

Ich bau anscheinend die Parameter falsch auf, und weiß leider nicht, wie ich das ganze ausbessern kann.

Übergeben werden soll: 3 Parameter, erster 3 Stellen lang, die beiden anderen 2 Stellen lang (varchar/string)

String Parm1 = "001";

            String Parm2 = "25";

            String Parm3 = "26";


            parameters.Append(Parm1, cwbrcParameterTypeEnum.cwbrcInput, 3);

            parameters[Parm1].Value = stringConverter.ToBytes(Parm1.PadRight(3, ' '));

            parameters.Append(Parm2, cwbrcParameterTypeEnum.cwbrcInput, 2);

            parameters[Parm2].Value = stringConverter.ToBytes(Parm2.PadRight(2, ' '));

            parameters.Append(Parm3, cwbrcParameterTypeEnum.cwbrcInput, 2);

            parameters[Parm3].Value = stringConverter.ToBytes(Parm3.PadRight(2, ' '));


            Test.Invoke(true ,parameters );

Falls jemandem was auffällt und mir das erklären könnte, wäre extremst nett!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mich würde interessieren was denn

a) in dem Enum steht

B) was das append macht

Hängt es quasi nur die Sachen aneinander? Wenn ja dann sollte da ja sowas rauskommen wie.

parameter.[001[EnumString]3].value = Das Ergebnis aus (stringConverter.ToBytes(Parm1.PadRight(3, ' '))

Du hast dann quasi nur eine Parametermap mit key-value paar.

Man müsste jetzt wissen, was genau die i5 denn für eine Parameter-Map verlangt

Link zu diesem Kommentar
Auf anderen Seiten teilen

a) in dem Enum steht nichts, weil ich den Enum nicht übernommen habe, weil ich nur 2 verschiedene längen habe, die ich auch so angeben kann.

Bei "ihm" dem Tutorial Ersteller steht:

protected enum DataLengths : int

{

    PartId     = 12,

    PartPrice  = 15,

}

B)

hab ich im Debugger noch nicht 100% raussehen können, was da dann drinn steht, versuch ich noch raus zu bekommen.

falls da nur "001250260" steht wärs klar. wie der aber die strings auseinander zieht wäre interessant zu wissen.

Ich habs auch anders probiert und den call direkt übergeben, das mag er aber noch weniger.

Call wäre "Call usrber/cstest PARM("001" "25" "26") Mit dem Befehl gehts z.B wenn ich direkt mich selbst auf der i5 anmelde :/

Link zu diesem Kommentar
Auf anderen Seiten teilen

So in der Dokumentation doch noch Beispielcode gefunden:


' Variablen deklarieren

Dim parms As New cwbx.ProgramParameters

Dim strCvtr As New cwbx.StringConverter

Dim longCvtr As New cwbx.LongConverter


' Eingabeparameter anhängen (Parameterlänge ist auf die Länge des

' Eingabeparameterwerts festgelegt).

parms.Append "first name", cwbrcInput

parms("first name") = strCvtr.ToBytes("Maggie")


' Ein-/Ausgabeparameter anhängen. Der Eingabewert ist nur 6 Zeichen lang,

' es soll jedoch ein Puffer für 50 Zeichen zum Empfangen des

' Ausgabewerts zugeordnet werden. Daher wird die Länge bei der Methode Append

' ausdrücklich festgelegt.

parms.Append "last name", cwbrcInout, 50

parms("last name") = strCvtr.ToBytes("Baxter")


' Ausgabeparameter anhängen. Die Länge muss festgelegt werden, damit ein Puffer für

' den Ausgabewert zugeordnet werden kann.

parms.Append "age", cwbrcOutput, 4


' Wert des ersten Parameters anzeigen und hierbei seinen Namen

' als Index verwenden.

MsgBox "Erster Parameter = " & _

        strCvtr.FromBytes(parms.Item("first name").Value)


' Wert des zweiten Parameters anzeigen und hierbei seine Position

' in der Objektgruppe als Index verwenden.

MsgBox "Zweiter Parameter = " & _

        strCvtr.FromBytes(parms.Item(2).Value)


' Inhalt der Objektgruppe löschen, um diese beim Aufruf eines

' anderen Programms erneut zu verwenden.

parms.Clear


' Anderen Parameter an die Objektgruppe anhängen.

parms.Append ("different parameter"), cwbrcInput

parms("different parameter") = longCvtr.ToBytes(5)


' Neuen Parameter anzeigen

MsgBox "Anderer Parameter = " & _

        longCvtr.FromBytes(parms.Item("different parameter").Value)

Quelle: IBM iSeries Access für Windows ®IBM 1980-2004

Link zu diesem Kommentar
Auf anderen Seiten teilen

o.g teil in


 //&FIR &SAIS1 &SAIS2

            String Parm1 = "001";

            String Parm2 = "25";

            String Parm3 = "26";


            parameters.Append("&FIR", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 3);

            stringConverter.Length = 3;

            parameters["&FIR"].Value = stringConverter.ToBytes(Parm1.PadRight(3, ' '));


            parameters.Append("&SAIS1", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS1"].Value = stringConverter.ToBytes(Parm2.PadRight(2, ' '));


            parameters.Append("&SAIS2", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS2"].Value = stringConverter.ToBytes(Parm3.PadRight(2, ' '));

geändert

Link zu diesem Kommentar
Auf anderen Seiten teilen

//&FIR &SAIS1 &SAIS2

            String Parm1 = "001";

            String Parm2 = "25";

            String Parm3 = "26";


            parameters.Append("&FIR", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 3);

            stringConverter.Length = 3;

            parameters["&FIR"].Value = stringConverter.ToBytes(Parm1);


            parameters.Append("&SAIS1", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS1"].Value = stringConverter.ToBytes(Parm2);


            parameters.Append("&SAIS2", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS2"].Value = stringConverter.ToBytes(Parm3);

Ich hät ja jetzt eher so gesagt xD

Link zu diesem Kommentar
Auf anderen Seiten teilen

So habs gelöst, vielen Dank an alle für die Hilfe.

Auflösung:

Aufruf in C#


  //&FIR &SAIS1 &SAIS2

            String Parm1 = "001";

            String Parm2 = "25";

            String Parm3 = "26";


            parameters.Append("&FIR", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 3);

            stringConverter.Length = 3;

            parameters["&FIR"].Value = stringConverter.ToBytes(Parm1);


            parameters.Append("&SAIS1", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS1"].Value = stringConverter.ToBytes(Parm2);


            parameters.Append("&SAIS2", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS2"].Value = stringConverter.ToBytes(Parm3);




            Test.Invoke(true ,parameters );

Dann alles soweit wie normal in nem CL auf der i5 + Variablen Bearbeitung der ersten Variable vor der SQL Übergabe:

 CHGVAR     VAR(&FIRN) VALUE('''' *TCAT &FIR + 

              *TCAT '''')                      

Ganz ehrlich: Keine Ahnung warum, und warum so.

Und vor den Aufrufen noch im CL die Bibliotheksliste entsprechend angepasst, nun funktionierts :D

Danke, danke, danke, danke!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...