Mehr

Einfügen eines PostGIS-Punkts mit Npgsql

Einfügen eines PostGIS-Punkts mit Npgsql


Ich versuche, Punkte mit C # in eine PostGIS / PostgreSQL-Datenbank einzufügen. Ich verwende den Npgsql-Treiber. Ich vermute, dass dies weniger ein Treiberproblem als vielmehr ein Syntaxproblem ist, da ich mit ST_GEOMETRY nicht vertraut bin.

Hier ist der Code:

NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;Benutzer-ID=XXX;Passwort=XXX;Datenbank=XXX;"); NpgsqlCommand command = new NpgsqlCommand("INSERT INTO points(name, point) VALUES(2, ST_GeomFromText('POINT(:longitude :latitude)', 4326));", conn); var Länge = command.CreateParameter(); longitude.Direction = ParameterDirection.Input; longitude.DbType = DbType.Double; Längengrad.ParameterName = "Längengrad"; Längengrad.Wert = fix.Längengrad; command.Parameters.Add (Längengrad); var Breite = Befehl.CreateParameter(); latitude.Direction = ParameterDirection.Input; Breite.DbType = DbType.Double; Breite.ParameterName = "Breite"; Breitengrad.Wert = fix.Breitengrad; command.Parameters.Add(Breitengrad); conn.Open(); var dr = command.ExecuteNonQuery(); Anschl.Schließen();

Wenn ich den Code ausführe, erhalte ich eine Npgsql.NpgsqlException mit einer FehlermeldungFEHLER: XX000: Analysefehler - ungültige Geometrie" Die Hint-Eigenschaft hat eine Nachricht"POINT(:l" <-- Parse-Fehler an Position 8 innerhalb der Geometrie.

Wie konstruiere ich eine richtige SQL-Anweisung zum Einfügen von ST_GEOMETRY mithilfe von Parametern?


ST_GeomFromText wird verwendet, um bekannten Text zu lesen, daher müssten Sie einen String formatieren, um ihn als Parameter zu übergeben. Dies ist jedoch eine der langsamsten Möglichkeiten, einen Punkt zu machen, und unterliegt Parserfehlern des WKT-Strings (dies ist der Fehler, der in Ihrer Frage angezeigt wird).

Verwenden Sie ST_MakePoint, das numerische Parameter direkt verwenden kann.

NpgsqlCommand Befehl = new NpgsqlCommand( "INSERT INTO points(name, point) VALUES" "(2, ST_SetSRID(ST_MakePoint(:longitude, :latitude), 4326));", conn);

NpGSQL unterstützt eine direkte Zuordnung von Punkten zum PostGIS-Geometrietyp über die Klasse PostgisGeometrie.

Damit solltest du in der Lage sein

NpgsqlCommand Befehl = new NpgsqlCommand( "INSERT INTO points(name, point) VALUES (:name :point);", conn ); Befehl.Hinzufügen( "Name"); command.Add( myPostgisGeometry );