這個問題拖了我差不多一天的時間,鬱悶,要是在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);
}