Polygon
MySQL から C# アプリケーションにデータを取得しようとしています。
Polygon
地理データが保持されるフィールドを 1 つのテーブルに正確に定義しました。
証拠:
SELECT GeometryType(GeomFromText(AsWKT(object))) as `type` FROM geo.data;
戻り値:
したがって、テーブル内のオブジェクトは問題なく、正しく定義されています。
C# のソース コードがあります。
主な行は (73-76) です。
//var polygon = (byte[])reader["object"];
//var obj = new MySqlGeometry(MySqlDbType.Blob, polygon);
var polygon = reader["object"].ToString();
var obj = MySqlGeometry.Parse(polygon);
コメントしましたが、これは両方の操作について説明するのに支障はありません。
BLOB
次の逆シリアル化と同様に取得するMySqlGeometry.Parse(System.String)
メソッドを介してフェッチされた文字列を解析する
BLOB の取得
さて、コードのコメント部分から始めましょう。想像してみましょう。これらの行はコメント解除されており、75 行目と 76 行目は文字列解析されていません。
また、別の修正があります。MySQL サーバーに送信する SQL クエリは次のようになります。
SELECT AsWKB(object) as 'object' FROM geo.data
SQLクエリで関数AsWKT()
をAsWKB()
(MySQLのテキストからバイナリフォーマッタに)変更しました。
したがって、このクエリの結果は次のようになります。
行で:
var polygon = (byte[])reader["object"];
var obj = new MySqlGeometry(MySqlDbType.Blob, polygon);
私がそのオブジェクトを取得してから配列BLOB
に変換し、それからを構築しようとしていることがわかりますが、非常に残念で、MySQL ライブラリがこのオブジェクトをではなくとして識別しているようです。System.Byte[]
MySqlGeomerty
POINT
POLYGON
証拠:
しかし!!!POLYGON
次の SQL クエリによって、MySQL に正確にオブジェクトがあります。
SELECT GeometryType(GeomFromText(AsWKT(object))) as `type`,
AsWKT(object) as `data` FROM geo.data
証拠:
それはBLOB
オブジェクトについてでした。
System.String からのジオメトリ解析
BLOB
さて... コメント化されたフェッチを含む元のソースを想像してみましょう。
行を見てみましょう:
var polygon = reader["object"].ToString();
var obj = MySqlGeometry.Parse(polygon);
また、C# アプリのソース コードの SQL クエリを次のように変更する必要があります。
SELECT AsWKT(object) as 'object' FROM geo.data
はい... .NET 用の MySQL ライブラリは、System.String
.
しかし、var polygon
上記のように正しく取得されている を解析しようとすると、次のエラーが発生します。
System.FormatException: String does not contain a valid geometry value
証拠:
これらはすべて、MySQL ライブラリが MySQL サーバーからのデータ バインディングに完全な構造を提供していないように見えます。