这个问题拖了我差不多一天的时间,郁闷,要是在java里面,可以很轻松就搞定了的
最近在开发WindowForm程序,里面有一个数据集DataSet感觉挺好用的,可以给这个数据集DataSet配置多个适配器TableAdapter,每个适配器可以执行一个SQL
这种适配器TableAdapter,可以使用传参(@) ,占位符(?),如果只是简单的增删查该,基本可以满足了。
而我现在要执行的查询是后面where的条件个数不固定的,比如
select * from mytable where aa = 1 and bb =2
或者
select * from mytable where aa = 1 and bb =2 and cc = 3 and dd = 4
我一开始想到的是自定义一个TableAdapter,然后里面的SQL也是动态组装的,可是碰到一个问题就是OleDbConnection总是被占用,我才行就是界面中的原来的那个TableAdapter占用了该资源。
所以就想在原来的那个TableAdapter上面找到OleDbConnection,来给新的TableAdapter使用,可还是失败了。
最后我研究出了,原来还有扩展TableAdapter这个功能,微软的程序员不简单。
解决方法如下:
1.双击红色区域
2.自动生成如下代码
3.给这个扩张类添加自己的函数
注:this.CommandCollection[1].CommandText = sql; CommandCollection是一个数组,代码上面有两个适配器,这里是修改第二个适配器。
4.组装SQL,并动态调用代码如下
//查找
private void button5_Click(object sender, EventArgs e)
{
StringBuilder sql = new StringBuilder("SELECT q.id, q.factory_code, q.factory_name, q.material_code, ");
sql.Append("q.number_in_tray, q.produced_date, q.version_number, q.qrcode_id, q.create_time, ");
sql.Append("q.isUpload, q.isCancel, m.material_name ");
sql.Append("FROM t_qrcode_info as q LEFT OUTER JOIN t_material_info as m ON q.material_code = m.material_code ");
sql.Append("WHERE 1=1 ");
String materialCode = textBox1.Text;
if (materialCode != null && !materialCode.Equals(""))
{
sql.Append(" and q.material_code like '%" + materialCode +"%'");
}
String materialName = textBox3.Text;
if (materialName != null && !materialName.Equals(""))
{
sql.Append(" and m.material_name like '%" + materialName + "%'");
}
String versionNumber = textBox2.Text ;
if (versionNumber != null && !versionNumber.Equals(""))
{
sql.Append(" and q.version_number like '%" + versionNumber + "%'");
}
String qrcodeId =textBox4.Text ;
if (qrcodeId != null && !qrcodeId.Equals(""))
{
sql.Append(" and q.qrcode_id like '%" + qrcodeId + "%'");
}
DateTime date1 = dateTimePicker1.Value;
DateTime date2 = dateTimePicker2.Value;
sql.Append(" and q.produced_date >= '" + date1 + "' and q.produced_date <= '" + date2 + "'");
Boolean isUpload = checkBox1.Checked;
sql.Append(" and q.isUpload = '" + isUpload + "'");
Boolean isCancel = checkBox2.Checked;
sql.Append(" and q.isCancel = '" + isCancel + "'");
this.t_qrcode_infoTableAdapter.setSQL(sql.ToString());
this.t_qrcode_infoTableAdapter.FillBy(this.qrcodeDataSet.t_qrcode_info);
}