.NET5のSqlClientでSQLServerの空間情報を扱う方法

前回の記事ではEntityFrameworkで空間情報を扱う場合の方法を説明しました
今回はSqlClientを使用する場合のやり方を説明します

目次

必要なパッケージ

あわせて読みたい
Microsoft.Data.SqlClient 3.0.1 Provides the data provider for SQL Server. These classes provide access to versions of SQL Server and encapsulate database-specific protocols, including tabular...
あわせて読みたい
NetTopologySuite.IO.SqlServerBytes 2.0.0 A SQL Server IO module for NTS which works directly with the serialization format

テーブル構造

例として店舗の座標を保存するだけのテーブルとします

create table stores
(
    id int identity constraint stores_pk primary key nonclustered,
    location geography not null
)

データを取得する場合

カラムからbyte[]を取得し、SqlServerBytesReaderで読み込めばOKです

using (var con= new SqlConnection(connectionString))
{
    con.Open();
    var geometryReader = new SqlServerBytesReader { IsGeography = true };
    using (var cmd = con.CreateCommand())
    {
        cmd.CommandText = "SELECT * FROM stores";
        using (var dr = cmd.ExecuteReader())
        {
            var geo = geometryReader.Read(dr.GetSqlBytes(1).Value);
        }
    }
}

BulkCopyで一括挿入する場合

多少工夫が必要ですが、あらかじめDataTableを作成しBulkCopyで一括挿入することができます
ポイントはgeography型のDataRowをbyte[]とすることと、Geometryの変数をSqlServerBytesWriterでbyte[]として書き出す点です

var data = new DataTable();
data.Columns.Add("id");
data.Columns.Add("location", typeof(byte[])); // カラムの型をbyte[]とする

var row = data.NewRow();
var geometry = new Point(-122.129797, 47.640049) { SRID = 4326 };
var geometryWriter = new SqlServerBytesWriter { IsGeography = true };
row["location"] = geometryWriter.Write(geometry);
data.Rows.Add(row);

using (var con= new SqlConnection(connectionString))
{
    con.Open();
    using (var bc = new SqlBulkCopy(con))
    {
        bc.DestinationTableName = "stores";
        bc.WriteToServer(data);
    }
}
よかったらシェアしてね!
目次
閉じる