[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    79

    call RPG mit Parametern aus VB.NET

    Hallo liebes Forum,
    was unter VBA wunderbar funktioniert wird der Horror in .NET.

    Dim AS400 As New ADODB.Connection
    Dim Programm As New ADODB.Command
    Dim Rcds As Long
    Dim Parm() As Object
    AS400.Open("Provider=IBMDA400;Data Source=AS400;")
    Programm.ActiveConnection = AS400
    Programm.CommandText = "{{CALL /QSYS.LIB/AM.LIB/FEBDEBUC.PGM(?)}}"
    Programm.Prepared = True
    Programm.Parameters.Append(Programm.CreateParamete r("Funktion", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInputOutput, 5))
    Parm(0) = "Write"
    Programm.Execute(Rcds, Parm, ADODB.CommandTypeEnum.adCmdText)
    AS400.Close()

    Beim Append gibt es diesen Laufzeitfehler:
    Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Klassentyp "ADODB.InternalParameter" umgewandelt werden. Instanzen von Typen, die COM-Komponenten repräsentieren, können nicht in andere Typen umgewandelt werden, die keine COM-Komponenten repräsentieren. Eine Umwandlung in Schnittstellen ist jedoch möglich, sofern die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID der Schnittstelle unterstützt.

    Bitte Hilfe...

    PS: Wird damit auch ein geänderter Parameterwert zurückgegeben?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Du solltest hierfür auch nicht mehr ADODB als COM verwenden sondern ADO.NET!
    Da gibt es auch native OLEDB-Treiber, sodass du den IBMDA400 weiter verwenden kannst.

    Zu .NET kannst du ggf. noch per Typecast das Ergebnis anpassen:

    .append(directcast(...CreateParameter(..), Object)

    Ich weiß aber nicht, ob das funktioniert.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Sep 2005
    Beiträge
    79
    Besten Dank für die rasche Antwort.
    Aber als .NET-Neuling benötige ich Details.
    Unter Verweise-COM hab ich verlinkt:
    Microsoft ActiveX Data Objects 2.8 Library
    Unter .NET kann nichts vergleichbares finden?!

    Sollte der Programmcode ansonsten korrekt sein?

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    ADO.NET ist kein COM-Objekt, die Verweise können z.T. in den Projekteigenschaften oder als Import verwendet werden.

    Im Wesentlichen könnte das so aussehen:



    Imports System.Data
    Imports System.Data.OleDb

    Module Module1
    Sub Main()
    Dim xConnection = New OleDbConnection("Provider=IBMDA400;Data Source=VWWE400;")
    Dim xCommand = xConnection.CreateCommand()
    xCommand.CommandText = "{{CALL /QSYS.LIB/AM.LIB/FEBDEBUC.PGM(?)}}"
    xCommand.Parameters.Add("Funktion", OleDbType.Char, 5).Direction = ParameterDirection.InputOutput
    Try
    xConnection.Open()
    xCommand.Parameters(0).Value = "Write"
    xCommand.ExecuteNonQuery()
    xConnection.Close()
    Catch ex As Exception
    Trace.WriteLine("Fehler in der Ausführung: " & ex.Message)
    Finally
    If xConnection.State = ConnectionState.Open Then
    xConnection.Close()
    End If
    xCommand.Dispose()
    xConnection.Dispose()
    End Try
    End Sub
    End Module
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Sep 2005
    Beiträge
    79
    Danke Hr. Fuerchau,
    mit dieser Hilfe lässt sich experimentieren.
    Und doch gibt es ein neues Problem.
    Bei Ausführung wurde ich nach der Anmeldung gefragt. Ich wählte den Windows-Benutzernamen.
    Dann die Fehlermeldung CWBC01004 Auflösung der fernen Adresse nicht möglich!
    Eine Ausnahme (erste Chance) des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.
    Fehler in der Ausführung: CWBCO1004 - Auflösung der fernen Adresse nicht möglich.

    Es funktioniert der Ping, auch über die Namensauflösung. Es funktioniert der OPSNAV.

    Bitte nochmal ...

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Nun ja, wie du in meinem Code siehst, habe ich den Datasource-Namen geändert (auf mein verfügbares System), hier solltest du natürlich DEINE Datasource analog zu ADODB angeben .
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Sep 2005
    Beiträge
    79
    Manchmal muss man das ganze einfach mal liegen lassen. Am nächsten Morgen kam ich dann auch drauf. War an sich wirklich offensichtlich!
    Trotzdem nochmals viiiielen Dank - es funktioniert.

    Da hab ich noch eine Frage:
    Wie händelt ihr Updates auf der DB2?
    Ich denk da auch an Satzsperren. Im RPG hab ich ein Modul, das aufzeigt wer sperrt mit der Möglichkeit eine Break-Msg zu senden.

    Lest ihr direkt über SQL oder ist es besser über ein RPG-Programm? Wie sieht es mit der Wartung dann aus? (neue oder geänderte Satzfelder?)
    Übergabe als Datenstruktur? Geht das hier? Oder als Array vom Typ Variant?

    Ein solcher übersichtlicher Beispielcode ist einfach perfekt.

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Remote arbeitet man mit SQL, ins besonders bei .NET (auch Java).
    Hier empfehle ich mal Literatur "Visual Basic 2010 von Klaus Löffelmann, 49,00 Euro", da wird auch u.a. auf ADO.NET (gibts aber auch als eigenes Buch) eingegangen.

    Satzsperren ist immer ein Problem, deshalb löst man das in .NET ganz anders.
    Da man mit SQL arbeitet und ggf. ja nicht die selben Felder geändert werden, wird das Problem damit kleiner.
    Allerdings ist die Gefahr dann groß, wenn man eben mit RPG-Programmen mischt.
    Da RPG ja immer den gesamten Satz liest und alle Felder dann updatet funktioniert das halt nicht immer wie gewünscht, da vorherige Updates dann zerstört werden.
    Zumal die "logischen" Satzsperren dann hier ein Problem darstellen.
    Diese Verfahren sind bei ODBC-Zugriffen sehr aufwändig da sie erheblich mehr Zugriffe erfordern und im Absturzverhalten mehr Recovery erfordern.

    Im Handbuch ist beschrieben, wie man mit DataTable's und DataAdapater's arbeitet, die zumindest das Problem des konkurierenden Updates verhindern, eine Lösung muss dann allerdings immer noch überlegt werden.
    Zusätzlich wäre bei SQL dann Journalisierung auf jeden Fall der bessere Weg um im Falle des konkurierenden Updates z.B. einen Rollback durchzuführen.

    Neue Felder sind bei SQL gar kein Problem da sie bei alten Programmen ignoriert werden (ausser bei Select *, was aber kein Problem ist).
    Feldänderungen sind dann Zulässig, wenn die Art nicht geändert sondern nur die Ausprägung (Anzahl Stellen) geändert wird, da .NET (wenn keine expliziten Einschränkungen wie Eingabelänhge, programmiert sind) mit beliebigen Felder umgehen kann.

    Ich kann das oben genannte Buch nur empfehlen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Call Externes Programm zerstört Feldinhalt in RPG
    By Michael Rude in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 09-11-11, 14:10
  2. ADO: Call mit Parametern
    By padawan in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 28-06-10, 16:38
  3. Keine Probleme mit Parametern
    By harkne in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 01-06-06, 12:42
  4. Länge von Parametern bei CALL
    By cbe in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-08-05, 15:12
  5. Frage zu RPG: Aufruf RPG-Programm mit Parametern
    By hs in forum IBM i Hauptforum
    Antworten: 14
    Letzter Beitrag: 09-10-01, 12:06

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •