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 {
       static public double MyMethod(double x) {...}
}

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 {
       static public void MyMethod(Nullable<double> x) {...}
}

oder

public class MyClass {
       static public void MyMethod(double? x) {...}
}

oder in Visual Basic:

Public Class MyClass
       Public Shared Sub MyMethod(X As Nullable(Of Double))
               ...
       End Sub
End Class

Weitere Informationen zu Nullable-Wrapper sind in der MSDN zu finden, als Suchbegriff kann Nullable class verwendet werden.

TurboSQL Typ

Non-Nullable CLR Typ

Nullable CLR Typ

BYTE

System.Int64

Nullable<System.Int64>

SMALLINT

System.Int64

Nullable<System.Int64>

INTEGER

System.Int64

Nullable<System.Int64>

BIGINT

System.Int64

Nullable<System.Int64>

FLOAT

System.Double

Nullable<System.Double>

AUTOINC

System.Int64

Nullable<System.Int64>

BOOLEAN

System.Int64
(0 corresponds to false, all other values to true)

Nullable<System.Int64>

ENUM

System.Int64

Nullable<System.Int64>

GUID

System.Guid

Nullable<System.Guid>

LINK

System.Int64

Nullable<System.Int64>

RELATION

System.Int64[]

System.Int64[]

CHAR(X), VARCHAR(X)

System.String

System.String

WCHAR(X), VARWCHAR(X)

System.String

System.String

LONGVARCHAR

System.String

System.String

LONGVARWCHAR

System.String

System.String

LONGVARBINARY

System.Byte[]

System.Byte[]

TIME

System.DateTime

Nullable<System.DateTime>

DATE

System.DateTime

Nullable<System.DateTime>

TIMESTAMP

System.DateTime

Nullable<System.DateTime>