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 forSystem.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 につなぐ機会があるか、やって良いかは検討が必要ですが、この知識で救われる日が来るかもしれません。