0

このようなことは以前にも尋ねられたと思いますが、必要なものを正確に見つけることができないようです。VS 2010 .NET 3.5 プロジェクトに DataSet コンポーネントを追加したとします。これは正常に実行され、いっぱいになり、非常に使いやすくなっています。しかし、実行時に (さまざまなユーザー入力に基づいて) クエリに小さな変更を加えたい場合はどうすればよいでしょうか?

パラメーターを使用してこれを行うことができることはわかっていますが、パラメーターの省略など、クエリへの変更がより構造的な特徴を持っている場合はどうなりますか?

生成されたコードでは、CommandCollection プロパティが公開されていることがわかりますが、保護されているため、データセットの外部から使用することはできません - :) 生成されたアダプター オブジェクトから継承するダミー クラスを作成し、CommandCollection プロパティを公開します。 force (それは私がやったことです) - しかし、それは少しぎこちないですか?

もっと良いテクニックを知っていますか?

4

1 に答える 1

0

誰も答えなかったので、ここで使用した回避策を投稿します(継承されたクラス)。序文: DataSet クラスを VS 2010 ツールボックスからデザイン ビューのフォーム (MainForm など) にドラッグすると、次の 3 つのものが生成されます。

  • DataSet (テーブルとデータ インスタンスを含む)
  • DataAdapter (上記のデータセットを埋める方法を説明します)
  • BindingSource (上記の DataSet を Form のコントロールにバインドします)

上記で生成されたクラスの定義は、必要なクエリなどとともに、最終的に XSD ファイルに格納され、各ビルド中にこれらのクラスのコードが XSD から生成されます。

  // MyTableAdapter is a VS2010 AUTOGENERATED class
  // (generated during DataSet wizard)
  // thankfully, MyTableAdapter exposes protected CommandCollection attribute
  class MyAdapter : MyTableAdapter
  {
      public System.Data.OracleClient.OracleCommand[] Commands
      {
          get { return CommandCollection; }
      }
  }

  class MainForm : Form
  {
      private void btnQuery_Click(object sender, EventArgs e)
      {
          // create new OracleCommand to substitute the SelectCommand in autogenerated adapter
          using (OracleCommand cmd = new OracleCommand())
          {
              MyAdapter m = new MyAdapter(); // dummy instance used just to retrieve saved query
              if (m.Commands.Length > 0)
              {
                   cmd.Connection = mainDbConnection;
                   cmd.CommandText = m.Commands[0].CommandText.Replace('someText', 'someOtherText'); // do whatever changes to the query
                   cmd.CommandType = CommandType.Text;
                   cmd.Parameters.Add(...); // optionally, if needed

                   //myTableAdapter is a Designer generated instance of MyTableAdapter
                   //but I can substitute its SelectCommand with something else
                   myTableAdapter.Adapter.SelectCommand = cmd;
                   myTableAdapter.Adapter.Fill(this.myDataSet.MyTable);
              }
          }
      }
  }
于 2013-01-04T11:56:15.800 に答える