IduIT.GeoLib.MsSql

Diese DLL ist ein CLR Wrapper für die Erstellung von MicrsoftSqlServer UDFs für den Umgang mit Geometriefunktionen, die nicht im Umfang der Spatial Funktionen des SQL Server sind (vor allem ST_Transform).

Der Zugriff und die Rückgabe der Geometrien erfolgt im SQL Server nativem binär Format. D.H. Übergabe der Geometrie muss immer in der Form

  cast (geometry::STGeomFromText('POINT(12 52)',4326) as varbinary(max)

erfolgen. Der entsprechende Rückweg dann via

 cast (resultFromFunction as geometry)

Installation

Die Methode kann ab SQLServer 2014 verwendet werden (nur 64-Bit Version). Ggf. müssen die aktuellen VCRedist auf dem Server installiert sein (derzeit Version 2022). Als .Net Framework wird Version 4.5.2 verwendet.

Erforderliche Dateien

Das .Net Assembly ist lediglich ein Wrapper um die eigentlichen Methoden, die in der IduIT.GeoLib.Net.dll vorhanden sind.

D.H. für die Installation ist IduIT.GeoLib.MsSql.dll und auch IduIT.GeoLib.Net.dll erforderlich.

Bei der Installation muss dabei sichergestellt werden, dass die IduIT.GeoLib.Net.dll im Suchpfad (64Bit) enthalten ist.

Transformation mit NAD Grid

Ebenso sollte das NTv-Grid für die Transformation vorhanden sein (siehe auch Methode IDUIT_RunProjectionTestReturnErrorIfFailed()).

Die NTv Datei (in cardo ist eine Datei "xeta.gsb" vorhanden, diese kann verwendet werden) wird per Default im gleichen Ordner wo die IduIT.GeoLib.Net.dll gespeichert ist gesucht. Alternativ wird die Umgebungsvariable IDU_UTM_NAD_GRID_FOLDER ausgewertet.

Damit Änderungen der NTv Grid Datei wirksam werden (z.B. erstmalige Bereitstellung der Datei) ist der Neustart des SQL Servers erforderlich.

	
	--- DB-Init ---


    -- Auf dem Server / der Datenbank die Ausführung von .Net Assembly zulassen
    /*
    sp_configure 'clr enabled', 1
    GO

    RECONFIGURE
    GO

    */
	    --- CleanUp ---
    /*

    drop function IDUIT_ST_AsEWKT
    go

    drop function IDUIT_ST_Transform
    go


    drop function IDUIT_GetCurrentNADGrid
    go

    drop function IDUIT_Version
    go

    drop function IDUIT_RunProjectionTestReturnErrorIfFailed
    go

    DROP ASSEMBLY IduITAsm 
    go

    */

	    --- Installation (Pfad anpassen!) ---

    CREATE ASSEMBLY IduITAsm FROM 'd:\IduIT.GeoLib.MsSql.dll' 
     WITH PERMISSION_SET = UNSAFE
    go

    /*
     EWKT Darstellung der Geometrie
    */
    CREATE FUNCTION IDUIT_ST_AsEWKT(@geomBytes varbinary(max))
	    RETURNS
		    nvarchar(max) WITH EXECUTE AS CALLER
	    AS
		    EXTERNAL NAME IduITAsm.[IduIT.GeoLib.MsSql.DLLWrapper].ST_AsEWKT
    GO
    /*
     Transformiert die Geometrie und gibt das Transformationsergebnis zurück.
     fromEpsg: wenn 0, dann die in der Geometrie gespeicherte.
    */
    CREATE FUNCTION IDUIT_ST_Transform(@geomBytes varbinary(max),@fromEpsg int,@toEpsg int)
	    RETURNS
		    varbinary(max) WITH EXECUTE AS CALLER
	    AS
		    EXTERNAL NAME IduITAsm.[IduIT.GeoLib.MsSql.DLLWrapper].ST_Transform
    GO
    /*
     Dateiname des verwendeten NAD Grid, oder NULL
    */
    CREATE FUNCTION IDUIT_GetCurrentNADGrid()
	    RETURNS
		    nvarchar(max) WITH EXECUTE AS CALLER
	    AS
		    EXTERNAL NAME IduITAsm.[IduIT.GeoLib.MsSql.DLLWrapper].GetCurrentNADGrid
    GO
    /*
     Version als String (z.B. 7.0.7.1)
    */
    CREATE FUNCTION IDUIT_Version()
	    RETURNS
		    nvarchar(max) WITH EXECUTE AS CALLER
	    AS
		    EXTERNAL NAME IduITAsm.[IduIT.GeoLib.MsSql.DLLWrapper].Version
    GO

    /*
     Projektion mit einer Referenz-Koordinate.
     NULL im Erfolgsfall, sonst der Fehlertext
    */
    CREATE FUNCTION IDUIT_RunProjectionTestReturnErrorIfFailed()
	    RETURNS
		    nvarchar(max) WITH EXECUTE AS CALLER
	    AS
		    EXTERNAL NAME IduITAsm.[IduIT.GeoLib.MsSql.DLLWrapper].RunProjectionTestReturnErrorIfFailed
    GO


	    --- Test ---

    /*
    select dbo.IDUIT_Version()
    go

    select dbo.IDUIT_RunProjectionTestReturnErrorIfFailed();
    go

    select dbo.IDUIT_ST_AsEWKT(cast (geometry::STGeomFromText('POINT(12 52)',4326) as varbinary(max)))
    go

    select cast(dbo.IDUIT_ST_Transform(cast (geometry::STGeomFromText('POINT(12 52)',4326) as varbinary(max)),4326,31468) as geometry).STAsText()
    go

    */

Fehlerbezogene Lösungen:

Meldung: "System.DllNotFoundException: Die DLL "IduIT.GeoLib.Net.dll": Das angegebene Modul wurde nicht gefunden"

  • Lösung: Die IduIT.GeoLib.Net.dll ist nicht im Suchpfad (PATH) zu finden, passen sie die Umgebungsvariable PATH an, oder kopieren Sie die Datei in einen entsprechenden Pfad (z.B. C:\Program Files\Microsoft SQL Server\130\Tools\Binn)

  • Lösung: Besteht das Problem immer noch (oder in ähnlicher Form), stellen Sie sicher das die aktuelle Redistributable Visual Studio 2015, 2017, 2019, and 2022 (Version x64) installiert ist

  • Lösung: Wenn das Assembly per DB Restore wieder hergestellt wurde, dann kann es sein das diese aktualisiert werden muss. Verwende in diesem Fall (Pfade ggf. anpassen):

    ALTER ASSEMBLY IduITAsm FROM 'D:\MsSQLASM\IduIT.GeoLib.MsSql.dll' 
     WITH PERMISSION_SET = UNSAFE
    go
    

Meldung: "CREATE ASSEMBLY for assembly 'IduIT.GeoLib.MsSql' failed because assembly 'IduIT.GeoLib.MsSql' is not authorized for PERMISSION_SET = UNSAFE. The..."

  • Lösung: TRUSTWORTHY für die entsprechende Datenbank aktivieren:

    ALTER DATABASE {dbname} SET TRUSTWORTHY ON
    

Zuletzt geändert: 22.11.2024 16:09:48 (erstmals erstellt 01.02.2018) // Alias: "IduITGeoLibMsSql"