TIPP Access-Problem Metadaten und CAST

Useful code snippets and help for problems with Velocity-/Java-Script Code

TIPP Access-Problem Metadaten und CAST

Postby KaiBaechle » 19 Sep 2013, 14:10

Access ist sehr aktiv beim impliziten Casten von Datentypen in Ausdrücken und auch die Metadaten von Literalen sind nicht immer leicht vorhersehbar.


Code: Select all
SELECT 1 AS ID, 1.0 AS Val1, 2.1 AS Val2, 3.14 AS Val3, 1/3 AS Val4, NULL AS Val5
FROM   MSysAccessStorage WHERE Id = 1


Führen zu den Metadaten


Code: Select all

Name | Datentyp (SQL) | Datentyp (Datenbank)
-----+----------------+---------------------
1 ==> ID | 4 | INTEGER
1.0 ==> Val1 | 4 | INTEGER
2.1 ==> Val2 | 2 | DECIMAL (28, 1)
3.14 ==> Val3 | 2 | DECIMAL (28, 2)
1/3 ==> Val4 | 8 | DOUBLE
NULL ==> Val5 | -2 | BINARY


Innerhalb von Access ist diese Vielfalt meist kein Problem. Funktionsaufrufe mit Val1 bis Val5 als Argument sind möglich, weil Access notwendige Casts implizit durchführt.

Die interne SQL Engine (Derby/H2) von RapidRep kann Daten der RDMBS (Access) nur mit Hilfe der bereitgestellten Metadaten interpretieren.

Operationen können in Abhängigkeit vom Datentypen dabei zu Fehlern führen. Derby beispielsweise läßt kein MOD auf nicht-INTEGER Daten zu und mit dem NULL-Literal (-2 BINARY) kann wohl kein RDBMS was anfangen.

Zur Abhilfe kann auf die Convertierungsfunktionen von Access zurückgegriffen werden:


Code: Select all
CSTR($expr) ==> 12 - VARCHAR(255)
CBYTE($expr) ==> 5 - SMALLINT
CINT($expr) ==> 5 - SMALLINT
CLNG($expr) ==> 4 - INTEGER
CDBL($expr) ==> 8 - DOUBLE
CDATE($expr) ==> 93 - DATETIME
CVDATE($expr) ==> 93 - DATETIME


Bis auf CVDATE, läßt sich keine der Funktionen auf ein NULL-Literal anwenden hier hilft nur ein Workaround:


Code: Select all
IIF(FALSE, $datenTypeKonformerAusdruck, NULL)


Der Trick ist, dass bei der Verwendung von IIF der Ergebnisdatentyp immer vom Wahr-Ergebnisausdruck (2. Argument) bestimmt wird. Da jedoch false niemals wahr ist, wird immer das 3. Argument, also NULL, zurückgegeben.

Für $datenTypeKonformerAusdruck kann eine der genannten Konvertierungsfunktionen mit einem Dummy-Literal oder direkt ein Literal eingesetzt werden:


Code: Select all
#10/03/1990# => 93 - DATETIME
'' => 12 - VARCHAR(255)
false => 5 - SMALLINT
1 => 4 - INTEGER
1.1 => 8 - DOUBLE (Nicht DECIMAL (2,1) !)


Achtung: 1.0 wird von Access als Ganzzahl erkannt => 4- INTEGER
KaiBaechle
 
Posts: 33
Joined: 24 May 2013, 21:20

Return to Developers Corner



Who is online

Users browsing this forum: No registered users and 1 guest

cron