PDA

View Full Version : Fehler bei ADO Zugriff CWBZZ5014



Asti
16-06-05, 08:48
Hallo,

nach Umstellung eines Teils unserer PC Landschaft auf Win XP / ado 2.8, quittiert die AS400 SQL Inserts einer VB Anwendung mit Werten < 1 mit folgendem Fehler:

CWBZZ5014 Wert für Parameter xy konnte nicht in Host Datentyp umgesetzt werden.

(Insert erfolgt über Prepared Command, V5R3)

Bei IBM habe ich "vage" Hinweise gefunden, außerdem taucht die Fehlermeldung in einer PTF Beschreibung, ohne weitere Erklärungen, auf (PTF SI16496).


Hat jemand Erfahrungen mit diesem Fehler ? Lässt er sich mit dem PTF beseitigen ? Freue mich über Tipps und Infos.


Mit freundlichen Grüßen
Andreas Sturm

Fuerchau
16-06-05, 10:52
Dieses Problem gibts ggf. bei numerischen Inhalten, wenn die Nachkommastellen bei Übergabe als Double nicht passen. Ggf. als String mittels FORMAT(myvar, "0.00") bzw. entsprechender Anzahl NK oder mittels ROUND(myvar, 2) übergeben.

Asti
16-06-05, 14:07
Hallo,

Format bzw. Round nützt mir an der Stelle nix, da der Parameter im Command als double deklariert ist, d.h. es erfolgt bei Wertzuweisung immer eine autom. Typkonvertierung (mit dem daraus resultierenden Fehler). Bisher hat nur geholfen, den Parameter als char zu deklarieren, dann scheint die AS400 ihn selbst erfolgreich zu konvertieren was ja dem


Ggf. als String mittels FORMAT(myvar, "0.00") bzw. entsprechender Anzahl NK oder mittels ROUND(myvar, 2) übergeben.
entspricht, mich aber nicht glücklich macht. :( Außerdem stellt sich die Frage ab welcher CA Version das nicht mehr funktioniert.

Besten Dank

Fuerchau
16-06-05, 14:18
Round() nützt natürlich was, da damit die Nachkommastellen eben gekürzt werden können.
Ich hatte schon früher des öfteren Probleme (auch z.B. mit MSAccess und verknüpfter Tabelle), wenn der Dezimalwert zuviele Vor- oder Nachkomma enthält.

Bei Parametertyp CHAR (was für alle Parameter geht) wird eben vom Host in den passenden Typ konvertiert, aber auch hier darf die Stellenzahl nicht überschritten werden.
Übrigens: Auch wenn der Parameter vom Typ DOUBLE ist, kommt es dann doch tatsächlich auf das Ziel-DB-Feld an.

Asti
17-06-05, 08:44
Hallo,

da liegt wohl ein Missverständnis vor.

Ich verwende ein Prepared Command und einer der Parameter für dieses Command wird als double deklariert.

z.B.

Set adoCmdInsParm = adoCmdInsert.CreateParameter("PREIS", adDouble, adParamInput, 7)

Wenn ich diesem Parameter jetzt einen Wert zuweise

z.B.

adoCmdInsert.Parameters(6).Value = "0.055"

oder

adoCmdInsert.Parameters(6).Value = 0.055 (oder Round(0.055) etc.)

findet automatisch eine Typkonvertierung statt. Da kann ich (auf der rechten Seite) runden, formatieren, abschneiden etc., der Wert des Parameters wird immer vom Typ double sein. Das Problem ist ein Darstellungsfehler auf PC Seite (ein Kollege der unter C programmiert hat das Phänomen ebenfalls). Sobald der Datentyp double ist gelingt auf PC Seite keine "Punktlandgung" mehr, soll heißen (trotzt round, format etc.): 0.055 wird "dargestellt", bei Anzeige auch immer ausgegeben, aber tatsächlich steht im Speicher 0.054999999999999999998etcetc. und dann meckert die AS400, denn dieser Wert wird so übergeben. (Hat sie ja auch recht)

Den Parameter selber des Prepared Command kann ich aber auf PC Seite nicht verändern (durch round, format etc.). Der einzig funktionierende Ansatz bisher, den Parameter als char zu deklarieren.

Set adoCmdInsParm = adoCmdInsert.CreateParameter("EPREI", adChar, adParamInput, 7)

Was mich wundert, dass ich den Parameter nicht mit adDecimal, adNumeric oder adCurrency verwenden kann. Das Zielfeld ist decimal 7,4, verwende ich einen dieser Datentypen gibt es eine "falscher Typ" Fehlermeldung. Dabei hat adCurrency fix 4 Nachkommastellen und adDecimal sollte 100% passen.

Habe weitere Informationen zum PTF (PTF SI16496) gefunden. Scheinbar gibt es Probleme mit unterschiedlichen Sprachversionen und iSeries Access. Es ist auch ein Hinweis zu finden zu Problemen mit Werten < 0.1. Jetzt wüsste ich gerne ob jemand diesen Fehler mit dem PTF ausbügeln konnte.

Gruß Andreas

Fuerchau
20-06-05, 09:05
Dann würde ich dir eine weitere "Umgehung" vorschlagen:

insert .... values(?, ..., dec(?, 7, 4), ...)

also eine Zwangskonvertierung des Double in Decimal. Allerdings führt dies ggf. zu Rundungsverlusten, da das Casting nicht rundet sondern abschneidet.

Andererseits: was hindert dich denn den Parameter als adChar zu übergeben ?

Asti
21-06-05, 08:54
Hallo,

den Tipp werde ich gleich mal ausprobieren !!!



Andererseits: was hindert dich denn den Parameter als adChar zu übergeben ?o

Tja, auf den Rechnern mit W2K und der "alten" Client Access Version führt der Insert mit char zu einer Fehlermeldung.

Gruß Andreas

TARASIK
21-06-05, 09:05
Hallo,
also dieses Ptf ist für Iseriers Access und wurde bereits
ersetzt durch SI17742 für 5722XE1. Ich würde das
auf jeden Fall installieren auf der R530 Maschine.

Fuerchau
21-06-05, 10:10
Altes CA und neues OS gibt immer Probleme !
Umgedreht, neues CA und altes OS ist meist problemlos.
Ich würde auf jeden Fall mindestens die zum OS passende CA-Version und das letzte Update einsetzen.

Asti
23-06-05, 14:09
Dann würde ich dir eine weitere "Umgehung" vorschlagen:

insert .... values(?, ..., dec(?, 7, 4), ...)
Leider laufe ich dann auf die nächste Fehlermeldung:

SQL0418: Verwendung von Parametermarkierungen ungültig.

.... aber, Versuch macht kluch, das

cast(? as dec(7, 4))

funktioniert wunderbar !!!

Schönen Dank für den Tipp mit dem Typecasting auf AS400 Seite.

Gruß Andreas

P.S.

der Austausch von CA wäre unternehmensweit ohne Weiteres nicht möglich