rksoftware

Visual Studio とか C# とかが好きです

Xamarin で PostgreSQL を使う

Xamarin ではコードを共通化する部分を .NET Stabdard で作れるようになっています。
この .NET Standard ですが、RDB と直接接続してクエリを実行することができます。最近 PostgreSQL の名を聞く機会があったので試してみました。

■ 参照アセンブリ

.NET Standard ライブラリプロジェクトには Npgsql.dll アセンブリを追加しています。
Npgsql は次のサイトからダウンロードできます。
http://pgfoundry.org/projects/npgsql

■ コード

こんな感じのコードで PostgreSQL から値を Select できます。

string Select(){
    var dt = new DataTable();
    using (var pgConnection = new Npgsql.NpgsqlConnection(
        "Server=サーバ名;Port=ポート番号;Database=データベース名;User Id=ユーザ名;Password=パスワード;"))
    using (var pgCommand = pgConnection.CreateCommand())
    {
        pgConnection.Open();
        pgCommand.CommandText = "SELECT * FROM public.sample_table";
        dt.Load(pgCommand.ExecuteReader());
    }
    var sb = new StringBuilder();
    foreach (DataRow row in dt.Rows)
        sb.AppendLine($"{row[0]}, {row[1]}");
    return sb.ToString();
}

■ コンパイルエラー

コードは前述のもので OK ですが、Android プロジェクトがコンパイルエラーになります。

エラーメッセージ

Can not resolve reference: System.DirectoryServices, referenced by **** > Npgsql. Please add a NuGet package or assembly reference for System.DirectoryServices, or remove the reference to ****. (XA2002)

対策は、NuGet で System.DirectoryService パッケージをインストールします。

■ 実行時例外

コードは前述のもので OK ですが、実行時に例外が発生します。

例外メッセージ

System.TypeLoadException がスローされました
Could not load type of field 'System.Net.Security.SslStream:provider' (0) due to: Could not resolve type with token **** (form typeref, class/assembly Mono.Security.Interface.MonoTlsProvider, Mono.Security)

対策は、NuGet で Mono.Security パッケージをインストールします。

■ これだけで動きます

これだけで動きます。特に問題らしい問題もなく普通に使えます。
モバイルから RDB につなぐ機会があるか、やって良いかは検討が必要ですが、この知識で救われる日が来るかもしれません。