locked
Silverlight2 beta2 とOracle DB接続について RRS feed

  • 質問

  •  

    お世話になります。

     

    現在Silverlight2 Beta2を使用して開発を行っているのですが、

    どのようにすればOracleのDBに接続を行い、

    それをPage.xamlのGridViewに表示すればよいかわかりません。

     

    サンプルとしてSQL Server接続を行ったのですが、

    SQL ServerはLinq to SQLが使用できたので比較的簡単にできました。

     

    しかし、

    1:Linq to SQLはOracleをサポートしてない(理論上は可能でも設定が煩雑で推奨できない)

    2:本開発では複数レコード一括アップデートを実装する予定だが、

     Linq to SQLは単一レコードのアップデートしか行えない

     

    といった背景から使用ができません。

     

    どこかOracleのDBにアクセスし、そのデータをGridに表示しているサンプルを掲載しているサイトがございましたら

    ご教示頂きたくお願い致します。サイトにつきましては言語は特に問いません。

     

    もしくは、ご回答者様がサンプルをご掲載頂ければ、そちらも参照させて頂きたく思います。

     

    以上、勝手ばかりで申し訳ありませんが、よろしくお願い致します。
    2008年7月23日 10:00

回答

  • まず、DataSetを丸ごと返す手法を変更した方がいいと思います。

     

    Silverlight 2でのコントロールへのデータバインディングは、IEnumerableをサポートしているコレクションであれば実行できますが、DataSetはそのインターフェイスをサポートしていません。

    http://msdn.microsoft.com/ja-jp/library/system.data.dataset(VS.80).aspx

     

    テーブルの1行を格納するための構造体としてのクラスを作り、コレクションにして、DataSetとは関係ない形にするのはどうですか。

     

    // MyDataItem.cs

    public class MyDataItem

    {

        public string Field01 {get;set}

        public string Fiedl02 {get;set}

    // .. 以下、省略

    }

     

    // Service1.cs

    // [...]

    public List<MyDataItem> GetTblById(string Id)

    {

        List<MyDataItem> myCollection = new List<MyDataItem> ();

    // 中略、

    // dsの中身を1行ずつ取り出して、MyDataItemのインスタンスを作り、コレクションに登録する。

        return myCollection;

    }

     

    あとは、Silverlight側からサーバ側のGetTblByIdを呼び出して、コレクションを受け取り、SilverlightのコントロールのItemSourceへ渡せばいいでしょう。

     

    次のページが参考になるかもしれません。

    http://msdn.microsoft.com/ja-jp/library/system.windows.controls.datagrid.itemssource(en-us,VS.95).aspx

     

     

     


    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

    2008年8月21日 15:03

すべての返信

  • お世話になります。

     

    本件、DataSetを使用することになりました。

     

    そこで改めて質問させて下さい。

    (SilverlightではなくC#の範疇かも知れませんが)

     

    DataSetにSQL実行結果の値をいれ、それをPage.xamlに記載されているDataGridのDataSourceにしようとしたのですが、

    アイテム数が0になってしまいます。

     

    実際、ServiceからデータセットをreturnしたときはDBの件数分のデータが格納されていました。

    また、Reference.csが実行されたときに、サイズオーバーのエラーが発生したことから、

    この段階ではデータが格納されていたものと判断しております。

     

    しかし、それをreturnした際に0になっていました。

     

    以下に各ソースを掲載させて頂きますので、所見がございましたらご指摘下さい。

    なお、変数名などは適当なものを使用いたします。

     

    ・Page.xaml.cs

    検索ボタンクリックイベント

    void Search_Click(object sender, RoutedEventArgs e)
    {
          theDataGrid.Visibility = Visibility.Visible;
          btnUpdate.Visibility = Visibility.Visible;
          btnDelete.Visibility = Visibility.Visible;

          ServiceReference1.Service1Client webService = new DBConnection.ServiceReference1.Service1Client();

          webService.GetTblByIdCompleted += new EventHandler<DBConnection.ServiceReference1.GetTblByIdCompletedEventArgs>(webservice_GetTblByIdCompleted);
           webService.GetTblByIdAsync("15");
    }

     

    ・IService1.cs

    インタフェース定義

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        DataSet GetReraTblById(string Id);

     

    ・Service1.cs

    データ取得メソッド

    public DataSet GetTblByd(string Id)
    {

          OracleConnection con = new OracleConnection(System.Configuration.ConfigurationManager.ConnectionStrings["接続文字列"].ConnectionString);
         OracleCommand command = new OracleCommand();
         command.Connection = con;
         command.CommandType = CommandType.Text;

         StringBuilder sbSql = new StringBuilder();
         sbSql.Append("SQL文");
         command.CommandText = sbSql.ToString();
         command.BindByName = true;

         OracleDataAdapter da = new OracleDataAdapter(command);
         DataSet ds = new DataSet();
         da.Fill(ds);

         con.Close();

         return ds; ←この段階では件数がDBの件数と一致しています。
    }

     

    ・Reference.cs

    データ返却メソッド?

    public System.Collections.ObjectModel.ObservableCollection<DBConnection.ServiceReference1.TBL> EndGetTblById(System.IAsyncResult result)
    {
          object[] _args = new object[0];
          System.Collections.ObjectModel.ObservableCollection<DBConnection.ServiceReference1.TBL> _result = ((System.Collections.ObjectModel.ObservableCollection<DBConnection.ServiceReference1.TBL>)(base.EndInvoke("GetTblById", _args, result))); ←構成を変更しなかった場合、ここで65536を超えたというエラーが出ました
           return _result;←この段階で _result に0が入ります。上の行で件数計算をしているのに
    }

     

    ・Page.xaml.cs

    DataGridのDataSource定義

    void webservice_GetTblByIdCompleted(object sender, DBConnection.ServiceReference1.GetTblByIdCompletedEventArgs e)
    {
          theDataGrid.ItemsSource = e.Result;←e.Resultが0になっていて、Itemsも0になっています
    }

     

    フローとしては随所にブレークポイントを置いて確かめたので上記の通りになっています。

    また、件数などはイミディエイト・ウィンドウで確認しました。

     

    コメントもなく、非常に見づらいソースで恐縮ですが、アドバイスを頂ければと思います。

    2008年7月24日 2:05
  • まず、DataSetを丸ごと返す手法を変更した方がいいと思います。

     

    Silverlight 2でのコントロールへのデータバインディングは、IEnumerableをサポートしているコレクションであれば実行できますが、DataSetはそのインターフェイスをサポートしていません。

    http://msdn.microsoft.com/ja-jp/library/system.data.dataset(VS.80).aspx

     

    テーブルの1行を格納するための構造体としてのクラスを作り、コレクションにして、DataSetとは関係ない形にするのはどうですか。

     

    // MyDataItem.cs

    public class MyDataItem

    {

        public string Field01 {get;set}

        public string Fiedl02 {get;set}

    // .. 以下、省略

    }

     

    // Service1.cs

    // [...]

    public List<MyDataItem> GetTblById(string Id)

    {

        List<MyDataItem> myCollection = new List<MyDataItem> ();

    // 中略、

    // dsの中身を1行ずつ取り出して、MyDataItemのインスタンスを作り、コレクションに登録する。

        return myCollection;

    }

     

    あとは、Silverlight側からサーバ側のGetTblByIdを呼び出して、コレクションを受け取り、SilverlightのコントロールのItemSourceへ渡せばいいでしょう。

     

    次のページが参考になるかもしれません。

    http://msdn.microsoft.com/ja-jp/library/system.windows.controls.datagrid.itemssource(en-us,VS.95).aspx

     

     

     


    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

    2008年8月21日 15:03
  • 大西様

     

    ご回答ありがとうございます。

     

    確かに丸ごと返す手法を変更したところ、正常に稼動しました。

    2008年8月22日 0:23
  •  こんにちは、フォーラムオペレータ大久保です。

    jun-f さん、フォーラムのご利用ありがとうございます。
    ずいぶん前のスレッドで恐縮なんですが、弊社 大西 のアドバイスがお役に立てたようですので、誠に勝手ながら「回答としてマーク」させていただきました。
    また何かございましたら MSDN フォーラムをご利用ください!おまちしております。
    マイクロソフト株式会社 フォーラム オペレータ 大久保 直美
    2009年2月19日 5:28