TurboSQL Guide Parameter mit .NET Assemblies austauschen |
Top Previous Next |
Dieses Feature ist nur in TurboDB Managed verfügbar. Assemblies, die externe Funktionen, Prozeduren oder Aggregate zur Verfügung stellen, müssen im Verzeichnis der Datenbankdatei untergebracht sein. Beim Aufruf von Methoden aus .NET Assemblies werden die Paramter von TurboSQL nach CLR gemappt, gemäß der nachfolgenden Tabelle. Wie zu sehen ist, besteht ein Unterschied zwischen Funktionen auf der einen und Prozeduren und Aggregaten auf der anderen Seite. Funktionen haben nur Input-Parameter und es wird NULL zurückgegeben, falls eines der Argumente NULL ist. In diesem Fall wird die CLR Methode überhaupt nicht ausgeführt. Aus diesem Grund wird NULL nie an eine benutzerdefinierte CLR Funktion übergeben und die CLR Methode darf nur mit CLR-Typen deklariert werden, die keine NULL-Werte kennen (non-nullable). Zum Beispiel: CREATE FUNCTION Log2(:x DOUBLE NOT NULL) RETURNS DOUBLE NOT NULL AS EXTERNAL NAME [MyNamespace.MyClass].MyMethod,MyAssembly korrespondiert mit dieser Definition in C#: public class MyClass { Weil das Argument nicht zwischen 0 und NULL unterscheidet, kann Log2 nie mit NULL-Werten verwendet werden. Sieht die Deklaration dagegen so aus CREATE FUNCTION Log2(:x DOUBLE) RETURNS DOUBLE AS EXTERNAL NAME [MyNamespace.MyClass].MyMethod,MyAssembly ist obige Definition gültig in C# . Wird Log2 mit einem NULL-Argument aufgerufen, liefert die Engine NULL ohne die CLR Methode aufzurufen. Diese Regel gilt nur für Funktionen; CLR Prozeduren und Aggregate werden immer aufgerufen, auch für Argumente die NULL sind. Daher müssen die Parameter und der Rückgabetyp der CLR Definition in der Lage sein, NULL-Werte zu transportieren. TurboSQL tut das indem null (Nothing in Visual Basic) übergeben wird, was für CHAR- und LONGVARBINARY-Datentypen offensichtlich ist. Um auch mit anderen Datentypen wie Int64 oder DateTime in dieser Weise verfahren zu können, muss der Nullable-Wrapper verwendet werden. CREATE PROCEDURE TestProc(:x DOUBLE) AS EXTERNAL NAME [MyNamespace.MyClass].MyMethod,MyAssembly wird daher abgebildet durch public class MyClass { oder public class MyClass { oder in Visual Basic: Public Class MyClass Weitere Informationen zu Nullable-Wrapper sind in der MSDN zu finden, als Suchbegriff kann Nullable class verwendet werden.
|