ページの先頭行へ戻る
Enterprise Postgres 12 アプリケーション開発ガイド
FUJITSU Software

4.4.4 注意事項

Table Adapterに関する注意事項

  

タイププラグインについて

  

各タイププラグインに関する注意事項

各タイププラグインに関する注意事項を説明します。

NodaTime

PostgreSQLのデータ型とNodatimeのデータ型のマッピングを説明します。

マッピングテーブル

PostgreSQL
データ型

既定のNodaTime

追加されるNodaTime

備考

timestamp

Instant

LocalDateTime

UTCタイムスタンプをデータベースに格納するのが一般的です。このようにして、Instant値を読み書きすることができます。また、LocalDateTimeの読み書きのオプションもあります。これは、タイムゾーンに関する情報を持たない日付/時刻であり、タイムゾーンを別の列に格納していて、両方をNodaTime ZonedDateTimeに読み込みたい場合に有効です。

timestamp with time zone

Instant

ZonedDateTime, OffsetDateTime

PostgreSQLのデータ型は、UTCであると仮定したタイムスタンプのみを格納します。これをInstantとして読み書きする場合、タイムゾーン変換なしで格納された状態で提供されます。しかし、ZonedDateTimeまたはOffsetDateTimeとして読み書きする場合、プラグインはPostgreSQLセッションのタイムゾーンに従って自動的にUTCとの間で変換を行います。

date

LocalDate

タイムゾーンやオフセット情報を持たない単純な日付です。

time

LocalTime

タイムゾーンやオフセット情報を持たない単純な時刻です。

time with time zone

OffsetTime

時刻とオフセットを格納するPostgreSQLの型です。

interval

Period

固定された絶対長を持たない(たとえば、「2カ月」は、該当する月によって異なる)ため、NodaTimeのPeriod(DurationまたはTimeSpanではない)にマッピングされます。


Json.NET

JSONプラグインがセットアップされると、ユーザーは透過的にCLRオブジェクトをJSON値として読み書きでき、プラグインはそれらを自動的にシリアル化/逆シリアル化します。

以下にコード例を示します。

// Write arbitrary CLR types as JSON
using (var cmd = new NpgsqlCommand(@"INSERT INTO mytable (my_json_column) VALUES (@p)", conn))
{
    cmd.Parameters.Add(new NpgsqlParameter("p", NpgsqlDbType.Jsonb) { Value = MyClrType });
    cmd.ExecuteNonQuery();
}

// Read arbitrary CLR types as JSON
using (var cmd = new NpgsqlCommand(@"SELECT my_json_column FROM mytable", conn))
using (var reader = cmd.ExecuteReader())
{
    reader.Read();
    var someValue = reader.GetFieldValue<MyClrType>(0);
}

NetTopologySuite (空間型)

デフォルトでは、プラグインはGeometryServiceProvider.InstanceのDefaultCoordinateSequenceFactoryによって提供される縦座標のみを処理します。 GeometryServiceProviderが自動的に初期化されると、X座標とY座標が処理されます。動作を変更するには、次の例のようにhandleOrdinatesパラメーターを指定します。

conn.TypeMapper.UseNetTopologySuite(handleOrdinates: Ordinates.XYZ);

M座標を処理するには、GeometryServiceProvider.InstanceをDotSpatialAffineCoordinateSequenceFactory に設定されたcoordinateSequenceFactoryを使用して、新しいNtsGeometryServicesインスタンスに初期化する必要があります。

// Place this at the beginning of your program to use the specified settings everywhere (recommended)
GeometryServiceProvider.Instance = new NtsGeometryServices(
    new DotSpatialAffineCoordinateSequenceFactory(Ordinates.XYM),
    new PrecisionModel(PrecisionModels.Floating),
    -1);

// Or specify settings for Npgsql only
conn.TypeMapper.UseNetTopologySuite(
    new DotSpatialAffineCoordinateSequenceFactory(Ordinates.XYM));

ジオメトリ値の読み書き

データベースからPostGIS値を読み込むと、Npgsqlは適切なNetTopologySuite型(Point、LineStringなど)を自動的に返します。 Npgsqlは、パラメーター内のNetTopologySuite型を自動的に認識し、対応するPostGIS型タイプをデータベースに自動的に送信します。以下のコードは、データベースとNetTopologySuite型のやりとりを示しています。

var point = new Point(new Coordinate(1d, 1d));
conn.ExecuteNonQuery("CREATE TEMP TABLE data (geom GEOMETRY)");
using (var cmd = new NpgsqlCommand("INSERT INTO data (geom) VALUES (@p)", conn))
{
    cmd.Parameters.AddWithValue("@p", point);
    cmd.ExecuteNonQuery();
}

using (var cmd = new NpgsqlCommand("SELECT geom FROM data", conn))
using (var reader = cmd.ExecuteReader())
{
    reader.Read();
    Assert.That(reader[0], Is.EqualTo(point));
}

NpgsqlDbType.Geometryを設定して、パラメータの型を明示的に指定することもできます。


ジオグラフィ(測地座標)サポート

PostGISには、ジオメトリ(デカルト座標の場合)とジオグラフィ(測地座標または球面座標の場合)の2つのタイプがあります。 ジオメトリとジオグラフィの違いについては、PostGISドキュメントを参照してください。ジオグラフィは長距離の計算を行う場合にはるかに正確ですが、計算コストが高くなり、ジオメトリでサポートされる空間操作の小さなサブセットのみをサポートします。

Npgsqlは同じNetTopologySuiteタイプを使用してジオメトリとジオグラフィの両方を表現します。Pointタイプはデカルト空間またはジオグラフィ空間のいずれかのポイントを表します。 通常、PostgreSQLは必要に応じて型をキャストするため、この区別について考慮は不要です。ただし、Npgsqlはデフォルトでデカルトジオメトリを送信することに注意してください。NpgsqlDbType.Geographyを指定することにより、代わりにジオグラフィを送信するようにNpgsqlに指示するオプションがあります。

using (var cmd = new NpgsqlCommand("INSERT INTO data (geog) VALUES (@p)", conn))
{
    cmd.Parameters.AddWithValue("@p", NpgsqlDbType.Geography, point);
    cmd.ExecuteNonQuery();
}

デフォルトでジオグラフィを使用したい場合は、プラグインをセットアップするときにそれを指定することもできます。

NpgsqlConnection.GlobalTypeMapper.UseNetTopologySuite(geographyAsDefault: true);

GeoJSON (空間型)

GeoJSONプラグインの使用方法は、NetTopologuSuiteと同じです。


LegacyPostgis (空間型)

Npgsql 3.2以前でPostGIS型を使用していた場合、プラグインは同じように動作します。

NpgsqlConnection.GlobalTypeMapper.UseLegacyPostgis();

// Write
var cmd = new NpgsqlCommand("INSERT INTO table (pg_point, pg_polygon) VALUES (@point, @polygon)", conn);
cmd.Parameters.AddWithValue("point", new PostgisPoint(3.5, 4.5));
cmd.ExecuteNonQuery();

// Read
var cmd = new NpgsqlCommand("SELECT * FROM table", conn);
var reader = cmd.ExecuteReader();
while (reader.Read()) {
    var point = reader.GetFieldValue<PostgisPoint>(0);
    var polygon = reader.GetFieldValue<PostgisPolygon>(1);
}

  

クエリビルダに関する注意事項

  

サーバーエクスプローラーに関する注意事項

メタデータに関する注意事項

  

更新系SQL文の自動生成に関する注意事項

以下の更新不可能な問合せを含むSQL文に対し、更新系のSQL文が生成され、そのSQL文が実行できない場合があります。

更新系SQL文は以下の場合に自動生成されます。

  

分散トランザクションに関する注意事項

トランザクションスコープを利用するアプリケーションは、Microsoft Distributed Transaction Coordinator(MSDTC)と連携することで、分散トランザクションとして動作することができます。この場合、以下の注意が必要です。