誰も答えなかったので、ここで使用した回避策を投稿します(継承されたクラス)。序文: 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);
}
}
}
}