【Xamarin】Xamarin.FormsでMySQLに直接接続する
とても需要がなさそうなタイトルですね。
要はクラサバです。
通常であればApp⇔WebAPI⇔DBとやる流れのところを
App⇔DBの直繋ぎでやってしまおうという試みです。
この手法自体は一般的に見れば悪手です。
というより絶対にやるべきではありません。
しかしながら、社内の業務システムにおいて、比較的小規模かつPrivateな環境であれば
わざわざWebAPIを立てるのもコストになる為、そういう時には直繋ぎでやってしまっても良いのではないかということで試してみました。
開発環境は以下の通りです。
・Windows10Pro
・VisualStudio2015Community
・Xamarin.Forms4.0
・MySQL5.6
また私自身がXamarinAccount
をiOS
しか持っていませんので
ソリューション作成直後にAndroid
(WP
も)プロジェクトは速攻削除しています。
恐らくどれでも動く気もするのですが検証はしておりません。
プロジェクト作成
まずは新規でXamarin.Forms Shared
プロジェクトを作成します。
Xamarin.Forms Portable
もありますが、複数の環境で扱える特性上Shared
と比べ使用できる.NET Framework
が限定されます。
MySQL
への接続はSystem.Data
名前空間へのアクセスが必須になりますのでこちらを選択下さい。
各種dllを参照させる
下記から取得しましょう。
MySQL Plugin / Components / Xamarin
解凍しlib\ios\MySql.Data.CF.dll
をiOS
のプロジェクトに参照させます。
その際、System.Data
とI18N.West
のアセンブリも参照させましょう。
謎の後者については後述しますがバグ回避用です。
実装コード
Shared
プロジェクトに以下Forms Xaml Page
を追加します。
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();
がありますが、バグ回避のためです。
MySQL
のdll
で設定されている文字セットはデフォルトで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
です。
比較的お手軽簡単にいきましたね。
あと私の環境ですと、何故かアイコンがビルド時にコピーできないようでビルドエラーが出ましたので、iOS
プロジェクトのResources
フォルダの画像は削除しました。
以下、Githubにも上げてあります。
github.com