.net 3.5在运行时修改DataSet查询

时间:2012-12-20 11:29:16

标签: .net sql oracle .net-3.5 dataset

我确信以前曾经问过这样的事情,但我似乎无法找到我需要的东西。假设我在我的VS 2010 .NET 3.5项目中添加了一个DataSet组件 - 它正在执行并填充正常并且非常易于使用。 但是,如果我想在运行时对其查询进行小的修改(基于各种用户输入),该怎么办?

我知道我可以使用参数执行此操作,但如果对查询的修改具有更多结构特征,例如省略参数等,该怎么办?

在生成的代码中,我看到它暴露了CommandCollection属性,但它受到保护,因此我不能在数据集之外使用它 - 除非:)我创建一个从生成的适配器对象继承并公开暴露的虚拟类强制执行CommandCollection属性(这正是我所做的) - 但是不是有点尴尬吗?

你知道更好的技术吗?

1 个答案:

答案 0 :(得分:0)

所以既然没有人回答,我发布了我在这里使用的变通方法(继承类)。前言:当您在设计视图中将DataSet类从VS 2010工具箱拖到窗体(例如MainForm)时,会生成三件事:

  • 一个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);
              }
          }
      }
  }