Wenn du mit ADO arbeitest, um so besser.
Du solltest dabei aber nicht mehr ODBC verwenden sondern den OLEDB-Provider IBMDA400. Hierzu solltest du auch am besten CA V5R1 einsetzen, auch wenn die AS/400 noch V4 verwendet.
Bei den Verbindungseigenschaften kannst du die Bibliotheksliste (Registerkarte Erweitert) einstellen, so dass du den Datenexplorer verwenden kannst.
Anm.: ODBC geht zwar auch, ist aber langsamer und unterliegt ein paar Einschränkungen.

Für den Update erstellst du ein Command-Objekt und gibst den SQL-Befehl

"UPDATE myfile set F1=?, F2=? .... where K1=? and K2=? ..."

direkt ein.
Die Argumente kannst du dann mittels
updcmd(0) = myarg1
:
updcmd(n) = myargn
übergeben und anschliessend per

(dim RecAffected as long )
updcmd.execute RecAffected, , adExecuteNoRecords

ausführen.
Da der Update kein Recordset zurückgibt, ist die Option "adExecuteNoRecords" wichtig, da sonst die Information "RecAffected" nicht korrekt zurückgegeben wird und ein Recordset-Objekt auch nicht benötigt wird (es ist ja leer und muss eh wieder zerstört werden).
"RecAffected" sollte auch ausgewertet werden, wenn der Inhalt nähmlich nicht 1 ist, stimmt ggf. der Schlüssel (Where-Klausel) nicht, der Satz ist vielleicht nicht mehr da oder von einer anderen Anwendung gesperrt.
Du kannst zur Überprüfung auch das Error-Ereignis verwenden.

Nun zum Einfügen. Der SQL-befehl lautet "Insert" und kann ähnlich wie der Update per Command-Objekt durchgeführt werden.

"Insert into myfile (F1, F2, F3, ...) values (?, ?, ?, ...)"

Die Verwendung per Execute-Methode ist identisch zum Update incl. "RecAffected", "adExecuteNoRecords" und Error-Ereignis.
Beim Insert kann natürlich ein Fehler passieren, z.B. doppelter Schlüssel oder ggf. kein Default-Wert bei nicht verwendetem Feld, usw.

Anmerkung zu Datumsfeldern:
Wenn du mit ODBC arbeitest, verlangt CA/400 ein CDate()-Format.
Wenn du mit OLEDB arbeitest, verlangt CA/400 einen String im ISO-Format (Timestamp: YYYY-MM-DD-HH.MM.SS.MMMMMM).
Mit der Format$-Anweisung kannst du dies problemlos erreichen.