開発基盤部会 Blog

開発基盤部会 Blog >> 記事詳細

2017/03/06

Open 棟梁の使い方(実践編)第3回

Tweet ThisSend to Facebook | by nishino

第 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 棟梁を使うことはできます。

ネイティブアプリへの 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 の各ターゲットがあることを確認してください。(なかった場合は追加してください)PCL のターゲットの確認

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 プロジェクトをデバッグ実行してみます。 「サンプル」ボタンをクリックすると、以下のように結果が表示されることを確認してください。

Android エミュレーターで動作確認

次に、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 棟梁の活用方法を見ていきたいと思います。


09:08 | 投票する | 投票数(0) | コメント(0)