SqlBulkCopy DataTable mit der Spatial Data-Spalte WellKnownText

8

Ich versuche, ein DataTable zu kopieren, das die folgenden Spalten hat:

  • "ID" - System.Int32
  • "Geom" - System.String

In eine SQL-Datenbank mit den folgenden Spalten:

  • "Id" - int
  • "Form" - geometry

Kann jemand auf die beste Weise beraten, dies zu tun?

Irgendein Testcode, wenn es hilft ...

%Vor%

Mein ursprünglicher Beitrag konnte nicht erklären, dass das Ausführen des oben genannten Vorgangs zum Auslösen der folgenden Ausnahme führt.

  

InvalidOperationException: Der angegebene Wert vom Typ String aus der Datenquelle kann nicht in den Typ udt der angegebenen Zielspalte konvertiert werden.

Ich gehe davon aus, dass SqlBulkCopy den Spaltentyp geometry nicht kennt und daher nicht weiß, wie man ihn von string konvertieren kann. Kann das jemand bestätigen?

    
mortware 26.04.2011, 15:15
quelle

2 Antworten

10

Ihre Spalte "Geom" muss vom Typ SqlGeometry sein, keine Zeichenfolge. Sql Server erwartet einen benutzerdefinierten Typ (UDT) für eine Geometriespalte in einer Einfügung. Das würde ich verwenden:

%Vor%

Beachten Sie, dass wir den tatsächlichen SqlGeometry-Typ aus Ihrer Zeichenfolge erstellen. Die Masseninsertion wird dafür sorgen, dass sie in ein Binärformat konvertiert wird, das SqlServer erkennt.

Ich bin mir auch nicht sicher, warum Sie mehrere Datensätze mit derselben ID einfügen möchten (Sie haben alle die ID 1 in Ihrer Stichprobe).

Viel Glück!

    
David Faivre 27.04.2011, 14:41
quelle
0

Wenn die Desintationstabelle dieselbe Spaltenstruktur wie Ihre DataTable aufweist, müssen Sie die Spalten nicht zuordnen. Wenn sich die Desintationstabelle in der Struktur von Ihrer DataTable unterscheidet, müssen Sie jede Spalte zuordnen.

%Vor%

Sie haben gerade festgestellt, dass Sie für Ihre SQL-Spalte keinen varchar verwenden. In diesem Fall denke ich am besten daran, eine sp zu verwenden, um die Tabelle aufzufüllen, und die gespeicherte Prozedur mithilfe der Array-Bindung auszuführen. Hier ist ein Beispiel, das ich mit Oracle gemacht habe. Sie können es ändern und vereinfachen es viel mehr bei der Verwendung von SQL Server.

%Vor%

Wo ich eine Insert-Anweisung erstelle, können Sie einen Aufruf der gespeicherten Prozedur einfügen und bei Bedarf parametrisieren.

    
mservidio 26.04.2011 15:18
quelle