MENU

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

目次

必要なパッケージ

あわせて読みたい
Microsoft.Data.SqlClient 5.2.0 The current data provider for SQL Server and Azure SQL databases. This has replaced System.Data.SqlClient. These classes provide access to SQL and encapsulate d...
あわせて読みたい
NetTopologySuite.IO.SqlServerBytes 2.1.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);
    }
}
この記事をシェアする
  • URLをコピーしました!
  • URLをコピーしました!
目次