我确信以前曾经问过这样的事情,但我似乎无法找到我需要的东西。假设我在我的VS 2010 .NET 3.5项目中添加了一个DataSet组件 - 它正在执行并填充正常并且非常易于使用。 但是,如果我想在运行时对其查询进行小的修改(基于各种用户输入),该怎么办?
我知道我可以使用参数执行此操作,但如果对查询的修改具有更多结构特征,例如省略参数等,该怎么办?
在生成的代码中,我看到它暴露了CommandCollection属性,但它受到保护,因此我不能在数据集之外使用它 - 除非:)我创建一个从生成的适配器对象继承并公开暴露的虚拟类强制执行CommandCollection属性(这正是我所做的) - 但是不是有点尴尬吗?
你知道更好的技术吗?
答案 0 :(得分:0)
所以既然没有人回答,我发布了我在这里使用的变通方法(继承类)。前言:当您在设计视图中将DataSet类从VS 2010工具箱拖到窗体(例如MainForm)时,会生成三件事:
上述生成的类的定义以及所需的查询等最终存储在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);
}
}
}
}