DataTable.Select 问题

chgjz 2016-01-07 08:28:13
由于查询的条件是客户选择的,而且选择的控件也是动态生成的,所以要通过选择的条件组织一个字符变量去查询。但这个变量放到DataTable.Select(sCon)就是查不到,变量监控出来的值放到DataTable.Select("姓名='" + drB["姓名"].ToString() + "'") 就可以查到。晕了。会不会是转意字符\" 的问题呢 ?代码如下

string sCon = "";
foreach (CheckBox sControl in pnlSelect.Controls)
{
if (sControl.Checked)
{
string sFileName = "drB[\"" + sControl.Text + "\"]";
sCon = sCon + " and " + sControl.Text + "='\"+" + sFileName + ".ToString()+\"'";
}
}
if (sCon != "")
{
sCon = sCon.Substring(4);

}

dr = Ads.Tables[0].Select(sCon);//用变量就查不到,用这个sCon监控的值拷贝出来替换sCon就查到!怪了
if (dr.Length == 0)
{
//``````````
...全文
175 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chgjz 2016-01-07
  • 打赏
  • 举报
回复
@From_TaiWan 感谢。用了你的办法,可以了。
  • 打赏
  • 举报
回复
将你拼接部分改成这样子
string sFileName =drB[sControl.Text]; 
sCon = sCon + " and " + sControl.Text + "='" + sFileName + "'";
  • 打赏
  • 举报
回复
string sFileName ="drB[\"" + sControl.Text + "\"]"; //你整个都是字符串
sCon = sCon + " and " + sControl.Text + "='\"+" + sFileName + ".ToString()+\"'";

DataTable.Select("姓名='" + drB["姓名"].ToString() + "'")//这个是获取drB["姓名"]对应值,然后组织成一个完整的字符串,不是将drB["姓名"]作为字符串传入
chgjz 2016-01-07
  • 打赏
  • 举报
回复
@From_TaiWan 按照你说的”去构造select语句,可以写成sCon = sCon + " and " + sControl.Text.Trim() + "='"+ sFileName + "'";“ 就变成了去数据表里查询 sFileName 这个值了:drB["姓名"],而不是小明 这样的真实值。
EdsionWang 2016-01-07
  • 打赏
  • 举报
回复
建议楼主在foreach上加断点,多选中两个checkbox看看你生成的 sCon 值是什么?
     sCon = sCon + " and " + sControl.Text + "='\"+" + sFileName + ".ToString()+\"'"; 
你的select(sCon)里面,难道不是“and xx = dr["xxx"] ” 的吗?
秋的红果实 2016-01-07
  • 打赏
  • 举报
回复
引用 5 楼 chgjz 的回复:
@From_TaiWan 如果我改成string sFileName = drB[sControl.Text.Trim()]; 就直接取了那个字段的行值了 变成了:姓名=' 小明 ’ 其实我是循环查询的,这样只能查到一个人。
把每次循环的结果添加到datarow[],DataRow[] myDR=new DataRow[pnlSelect.Controls.Count]; int I; foreach (CheckBox sControl in pnlSelect.Controls) { if (sControl.Checked) { string sFileName = drB[sControl.Text.Trim()]; sCon = sCon + " and " + sControl.Text.Trim() + "=\""+ sFileName + "\""; } if (sCon != "") { sCon = sCon.Substring(4); } myDR[i++] = Ads.Tables[0].Select(sCon); }
chgjz 2016-01-07
  • 打赏
  • 举报
回复
不行 监控内容拷贝出来就可以。
chgjz 2016-01-07
  • 打赏
  • 举报
回复
@From_TaiWan 如果我改成string sFileName = drB[sControl.Text.Trim()]; 就直接取了那个字段的行值了 变成了:姓名=' 小明 ’ 其实我是循环查询的,这样只能查到一个人。
秋的红果实 2016-01-07
  • 打赏
  • 举报
回复
可以这样形象理解,select()有自己的语法,我们是用C#的语法,去构造select语句,可以写成sCon = sCon + " and " + sControl.Text.Trim() + "='"+ sFileName + "'";,用'代替\",这样更容易理解,用C#构造的的语句;是写给select的,假如你原来的sCon="发布时间=‘2016-1-7’",sControl.Text.Trim() ="文件类型",sFileName="doc",那么sCon = sCon + " and " + sControl.Text.Trim() + "=\""+ sFileName + "\"";交给select的是:发布时间=‘2016-1-7’ and 文件类型='doc‘,带'的语句 你的语句string sFileName = "drB[\"" + sControl.Text + "\"]";,交给select的是drB[" 文件类型 "],drB[]不是select的函数,而是C#的
秋的红果实 2016-01-07
  • 打赏
  • 举报
回复
drB[]本来就是变量 string sFileName = "drB[\"" + sControl.Text + "\"]"; sCon = sCon + " and " + sControl.Text + "='\"+" + sFileName + ".ToString()+\"'"; 改为: string sFileName = drB[sControl.Text.Trim()]; sCon = sCon + " and " + sControl.Text.Trim() + "=\""+ sFileName + "\"";
xdashewan 2016-01-07
  • 打赏
  • 举报
回复
引用 2 楼 chgjz 的回复:
因为我要组织这样一个格式的条件啊: 姓名='" + drB["患者姓名"].ToString() + "' 这样的条件带“ 号,没引号会报错
你这命名是单引号,你竟然说是双引号,能认真数个数吗
chgjz 2016-01-07
  • 打赏
  • 举报
回复
因为我要组织这样一个格式的条件啊: 姓名='" + drB["患者姓名"].ToString() + "' 这样的条件带“ 号,没引号会报错
xdashewan 2016-01-07
  • 打赏
  • 举报
回复
select里用的单引号,不需要转义,你自己也用的单引号去查,为什么会在拼接里却又变双引号

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧