サービス業で働く社内SEのブログ

技術メモを適当にかいつまんで記載します

【Xamarin】Xamarin.FormsでMySQLに直接接続する

とても需要がなさそうなタイトルですね。

要はクラサバです。
通常であればApp⇔WebAPI⇔DBとやる流れのところを
App⇔DBの直繋ぎでやってしまおうという試みです。

この手法自体は一般的に見れば悪手です。
というより絶対にやるべきではありません。
しかしながら、社内の業務システムにおいて、比較的小規模かつPrivateな環境であれば
わざわざWebAPIを立てるのもコストになる為、そういう時には直繋ぎでやってしまっても良いのではないかということで試してみました。

開発環境は以下の通りです。
Windows10Pro
VisualStudio2015Community
Xamarin.Forms4.0
MySQL5.6
また私自身がXamarinAccountiOSしか持っていませんので
ソリューション作成直後にAndroid(WPも)プロジェクトは速攻削除しています。
恐らくどれでも動く気もするのですが検証はしておりません。

プロジェクト作成

まずは新規でXamarin.Forms Sharedプロジェクトを作成します。
f:id:Einherjar1632:20151122162359p:plain
Xamarin.Forms Portableもありますが、複数の環境で扱える特性上Sharedと比べ使用できる.NET Frameworkが限定されます。
MySQLへの接続はSystem.Data名前空間へのアクセスが必須になりますのでこちらを選択下さい。

各種dllを参照させる

下記から取得しましょう。
MySQL Plugin / Components / Xamarin
解凍しlib\ios\MySql.Data.CF.dlliOSのプロジェクトに参照させます。
その際、System.DataI18N.Westアセンブリも参照させましょう。
謎の後者については後述しますがバグ回避用です。
f:id:Einherjar1632:20151122221859p:plain

実装コード

Sharedプロジェクトに以下Forms Xaml Pageを追加します。
f:id:Einherjar1632:20151122222454p:plain
f:id:Einherjar1632:20151122222657p:plain

xamlには以下を記述し

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XamarinFormsMySQL.XamarinFormsMySQLPage">
    <Label Text="{Binding MainText}" VerticalOptions="Center" HorizontalOptions="Center" />

  <StackLayout Padding="10,0">
    <Label x:Name="LblMsg" Text="MySQL" VerticalOptions="CenterAndExpand" HorizontalOptions="Center" />
    <Button x:Name="BtnConnect" Clicked="OnButtonClicked" FontSize="24" Text="XamarinMySQLTest" VerticalOptions="CenterAndExpand" HorizontalOptions="Center" />
  </StackLayout>
  
</ContentPage>

コードビハインドに以下を記述します。
謎のおまじないnew CP1250();がありますが、バグ回避のためです。
MySQLdllで設定されている文字セットはデフォルトでCP1250ですが、Xamarinだと何故か認識できないみたいです。

using System;
using MySql.Data.MySqlClient;
using Xamarin.Forms;
using I18N.West;

namespace XamarinFormsMySQL
{
    public partial class XamarinFormsMySQLPage : ContentPage
    {
        public XamarinFormsMySQLPage ()
        {
            InitializeComponent ();
        }

        public void OnButtonClicked(object sender, EventArgs args)
        {
            try
            {
                new CP1250();
                var cs = string.Format("Server=YourIPAddress;Port=3306;database=YourDatabase;User Id=YourID;Password=YourPassword;charset=utf8");
                using(var db = new MySqlConnection(cs))
                {
                    db.Open();
                    var queryString = "select hello from helloxamarin";
                    var sqlcmd = new MySqlCommand(queryString, db);
                    var result = sqlcmd.ExecuteScalar().ToString();
                    LblMsg.Text = result;
                    db.Close();
                }
            }
            catch (Exception ex)
            {
                LblMsg.Text = ex.ToString();
            }
        }

    }
}

あとはApp.csから追加したxamlを呼ぶようにして終わりです。

using Xamarin.Forms;

namespace XamarinFormsMySQL
{
    public class App : Application
    {
        public App ()
        {
            MainPage = new XamarinFormsMySQLPage();
        }
    }
}

デバッグしてみる

MySQLには予めtestスキーマを作りhelloカラムを持ったhelloxamarinテーブルを作成しておきました。
helloカラムの中身はHelloXamarinMySQLです。

f:id:Einherjar1632:20151122225201p:plain
比較的お手軽簡単にいきましたね。
あと私の環境ですと、何故かアイコンがビルド時にコピーできないようでビルドエラーが出ましたので、iOSプロジェクトのResourcesフォルダの画像は削除しました。
以下、Githubにも上げてあります。
github.com