locked
データベース情報を利用するには? RRS feed

  • 質問

  • 簡単(初歩的)な質問なのかもしれませんがお許しください。

     

    ・Blend 2.5 で作成したプロジェクトを、そのまま VS2008 で読み込みました。画面には1つのListBoxがあります。

    ・このリストボックスに、データをセットしたいのですが、データベース(SQL2005)から読み込みたいと思います。

     

    Page.xaml (.cs) 上にツールボックスからデータベース関係のコントロールを持って来ようとしても、ツールボックスには Silverlight 系しか表示されませんし、データ接続で目的のテーブルからアイテムをドラッグするにも受け付けてはくれません。

     

    質問:

    デザインは Blend で、バックは(私の場合は)C#でという場合、データベースを利用するには、どのような手段があるのでしょうか?

    よろしくお願いいたします!

    2008年4月28日 6:07

回答

  • きよくらならみ 様、このたびは大変お世話になりました。当方でもお教えいただいた方法2通り共成功しました。

     

    Expression Blend (2.5 March 2008 Preview) で作成したコンテンツはローカル・パスで実行されている・・・ まったくもっておっしゃられる通りで (汗) お教えいただき、ありがとうございました。

     

    でも、VS 生成プロジェクトを Blend で読み込ませることって? 詳しくは見てませんが、Blend が読み込めるのはプロジェクトのみなのにオープンしても無反応で、さらに、ファイル単体(Page.xaml)には未対応ですし...???

    Blend  で生成したプロジェクトは VS で使えるという一方通行では...(セットアップ・プロジェクトなどが付いてますと、その部分ははねられますが) (あくまでも調査はしてません)

     

    よって、Blend でプロジェクト生成&デザイン --> VS でコードを書いて --> localhost に配置 で動作確認しました。(ひとまず、Hello World を返すだけのサービスですが...) (って、事は、デバグ はできない??)

     

    なお、サービス参照にて soap でやる方法は、実は何度かトライしてまして..お教えいただいたコードを参考に C# で..  「HelloWorldAsync()」 ってこうやって使うのかと大反省... 非常に勉強になりました。

    しかし、こちらも、localhost に配置しないと動作してくれないところは全く同じですね

     

    このたびは、とても良い勉強をさせていただきました。いろいろとありがとうございました。 m<(_ _)>m

     

    ==

    補足...

     

    VS で「Generate an HTML test page to host Silverlight within this project」で作成したプロジェクトは、Blend で読み込めますが、他の Web Site etc. で作成したものはダメなのでは?ということです..

    2008年5月23日 6:12

すべての返信

  • SilverlightはC#で開発できる(CLRで動く)といっても、ブラウザ上のプラグインで動作するものですので、直接DBに接続したりはできないと思います。

    ですので、DBから取得したデータをSilverlight上で扱うには、例えば

    • DBからデータを取得、送出するWebサービスの作成
    • Webサービスを呼び出し、データを取得する処理をSilverlight上で記述

    のような手順が必要になるかと思います。

     

    Webサービス部分については、HTTP経由でリクエストを受けそれに従ってデータを返すのであれば何でも良いと思います。
    例えば、Scott Guthrie自身が公開しているチュートリアル( http://weblogs.asp.net/scottgu/archive/2008/02/22/first-look-at-silverlight-2.aspx )では、既存のWebサービスからXMLを受け取り、Silverlightのコントロール(ListBox)にバインドする流れが紹介されています。


    とはいえ、おそらくVisual Studioを使用する前提で上記の流れを新規で作成するのであれば、WCFのWebサービスを使うのが適当な手段となるのではないかと思います。

     

    2008年5月1日 14:15
  • きよくらならみ 様、メッセージをありがとうございました。返信が遅れ、大変失礼しました。

     

    その後、いろいろ試し、かつ、お教えいただいたサイトを参考にWebサービス経由でXMLを読み込もうともしてみたのですが、現状、解決はしておりません。ちなみに、XML を非同期でロードしようとする際、そこでセキュリィティ違反となってしまいます。原因は不明です。

     

    時間的余裕もございません故、本件は保留しようと思います。Silverlight2 もベータ1ですし、本リリース版の頃になれば、それほど労せずとも解決される事柄かと(勝手に)期待はしています。

     

    私の環境を添えておきます。  Windows Vista Business SP-1 64bit版, VS2008 Pro.

    2008年5月9日 5:39
  • おそらく…ですが、そのエラーは、クロスドメインへのアクセスのために発生しているのではないかと推測します。

     

    SilverlightはFlashと同様に別ドメインへアクセスする際に、XML形式のポリシーファイルを必要とします。


    詳細は http://msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx のあたりを参照してみるか、Silverlightやクロスドメイン、ポリシー等といったキーワードで検索してみてください。(同一のPC上であってもVS内蔵の開発サーバのようにポート番号が付加されていれば、別のドメインと見做されますのでご注意ください。)


    また、SilverlightはFlashと同じ形式のポリシーファイルもサポートしているようですので、上記のSilverlightというキーワードに換えて『Flash』というキーワードで検索してみても良いと思います。

     

     

    あと、クロスドメインとは直接は関係ないのですが…。
    以前、VS2008でWCFを使ってSilverlightにデータを渡す実験をしてみたことがあり、その内容をBlogにメモしたものがありますので、よければ見てみてください。
    (DBは引いていないのですが、WCFのサービス側で直接値を積んでいる所をDBアクセスしてデータを積むように読み替えれば、概ね等価と思います。ただ…Blogのエントリ中にも書いてありますが、WFCについては本当に何も知らない状態で適当に調べて切りはりしてやっているので、鵜呑みにだけはしないでください(^^;)
    http://d.hatena.ne.jp/kiyokura/20080402

     

    とは言うものの、WCF周りについてはSilverlightの現段階のβではまだまだ対応していない部分が多いように思えますので、結局のところ次以降のバージョンに期待、ということには変わりはないですね(^^;

    2008年5月9日 12:18
  • きよくらならみ 様、いろいろなご助言をありがとうございました。

     

    お教えいただきましたサイトを参考に、極簡単に(保留中!を一旦解除しまして)試してみましたが、現象は変わりませんでした。

     

    まず、雛形のままのWebサービスをローカルのIISに配置し、さらに、WebルートにポリシーXMLを保管 (from は指定せず)。

     

    これに対し、当初お教えいただいた方法で非同期接続したところ、同様な現象発生...です。

    ちなみに Silverlight 側は、1つのテキストボックスとロード開始用のボタン1つのみ.. (^^;;;

     

    実際のメッセージは

     

    「型 'System.Security.SecurityException' の例外が System.Windows.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした

    追加情報: Security error.」

     

    です。   Windows.NET アプリが簡単に Webサービスと連携可能なのに・・ というのが正直な想いデス(笑)

     

    ところで、お教えいただきましたブログ... 実は何度か拝見したことがありまして、開いて驚きました!

    現状、他の仕事もあってとっても片手間で申し訳ございませんが、これからもよろしくお願い申し上げます。

    Silverlight が業務アプリの世界でもスタンダートとなったら良いなーと望む一人です。

    2008年5月12日 7:57
  • 少し時間が出来たので、サンプルを作って試してみました。

    k.yamazaki さんが具体的にどのようなコードでやられているかわからないので、とりあえず試して成功してみたコードを乗せてみます(少し冗長かもしれませんが、ご容赦ください)。

    ※全部書いた後で、最初のご質問の内容を読み返していてk.yamazaki さんがC#でやられていることに気がつきました。VBで書いてしまいましたが、大きく(?)異なるのはコールバックのハンドラを登録するところの書き方くらいだと思うので、ご容赦ください(^^;

     

     

    1.Webサービスの作成と配置

    まず、Webサービスを作成、ローカルで動作しているIISにホストしてみました。

    手順としては、VS2008にて新規作成でWebサービスを作成。名称はとりあえずWebService1に。
    とりあえず規定のHelloWorld() Webメソッドのまま、ビルドし、配置。

    ただし、このままだとGETでとれない(SOAP関連とPOSTでしかアクセスできない)ため、先に例示しましたチュートリアルの例に沿うよう、Web.Configを変更してGETでとれるようにしました。

    具体的には、system.webセクション内に、以下の記述を追加しました。

     

      <webServices>
       <protocols>
        <add name="HttpGet"/>
       </protocols>
      </webServices>

     

    この状態でブラウザから http://localhost/WebService1/Service1.asmx/HelloWorld にアクセスし、
      <?xml version="1.0" encoding="utf-8" ?>
      <string xmlns="http://tempuri.org/">Hello World</string>
    が取得できることを確認して、このステップを完了しました。

     

     

    2.Silverlightプロジェクトを作成

    適当な名前でSilverlightのプロジェクトを新規作成しました。
    ウィザードに従い、ホストするWebを作成。パラメータは規定のまま(=Webサイト形式)。

    Page.xamlに対して、規定のButtonを一つ追加し、Clickイベントハンドラを作成しました。このClickでWebサービスと通信し、結果を取得できるか確認する、という方針としました。

     

    また、Silverlight2では非同期通信しか出来ないようなので(私の確認不足かもしれません)、コールバックのハンドラして使うメソッドをを作成しました。メソッドは、先に挙げたGuthrieさんのチュートリアルを参考に、以下のコードを記述しました。
    Private Sub CallBackMethod(ByVal sender As Object, ByVal e As System.Net.DownloadStringCompletedEventArgs)
        If e.Error Is Nothing Then
            Dim aaa As String = e.Result ''このあたりで適当にブレークを張って、動作確認する予定。
        End If
    End Sub

    (ここで適当にブレークを張って、e.Resultに正常に値が取得できているか、で正否を判断する、というものです)

     

    次に、ButtonのClickイベントハンドラを同様にGuthrieさんのチュートリアルを参考に、以下のコードを記述。


    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        Dim testServiceUrl As String = "http://localhost/WebService1/Service1.asmx/HelloWorld"
        Dim testService As System.Net.WebClient = New System.Net.WebClient()
        AddHandler testService.DownloadStringCompleted, AddressOf CallBackMethod
        testService.DownloadStringAsync(New Uri(testServiceUrl))
    End Sub

    とりあえずこれをこのまま実行してCallBackMethodにブレーク張って確認すると、 e.Errorが空でなく、Message に "Download Failure"が積まれ、e.Resultは空になっていることが確認できました。

     

     

    3.クロスドメインポリシーファイルを作成

    ローカルのIISのドキュメントルートに、以下の内容でcrossdomain.xmlという名前でテキストファイルを作成しました。

    <?xml version="1.0" ?>
    <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
        <site-control permitted-cross-domain-policies="all"/>
        <allow-access-from domain="*"  />
    </cross-domain-policy>

     


    以上で、再度実行、ブレークポイントから確認すると、e.ErrorはNull、e.Resultに
      <?xml version="1.0" encoding="utf-8" ?>
      <string xmlns="http://tempuri.org/">Hello World</string>
    が積まれていることを確認しました。

     

     

    というわけで、以上の手順で、確認してみました。
    私の場合、例外は出なかった(コールバックハンドラのErrorに例外は積まれていたが)ので、そちらとコードの詳細など異なると思われ、どこまで参考になるかはわかりませんが……。

     

     

    (ちなみに、クロスドメインポリシーファイル作成時、当初、参考にしたあるWebサイトに従ってdtdの指定を http://www.adobe.com/xml/dtds/cross-domain-policy.dtd
    としていたのですが、これだとcrossdomain.xmlを配置していない場合と同様の例外が積まれました。

    その後、別のサイトを参考に、上記の成功例にあるhttp://www.macromedia.com/xml/dtds/cross-domain-policy.dtdを指定することで、正常な結果を得ることが出来ました。)

     

     

    2008年5月20日 15:56
  • きよくらならみ 様、 サンプルまで制作、追跡いただき、誠にありがとうございました...

     

    しかしながら、今朝ほどから取り急ぎお教えいただいた内容に基づいて(手短にではありますが)確認してみましたが、状況に変化は無く、非同期接続時にエラーとなってストップしてしまいました..

     

    Debug モードにて実行した場合のエラーは..

    「型 'System.Security.SecurityException' の例外が System.Windows.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした

    追加情報: Security error.」

     

    ちなみに C# でダメでしたので、VB でも試してみましたが全く結果は同じです.. と、いうことで、あくまでも私の環境(Vista 64 bit が関係??)の問題なのかと... IIS にてプールを変更してみたりもしましたが、今日はすみません、時間切れです..

     

    詳しい内容までお教えいただき、ありがとうございました!

     

    (あーー、まだまだ先らしい次のベータが待ち遠しい..)

    2008年5月22日 4:41
  • ひょっとして…なのですが、Silverlightのプロジェクトを作る際に、規定の[このコントロールをホストするための新しいWebソリューションを追加する]ではなく、[このプロジェクト内のSilverlightをホストするHTMLページを生成する]を選択されていないでしょうか。

     

     

    後者でプロジェクトを作成し、デバッグ実行すると、ブラウザのアドレスバーをみていただければわかるのですが、Webサーバ上で実行されているのではなく、ローカルファイルで実行されます。

    そうすると、以下にある通り、SilverlightのURL Access Policyに引っかかり、例外が発生します。

    http://msdn.microsoft.com/en-us/library/cc189008(VS.95).aspx

     

    もし上記が該当しているのであれば、プロジェクト作成時にWebソリューションを作成して同じようにしてみるか、もしくは後者で作成したものを実際にWebサイトにホストし、Webサーバ経由でアクセスしてみてください。

    #最初に触ったときに私もこれに引っかかって調べたのですが、それ以降当たり前に思っていたのですっかり失念していました。すみません。

     

    <追記>

    投稿後、最初の投稿を読み返すと、Blendで作成したプロジェクト、とありますので、おそらくこれですね。

    私がちゃんと、投稿された内容を読んで理解していなかったようです。本当にすみません。

    VSで上記のようにプロジェクトを作成してみてください。

    </追記>

     

     

    #余談?

    次のバージョンですが、私も待ち遠しいです。現バージョンではまだまだWebサービス連携にいろいろ制限が多いので、突っ込んだ評価をする意欲に微妙なブレーキがかかってしまったり。

    まあ、本当に2になった一発目のお披露目的なバージョンですから多くを望むのはムシがよいのかもしれませんし、どちらかというとこれだけ動くのはそれなりにすごい、とも思うのですが、やはり心情的には(^^;

    来月(でしたよね?)行われる本国のTechEdくらいにあわせて、次バージョンが出るのでしょうか。そうだといいなぁ……と思っています。

     

    2008年5月22日 11:43
  • ついでにというか、大ボケをかましてしまった罪滅ぼしにWebServiceとの連携についてもう少しマシ(?)な方法も調べてみました。
    #ハジの上塗りになるかもしれませんが……。
    #個人的には、自分で作るWebサービスなのに(LINQが使えるとはいえ)自力でXMLをパースするのはちょっと面倒と思ったので。

     

    通常のWebサービスへのアクセスはsoapも使えるようで、以下のようにすることでもう少しだけ簡単にやりとりできました。

    1.ソリューションエクスプローラから[サービス参照の追加]でダイアログを起動
    2.アドレス欄にサービスのURLを入力し、[移動]をクリック
    3.サービスが見つかるので、OKする。
      テンプレートから新規作成した規定のままのWebサービスだと、Service1で、その配下にService1Soapというのが見えると思います。
      そのまま、OKをクリックしてください。
      (名前空間は規定のままとしました)

     

    これで、サービス参照のためのラッパー(?)が自動で用意されます。

     

    後は、以下のようにコーディングすることで、GETで取得するようなXMLのままではなく、WebMethodで返す値がe.Resultから取得できます。


    Code Snippet
    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        Dim client As ServiceReference1.Service1SoapClient = New ServiceReference1.Service1SoapClient
        AddHandler client.HelloWorldCompleted, AddressOf CallBackMethod
        client.HelloWorldAsync()
    End Sub

     

     

     

    Code Snippet

    Private Sub CallBackMethod(ByVal sender As Object, ByVal e As ServiceReference1.HelloWorldCompletedEventArgs)
        If e.Error Is Nothing Then
            Dim aaa As String = e.Result  ''String型で"Hello World"が入っている
        End If
    End Sub

     

     

     

    Webサービス側で自作の型を返してみたり、自作の型のGenericなListを返してみたりしましたが、おおむねうまく動いているようでした。
    #GenericなListは型の一次元配列になりますが。

    2008年5月22日 15:05
  • きよくらならみ 様、このたびは大変お世話になりました。当方でもお教えいただいた方法2通り共成功しました。

     

    Expression Blend (2.5 March 2008 Preview) で作成したコンテンツはローカル・パスで実行されている・・・ まったくもっておっしゃられる通りで (汗) お教えいただき、ありがとうございました。

     

    でも、VS 生成プロジェクトを Blend で読み込ませることって? 詳しくは見てませんが、Blend が読み込めるのはプロジェクトのみなのにオープンしても無反応で、さらに、ファイル単体(Page.xaml)には未対応ですし...???

    Blend  で生成したプロジェクトは VS で使えるという一方通行では...(セットアップ・プロジェクトなどが付いてますと、その部分ははねられますが) (あくまでも調査はしてません)

     

    よって、Blend でプロジェクト生成&デザイン --> VS でコードを書いて --> localhost に配置 で動作確認しました。(ひとまず、Hello World を返すだけのサービスですが...) (って、事は、デバグ はできない??)

     

    なお、サービス参照にて soap でやる方法は、実は何度かトライしてまして..お教えいただいたコードを参考に C# で..  「HelloWorldAsync()」 ってこうやって使うのかと大反省... 非常に勉強になりました。

    しかし、こちらも、localhost に配置しないと動作してくれないところは全く同じですね

     

    このたびは、とても良い勉強をさせていただきました。いろいろとありがとうございました。 m<(_ _)>m

     

    ==

    補足...

     

    VS で「Generate an HTML test page to host Silverlight within this project」で作成したプロジェクトは、Blend で読み込めますが、他の Web Site etc. で作成したものはダメなのでは?ということです..

    2008年5月23日 6:12
  • お役に立てたようで良かったです(^^)

     

     

    Blend 2.5の件ですが、私はインストールだけしたものの今まで全然起動していなかったのですが、乗りかかった舟(?)ということで、これを機に試してみました。

     

    結論から言うと、Webサイト込みのSilverlightのソリューションを、Expression Blend (2.5 March 2008 Preview) で開き、編集することが出来ました。

     

    このスレの本題とは異なるかもしれませんので簡潔に書きますが、先の例で作成したソリューションを、Blend 2.5 のメニューの[File]-[Open]-[Project/Solution...]で選択(ソリューションファイル自体を選択)することで開くことができ、Page.XAMLを編集し保存、VS2008上で再度読み込んで使用することが出来ました。

    またソリューション内のSilverlightのプロジェクトのprojファイルを選択した場合でも、ソリューション丸ごとBlend 2.5 で開きました。

    VS2008でソリューションを開きっぱなしの状態でも問題ありませんでした。

     

     

    #上記で手順でうまくいかないのであれば、何かまた別の問題かもしれませんので、その場合は改めてスレッドを立てた方がよいかもしれませんね。

     

     

    2008年5月23日 12:58
  • きよくらならみ 様... すみません、プロジェクトが読み込めない件は、全くの私の(恥ずかしいほどちょっとした)勘違いでした。訂正します。

     

    一旦、VS2K8 で Silverlight Webサイト プロジェクトを生成し、その後、Blend で読み込んでデザイン.. --> 再度、VSで読み込んでコードを書いた後、そのまま(local に配置などせずに)デバグ.. が可能でした

     

    ちなみに、Webルートに置く「crossdomain.xml」( <--  このスレッドで教えていただいた)は、これで機能していますが、サンプル( <-- これまた教えていただいた)にもある「clientaccesspolicy.xml」でもOKでした!(下記) とりあえずの加筆です

     

    Code Snippet

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
      <cross-domain-access>
        <policy>
          <allow-from>
            <domain uri="*"/>
          </allow-from>
          <grant-to>
            <resource path="/" include-subpaths="true"/>
          </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>

     

    2008年5月26日 7:44