locked
Silverlight Application と SQL Server 間のデ-タの受け渡し RRS feed

  • 質問

  •  Silverlight Applicaiton でマウスイベントを中心においた UI/UX のページを作ってみました。ASP.NET で作成していた頃から見ますと、今昔の感をひとしおです。しかし、Silverlight Applicaiton からは、SQL Server に接続できないとのことです。WCF+RIA も試してみましたが、SQL Server から取り扱いやすい形式でデ-タが得られるということはないようです。私にとっては、select count(*) from MyDB..MyTBL のような SQL 文が一番わかりやすいのですが、WCF+RIA という仕組みを通して SQL Server に問い合わせる場合、やはり、LINQ を使うのでしょうか。開発環境= VS2010prof (C#) +SQLEXPRESS

     select count(*) from MyDB..MyTBL  の答えをWCF+RIA によって MasterPage.xaml.cs 内の text 変数に代入する方法をご教示下さい。

    2010年8月6日 7:51

回答

  • Silverlight で SQL Server のデータを扱うなら、ADO.NET Entity Framework と、WCF RIA Services の LinqToEntitiesDomainService の組み合わせが簡単です。

    [EnableClientAccess()]
    public class MyDBDomainService : LinqToEntitiesDomainService<MyDBEntities>
    {
      [Invoke]
      public int MyTBLCount()
      {
        return this.ObjectContext.MyTBL.Count();
      }
    }
    
    こんな感じの DomainService を用意して、件数取得メソッドを Silverlight 側から呼び出せばいいと思います。


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答の候補に設定 山本春海 2010年8月9日 1:03
    • 回答としてマーク 山本春海 2010年8月10日 7:08
    2010年8月6日 12:22
  • 手元に環境がないので試していませんが、

     

    InvokeOperation<int> op = this._MyDBContext.MyTBLCount();
    op.Completed += (sender, e) =>{
     MyTextBlock.Text = ((InvokeOperation<int>)sender).Value.ToString();
    };
    
    こんな感じで呼び出せませんか?

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 編集済み なかむら 2010年8月7日 9:24 カンマが抜けていたのを追加。
    • 回答の候補に設定 山本春海 2010年8月9日 1:03
    • 回答としてマーク 山本春海 2010年8月10日 7:08
    2010年8月6日 22:59

すべての返信

  • Silverlight で SQL Server のデータを扱うなら、ADO.NET Entity Framework と、WCF RIA Services の LinqToEntitiesDomainService の組み合わせが簡単です。

    [EnableClientAccess()]
    public class MyDBDomainService : LinqToEntitiesDomainService<MyDBEntities>
    {
      [Invoke]
      public int MyTBLCount()
      {
        return this.ObjectContext.MyTBL.Count();
      }
    }
    
    こんな感じの DomainService を用意して、件数取得メソッドを Silverlight 側から呼び出せばいいと思います。


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答の候補に設定 山本春海 2010年8月9日 1:03
    • 回答としてマーク 山本春海 2010年8月10日 7:08
    2010年8月6日 12:22
  • MyDBDomainService.cs の中で MyTBLCount() をご教示のように記述して、MainPage.xaml.cs の中で

    MyTextBlock.Text= this._MyDBContext.MyTBLCount().ToString();

    と呼びますと、

    System.ServiceModel.DomainServices.Client.InvokeOperation`1[System.Int32]

    という結果なんですが、(int) というような単純な型変換では解決しないようです。正解を表示するには、どのようにすればよいでしょうか。

    2010年8月6日 22:15
  • 手元に環境がないので試していませんが、

     

    InvokeOperation<int> op = this._MyDBContext.MyTBLCount();
    op.Completed += (sender, e) =>{
     MyTextBlock.Text = ((InvokeOperation<int>)sender).Value.ToString();
    };
    
    こんな感じで呼び出せませんか?

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 編集済み なかむら 2010年8月7日 9:24 カンマが抜けていたのを追加。
    • 回答の候補に設定 山本春海 2010年8月9日 1:03
    • 回答としてマーク 山本春海 2010年8月10日 7:08
    2010年8月6日 22:59
  • private void MyBtn_Click(object sender, RoutedEventArgs e)
    {
     InvokeOperation<int> op = this._yoyakuContext.AnkenCount();
     op.Completed += (sender e) =>{
        MyTB.Text = ((InvokeOperation<int>)sender).Value.ToString();
     };
    }

    Build しますと (sender e) =>{ の部分に赤下線がでて以下のエラーが表示されます。

    Error 3 A local variable named 'e' cannot be declared in this scope because it would give a different meaning to 'e', which is already used in a 'parent or current' scope to denote something else

    Error 2 Delegate 'System.EventHandler' does not take 1 arguments

    Error 1 The type or namespace name 'sender' could not be found (are you missing a using directive or an assembly reference?)

    2010年8月7日 0:04
  • MyBtn_Click メソッドの引数と、Completed イベントに登録しようとしているラムダ式の引数が同じ名前なのが原因です。

    sender2、e2 という風に、どちらかの名前を変更してやればエラーは解消されます。


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月7日 7:12
  • private void MyBtn_Click(object sender2, RoutedEventArgs e2)
    {
     InvokeOperation<int> op = this._mtdbContext.MyTBLCount();
     op.Completed += (sender e) =>{
        MyTB.Text = ((InvokeOperation<int>)sender).Value.ToString();
     };
    }

    という風に、sender2 , e2 と変更しましたところ  (sender e) =>{ の部分とその下の行の sender の部分に赤下線が引かれ、エラーは

    Error 2 Delegate 'System.EventHandler' does not take 1 arguments
    Error 3 The name 'sender' does not exist in the current context
    Error 1 The type or namespace name 'sender' could not be found (are you missing a using directive or an assembly reference?)
    となっており、あまり変化がないようです。自分でも解決策を探しているのですが、捗々しい進展がありません。よろしくお願いします。

     

    2010年8月7日 8:16
  •  (sender e) を  (sender,e) に変更して、Build 成功! 出力も正解が出ました。ありがとうございました。
    2010年8月7日 8:36