SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlightで行うデータ処理アプリケーション開発の第一歩

Silverlightで実装するデータ処理の応用

Silverlightで行うデータ処理アプリケーション開発の第一歩 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ストアドプロシージャの実行

 ストアドプロシージャに関してはさまざまな議論がありますが、実際問題として業務のアプリケーションで使用しているケースは多いはずです。そこでSilverlightを使用して、データベースが持つストアドプロシージャを実行する方法を紹介したいと思います。

 これにはいくつかの手法が考えられるのですが、Silverlightでデータベースを使用するためには、バックエンドでADO.NET Entity Frameworkを使用することがほとんどのため、ADO.NET Entity Frameworkを利用した呼び出しを行う方法が設計上で一番シンプルです。また、呼び出しロジックを外部に公開するためには、WCFでサービスを構築する形がよいでしょう。以下にサンプルシステムでの手順を紹介します。

手順

  1. MSStoreSample.ModelsのプロジェクトのMSStoreSample.edmxをダブルクリックしてEDMのデザイナーを表示すると[モデルブラウザ]が表示されます。
  2. [MSStoreSampleModel.Store]の下の[ストアドプロシージャ]から、sp_CreateOrderを右クリックして、[関数インポートの作成]メニューを選択します。

  3. 関数インポートの作成1
    関数インポートの作成1
  4. [関数インポートの追加]画面の、[関数インポート名]を「CreateOrder」、[戻り値の型]を[なし]にして[OK]ボタンを押下します。

  5. 関数インポートの作成2
    関数インポートの作成2
  6. モデルブラウザ内にCreateOrderが作成されているのを確認します。

  7. モデルブラウザ
    モデルブラウザ
  8. Web側のプロジェクトに[新しい項目]として[Silverlight対応のWCFサービス]を選択してWCFサービスを追加します(名前をOrderService.svcとします)。

  9. 新しい項目の追加
    新しい項目の追加
  10. 作成されたOrderService.svcのコード(OrderService.svc.cs)を開いて、OrderServiceクラスに以下のOperationContract(CreateOrderオペレーション)を作成します。ここでは、インポートされたCreateOrderのストアドプロシージャを呼び出して注文を作成します。
OrderService.svc.csでのストアドプロシージャ呼び出し
[OperationContract]
public void CreateOrder(string userId, int paymentType, Guid creaditCardId)
{
    using (MSStoreSampleEntities context = new MSStoreSampleEntities())
    {
        context.Connection.Open();
        using (DbTransaction transaction = context.Connection.BeginTransaction())
        {
            // 注文を作成します
            using (DbCommand command = context.Connection.CreateCommand())
            {
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "MSStoreSampleEntities.CreateOrder";
                command.Parameters.Add(
                    new EntityParameter("UserId", DbType.String) { Value = userId });
                command.Parameters.Add(
                    new EntityParameter("PaymentType", DbType.Int32) { Value = paymentType });
                command.Parameters.Add(
                    new EntityParameter("CreditCardId", DbType.Guid) { Value = creaditCardId });
                command.Parameters.Add(
                    new EntityParameter("ReturnValue", DbType.Int32) { Direction = ParameterDirection.ReturnValue });
                command.ExecuteNonQuery();
            }
        }
    }
}

 このコードは、一見通常のADO.NETを使用しているようにも見えますが、実際はEntity Client(ADO.NET Entity Framework用のデータプロバイダと考えてください)を使用してストアドプロシージャ呼び出しを行っています。なお、Visual Studio 2010(.NET Frame work 4)を用いる場合、ADO.NET Entity Frameworkのバージョンが上がり、Entity Clientのみではなく、さらに上のレイヤーであるObject Services用のコードもジェネレートされるため、下記のような簡単な実装も可能になります。

.NET Frame work 4を用いたADO.NET Entity Framework でのストアドプロシージャ呼び出し
[OperationContract]
public void CreateOrder(string userId, int paymentType, Guid creaditCardId)
{
    using (MSStoreSampleEntities context = new MSStoreSampleEntities())
    {
        context.CreateOrder(userId, paymentType, creaditCardId);
    }
} 

 これでサービス側の作成は完了です。

 クライアント側の処理は非常に単純です。サービスの参照を追加して、OrderServiceをクライアント側で使用する形にします。その状況で下記のようなコードの実装をすることで、ストアドプロシージャ呼び出しを行うことが可能です。

クライアント側の処理
private void paymentButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    OrderServiceClient client = new OrderServiceClient();
    client.CreateOrderCompleted += CreateOrderCompleted;
    client.CreateOrderAsync(AuthenticationContext.Current.User.UserName, 3, Guid.Empty);
}

void CreateOrderCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    if (e.Error != null)
        throw e.Error;
}

 ただし注意しなければならないのは、ここでも非同期の処理になる点です。公開されているのはCreateOrderメソッドですが、Silverlightから呼び出す場合、CreateOrderAsyncという形で非同期の処理になっていることが分かると思います。

 なお、サンプルシステムで実行すると下図のように購入処理が完了し、履歴が表示されるようになっています。

実行結果
実行結果

まとめ

 今回の連載では、Silverlightにおけるデータ処理のほんの入り口を紹介させていただきました。ほかにも、今回は省略してしまいましたが、サーバ側の処理の中にトランザクションをかけること、データ処理の前に必要な認証の処理、同時実行の制御、エラーのハンドリング、画面の遷移など、実開発の局面では考慮しなければならないポイントが多数あります。サンプルシステムの中でもある程度触れているので、本連載と併せて学習のきっかけとなれば幸いです。

 また、Silverlight 4では、Visual Studio 2010を用いることによって、かなり効率の良い開発環境を手にできます(GUIで画面構築ができる点などは、その端的な機能の1つです)。そうした状況からも、Silverlightはもはや特別な開発プラットフォームではなくなってきているのかもしれません。ぜひ、今後はそうした視点も持ってSilverlightをチェックしてみてください。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Silverlightで行うデータ処理アプリケーション開発の第一歩連載記事一覧

もっと読む

この記事の著者

マイクロソフト株式会社 小高 太郎(コダカ タロウ)

マイクロソフト株式会社 デベロッパーエバンジェリスト。某国内SI企業にてERPパッケージ開発に携わり、プログラマー、SE、PMと様々なロールを担当すると共に、Microsoft Universityの講師を兼務する。マイクロソフト株式会社では、デベロッパーエバンジェリストとして開発者向けに様々な技術...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5145 2010/05/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング