第 3 回 Open 棟梁でモバイルアプリ開発 (3)
こんにちは!Open 棟梁のモバイルアプリ開発での利用方法を紹介していますが、今回は 3 回目です。    今回は、ネイティブアプリでの活用サンプルをご紹介したいと思います。
ネイティブアプリでの Open 棟梁の利用
第 1 回でもご紹介しましたように、ネイティブアプリは OS ごとに Android は Java、iOS は Swift や Objective-C、Windows (UWP) は C#/VB のように開発言語が異なります。    このため、Android(Java) や iOS(Swift, Objective-C) では Open 棟梁は動作しません。    ただし、Open 棟梁の一部の部品は PCL(Portable Class Library) 化されていますので、PCL 化されている部品であれば、UWP(C#/VB) や Xamarin(mono) から利用できます。    このように、ネイティブアプリでは、一部を除き Open 棟梁を使うことはできませんが、以下のように、「サーバーサイド」のプログラムでは、Open 棟梁を使うことはできます。

今回は、Xamarin を使用して、以下のようなサンプルをご紹介します。
- Xamarin アプリケーションから、サーバーサイドの Web API を呼び出す
- Open 棟梁の F/D 層機能を利用してデータベースにアクセスし、結果セットを返す
- Web API から返ってきた結果セットを受け取り、Open 棟梁の「汎用 DTO」に復元する            (汎用 DTOとは、さきほどご紹介した PCL 化された Open 棟梁の部品の一つで、Silverlight や UWP(C#/VB) でも利用可能な、DataSet や DataTable ライクのオブジェクトです)
なお、前回と同様、本ブログでは「ネイティブアプリで、Open 棟梁をどのように利用できるのか」に焦点を当てていますので、Xamarin の詳細な使い方などはご紹介していません。 Xamarin の詳細な使い方は、
CodeZineや
@ITなどに詳しく書かれていますので、こちらもご参照ください。
Web API アプリケーションを作成する
まず、サーバーサイドプログラムを実行するための Web API アプリケーションを作成しましょう。    Web API アプリケーションの作成方法は、第 2 回でもご紹介しましたとおり、SPA(シングルページ アプリケーション) のサンプルが参考になります。    ただし、今回は、Open 棟梁の部品と組み合わせるため、既存のプログラムを一部書き換えます。
- Visual Studio のソリューションエクスプローラーで、[Controllers]-[SampleController.cs] を開く
- SelectDTController クラスを以下のように書き換える (Xamarin プロジェクトで復元可能にするため)// ファイルの先頭で、以下の名前空間をインポートしてください。
// using System.IO;
// using Touryo.Infrastructure.Public.Dto;
public class SelectDTController : ApiController
{
    // POST api/SelectDT
    public HttpResponseMessage Post(WebApiParams param)
    {
        // 引数クラスを生成
        // 下位(B・D層)は、テスト クラスを流用する
        TestParameterValue testParameterValue
            = new TestParameterValue(
                "CrudMu", "button1", "SelectAll_DT",
                param.ddlDap + "%" + param.ddlMode1 + "%" + param.ddlMode2 + "%" + param.ddlExRollback,
                new MyUserInfo("aaa", "192.168.1.1"));
        // 戻り値
        TestReturnValue testReturnValue;
        // 分離レベルの設定
        DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction;
        // B層呼出し+都度コミット
        LayerB layerB = new LayerB();
        testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso);
        // 結果表示するメッセージ
        string message = "";
        if (testReturnValue.ErrorFlag == true)
        {
            // 結果(業務続行可能なエラー)
            message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";";
            message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";";
            message += "ErrorInfo:" + testReturnValue.ErrorInfo;
            Dictionary dic = new Dictionary();
            dic.Add("Error", message);
            return Request.CreateResponse(HttpStatusCode.OK, dic);
        }
        else
        {
            // 結果(正常系)
            DataTable dt = (DataTable)testReturnValue.Obj;
            dt.TableName = "Shippers";
            
            // DataTable を、Open 棟梁の汎用 DTO に変換する
            DTTables dtTables = new DTTables();
            DTTable dtTable = DTTable.FromDataTable(dt);
            dtTables.Add(dtTable);
            using (StringWriter sw = new StringWriter())
            {
                dtTables.Save(sw);
                return Request.CreateResponse(HttpStatusCode.OK, sw.ToString());
            }
        }
    }
}
 
PCL 化された Open 棟梁のプロジェクトを追加する
次に、Xamarin プロジェクトから利用できるように、PCL 化された Open 棟梁のプロジェクトをソリューションに追加しましょう。    PCL 化された Open 棟梁のプロジェクトは、以下のパスにあります。
[Open 棟梁のルートパス]\programs\C#\Frameworks\PortableClassLibrary\PCLPublic\PCLPublic.csproj
Visual Studio のソリューションエクスプローラーで、ソリューションを右クリック→「既存のプロジェクト」で、プロジェクトを追加してください。
Visual Studio で PCLPublic プロジェクトを右クリックし、「プロパティ」を選択します。    「ターゲット」のところに Xamarin の各ターゲットがあることを確認してください。(なかった場合は追加してください)
Xamarin アプリケーションを作成する
次に、Xamarin アプリケーションを作成します。
- Visual Studio で、新規プロジェクトを作成する
 Visual Studio で Xamarin アプリケーションを作成する場合、実行するプラットフォームによって使用するテンプレートが異なります。        使用するテンプレートについては、MSDN の記事を参照してください。        ここでは、Android で動作するアプリケーションを作るために、[新しいプロジェクトの追加] ダイアログで、[Android]-[Blank App (Android)] を選択して、プロジェクトを作成します。
- 先ほど追加した Open 棟梁のプロジェクトへの参照を追加する
- 画面を実装する
 それでは、画面を作っていきましょう。        表示する画面は、ソリューションエクスプローラーの [Resources]-[layout]-[Main.axml] です。        ここに、Web API を呼び出すボタンと、Web API の結果を表示する TextView コントロールを定義します。<Button
  android:id="@+id/MyButton"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="サンプル"
/>
<TextView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:id="@+id/MyText"
/>
 
- 処理を実装する
 次は、ボタンを押したときに Web API を呼び出す処理を実装します。        処理は、ソリューションエクスプローラー直下の [MainActivity.cs] に実装します。        MainActivity クラスの onCreate メソッドを以下のように実装します。// ファイルの先頭で、以下の名前空間をインポートしてください。
// using System.IO;
// using System.Net.Http;
// using System.Net.Http.Headers;
// using Touryo.Infrastructure.Public.Dto;
protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    // Set our view from the "main" layout resource
    SetContentView (Resource.Layout.Main);
    // ボタンと TextView コントロールを取得する
    Button button = FindViewById<Button>(Resource.Id.MyButton);
    TextView tv = FindViewById<TextView>(Resource.Id.MyText);
    // ボタンクリックイベントを実装
    button.Click += async delegate
    {
        string message = "";
        try
        {
            HttpClient client = new HttpClient()
            {
                // Web API の URL を指定する
                BaseAddress = new Uri("http://10.0.2.2/SPA_Sample/api/SelectDT")
            };
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            // Web API に渡すデータ
            FormUrlEncodedContent content = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                { "ddlDap", "SQL" },
                { "ddlMode1", "individual" },
                { "ddlMode2", "static" },
                { "ddlExRollback", "-" }
            });
            // Web API を呼び出す
            HttpResponseMessage response = await client.PostAsync(client.BaseAddress, content);
            if (response.IsSuccessStatusCode)
            {
                // Web API の結果を汎用 DTO に復元する
                string result = await response.Content.ReadAsStringAsync();
                result = result.Replace(@"\r\n", System.Environment.NewLine);
                result = result.Substring(1, result.Length - 1);
                DTTables dtTables = new DTTables();
                using (StringReader sr = new StringReader(result))
                {
                    dtTables.Load(sr);
                    message = string.Format("{0}件のデータがあります", dtTables[0].Rows.Count);
                }
            }
            else
            {
                message = "HTTP Error! Status Code: " + response.StatusCode;
            }
        }
        catch (Exception ex)
        {
            message = ex.Message;
        }
        finally
        {
            tv.Text = message;
        }
    };
}
 
動作確認
それでは、実際に動かしてみましょう。    Visual Studio で、Xamarin プロジェクトをデバッグ実行してみます。    「サンプル」ボタンをクリックすると、以下のように結果が表示されることを確認してください。

次に、Open 棟梁のログを確認してみましょう。    Open 棟梁はデフォルトでは C:\root\files\resource\Log フォルダにログを出力しますので、ここに ACCESS.xxxx-xx-xx.log や SQLTRACE.xxxx-xx-xx.log (xxxx-xx-xx は実行日付) のようなログが出力されていることを確認してください。    たとえば、SQLTRACE.xxxx-xx-xx.log には以下のようなログが出力されていると思います。
[2017/02/02 14:53:44,978],[INFO ],[30],58,0,[commandText]:SELECT * FROM Shippers [commandParameter]:
次回は、UWP での Open 棟梁の活用方法を見ていきたいと思います。