有很多参数的select查询,应该如何实现呢?

doocoo 2006-09-03 12:12:16
有一个表,有a_id,a_name,a_comment……等N个字段,现在想做一个查询界面,如果某控件有输入的数据,那么就根据这些数据来查询,如果某个控件留空,那么这个字段就不参加查询,里头有的是=,有的是like,有的是>……。
这样的功能,如何实现?在xsd文件里面实现,岂不是要做N个Query?
而且程序是用三层构架的方式做的,我也尝试过((a_id is null)or(a_id=?)) and ((a_name is null) or (a_name like ?))这样的子句,可是在BLL层那里就不好写了,FindByMultiParams(int a_id,string a_name,a_comment……),这样一来,比如当a_id这个控件没有输入时,传入的是一个空字符串而不是null,用if(txtA_ID.text=="")para_a_id=int.parse(null);也通不过。
怎么办啊?
...全文
212 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
doocoo 2006-09-03
  • 打赏
  • 举报
回复
刚刚发现这个SQL有问题,不能写a_id is null,应该是参数a_id is null,可是OLEDB的DATASET只能用?来占位啊,总不能写? is null吧
aafshzj 2006-09-03
  • 打赏
  • 举报
回复
XSD性能并不好了,好处和坏处都是不需要编译。
dazhu2 2006-09-03
  • 打赏
  • 举报
回复
OLEDB的数据库,不能用@,--可以用的
doocoo 2006-09-03
  • 打赏
  • 举报
回复
现在是做到了,但是解决的方法是在程序里面用从oledbconnection一路到datatable,然后用自定义的sql语句来生成datatable,实在是太烦了,而且这样一来不是绕过xsd了吗
Dennis_maomao 2006-09-03
  • 打赏
  • 举报
回复
doocoo(DooCoo)
没说一定要@ 只是代表变量的意思
jointan 2006-09-03
  • 打赏
  • 举报
回复
树上会长鱼的,你一定能钓得到,呵呵.
doocoo 2006-09-03
  • 打赏
  • 举报
回复
我是想在XSD里面定义这么一个Query,不想在程序里面生成查询啊
aafshzj 2006-09-03
  • 打赏
  • 举报
回复
你的问题应该和占位符没关系。我觉得你把自己搞糊涂了,由这句可见一斑:“不能写a_id is null,应该是参数a_id is null”。a_id是你传入方法的一个参数,如果你要先判断它是不是null,为什么要到查询语句中去判断呢,你应该在C#/VB.net代码中先判断a_id的取值再决定最终的查询语句。

希望能对你有所帮助!

AAF是一个不错的框架,提供了自动化的事务处理、持久化、自动缓存和分布式缓存同步技术。建议你有空看一下。如果感兴趣,可以联系我或者关注我的博客:http://blog.csdn.net/aafshzj
jointan 2006-09-03
  • 打赏
  • 举报
回复
这个问题参数查询解决不了,自已生成查询的WHERE子句吧,我曾经这样做过
private string BuildExp()
{
System.Collections.Specialized.StringCollection list=new System.Collections.Specialized.StringCollection();
string exp=this.GetExpBats();
if(exp!="")
list.Add(exp);
exp=this.GetExpCash();
if(exp!="")
list.Add(exp);
exp=this.GetExpCashier();
if(exp!="")
list.Add(exp);
exp=this.GetExpCharge();
if(exp!="")
list.Add(exp);
exp=this.GetExpCheck();
if(exp!="")
list.Add(exp);
exp=this.GetExpCollector();
if(exp!="")
list.Add(exp);
exp=this.GetExpDrain();
if(exp!="")
list.Add(exp);
exp=this.GetExpGroup();
if(exp!="")
list.Add(exp);
exp=this.GetExpOperator();
if(exp!="")
list.Add(exp);
exp=this.GetExpPrint();
if(exp!="")
list.Add(exp);
exp=this.GetExpProof();
if(exp!="")
list.Add(exp);
exp=this.GetExpRecord();
if(exp!="")
list.Add(exp);
exp=this.GetExpSerial();
if(exp!="")
list.Add(exp);
exp=this.GetExpType();
if(exp!="")
list.Add(exp);
exp=this.GetExpTypist();
if(exp!="")
list.Add(exp);
exp=this.GetExpWater();
if(exp!="")
list.Add(exp);
exp=this.GetExpStatus();
if(exp!="")
list.Add(exp);
if(list.Count ==0)
return "";

string[] arry=new String[list.Count];
list.CopyTo(arry,0);
return string.Join(" AND ",arry);
}
这里面的exp=this.GetExpCashier();之类的语句,是这样类似定义的:
public string GetExpTypist()
{
string s1=this.m_EditTypist.Text.Trim();
return (s1=="")?"":string.Format("[Typist]='{0}'",s1);
}
public string GetExpCashier()
{
string s1=this.m_EditCashier.Text.Trim();
return (s1=="")?"":string.Format("[Cashier]='{0}'",s1);
}
public string GetExpOperator()
{
string s1=this.m_EditOperator.Text.Trim();
return (s1=="")?"":string.Format("[Operator]='{0}'",s1);
}
实际上就是把WHERE就是把各文本框生成的条件,最后用AND连接起来,如果文本框生不成条件(就是输入的内容为“”),那么就当这个条件不存在,也不去连接它

doocoo 2006-09-03
  • 打赏
  • 举报
回复
问题是这样的:OLEDB的数据库,不能用@,只能用?来占位,而且还有一些是int类型的参数啊
Dennis_maomao 2006-09-03
  • 打赏
  • 举报
回复
不必那么复杂,其实有简单的方法.
为你每个参数条件都加上这个

... and (name = @name or name = '') and ...

110,538

社区成员

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

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

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