借鉴别人的(查询其实也很简单)
2008-08-24 23:46
225 查看
还是要先说一下范围:以数据库为主的程序,b/s结构。
查询嘛,对于我来说就是SQL语句 where 后面(group、order by 前面的)的内容,把这搞定了,查询也就搞定了。
查询的分类,借鉴运算符里的一个术语,我把查询分成了四类:单目查询、双目查询、多目查询、特殊查询。
一、单目查询:
1、col = 1; //数字类型的相等的查询
2、col = 'abc'; //字符串类型的相等的查询
3、col like '%abc%'; //字符串的模糊查询
4、col like 'abc%';
5、col like '%abc';
6、col like 'abc'; //好像没有用
7、col > 10; //数字类型的大于、小于的查询
8、col < 10;
9、col >= 10;
10、col <= 10;
单目查询基本就是这些了,如果还有其他的,欢迎补充,谢谢。
二、双目查询:
1、col between '1900-1-1' and '1901-1-1'; //主要用于时间段的查询。
2、col between 1 and 10; //数字类型的范围查询。
3、col > 1 and col <=10; //数字类型的范围查询。
4、col >= 1 and col < 10; //数字类型的范围查询。
5、col > 1 and col < 10; //数字类型的范围查询。
单目查询能想到的就是这些了,如果还有其他的,欢迎补充,谢谢。
三、多目查询:
1、col in (1,2,3); //多条件数字类型的or查询。比如,同时显示研发部和业务部的员工。
2、col in ('1','2','3'); //多条件字符串类型的or查询。
这个呢,表面上看是多目,但是由于一般会采用ChekcBoxList控件,所以呢会直接得到 "1,2,3"这样的值,所以又有点像单目查询,但是处理方式上有些不同。
四、特殊查询:
1、col is null; //查找为null的数据
2、col is not null; //查找不为null的数据
3、col in (select ID from table1 where ...); //子查询
其他,这里呢情况就很多了,对于这种情况就需要使用委托(事件、钩子),交给调用查询控件的部分来处理了。
前三种情况交给查询控件自己处理,第四种情况就要“委托”给别人了,这样即可以保证使用简单,又可以保证灵活性。那么代码怎么实现呢?就是说上面的这些情况怎么抽象出来呢?很简单,利用Dictionary来做。
我们定义一个Dictionary来存放“查询方式”。
public static Dictionary<Int32, string> SearchKind = new Dictionary<Int32, string>();
我们来制定一个编号来作为key值,我们可以规定 1-99表示单目查询;101-199表示双目查询;201-299表示多目查询;301表示特殊查询。然后我们填充Dictionary
Code
public string GetSearchWhere()
{
System.Text.StringBuilder sql = new StringBuilder(1000);
sql.Append(" 1=1 ");
//提取用户输入的信息
GetInputValue();
BaseColumnsInfo bInfo;
foreach (KeyValuePair<int, BaseColumnsInfo> info in dic_BaseCols)
{
//根据查询条件,拼接SQL语句。
bInfo = (BaseColumnsInfo)info.Value;
if (bInfo.DataValue.Length > 0 && bInfo.DataValue != "-3")
{
sql.Append(" and ");
if (bInfo.FindKind < 100)
{
//单目查询
sql.Append(String.Format(SearchKind[bInfo.FindKind], bInfo.ColSysName, bInfo.DataValue));
}
else if (bInfo.FindKind < 200)
{
//双目查询
string[] str = bInfo.DataValue.Split('`');
if (str.Length >= 2)
sql.Append(String.Format(SearchKind[bInfo.FindKind], bInfo.ColSysName, str[0], str[1]));
}
else if (bInfo.FindKind < 300)
{
//多目查询
string query2 = bInfo.DataValue;
if (bInfo.FindKind == 302)
query2 = query2.Replace(",", "','");
sql.Append(String.Format(SearchKind[bInfo.FindKind], bInfo.ColSysName , query2));
}
//特殊查询不处理
}
}
return sql.ToString();
}
我没有使用实体类,所以也不知道使用实体类的方式如何来实现查询,所以呢,目前只是针对SQL语句来做查询功能,得到了SQL语句(where后面的),也就达到了我的目的。
说了这么多,好像有点晕,我想让查询控件做下面几件事情:
1、绘制UI,就是自动添加文本框的控件。
2、布局,多行多列的方式显示。
3、提取用户输入的数据。
4、根据查询方式拼接成SQL语句。
其中前三条和表单控件一样,所以就抽出来一个基类BaseForm,在BaseForm里面实现,查询控件只实现第四条就可以了。
源代码下载,代码还比较粗糙,没有整理,还有一些不合理的地方。我想先把搭架子搭建起来,然后在完善细节。
查询嘛,对于我来说就是SQL语句 where 后面(group、order by 前面的)的内容,把这搞定了,查询也就搞定了。
查询的分类,借鉴运算符里的一个术语,我把查询分成了四类:单目查询、双目查询、多目查询、特殊查询。
一、单目查询:
1、col = 1; //数字类型的相等的查询
2、col = 'abc'; //字符串类型的相等的查询
3、col like '%abc%'; //字符串的模糊查询
4、col like 'abc%';
5、col like '%abc';
6、col like 'abc'; //好像没有用
7、col > 10; //数字类型的大于、小于的查询
8、col < 10;
9、col >= 10;
10、col <= 10;
单目查询基本就是这些了,如果还有其他的,欢迎补充,谢谢。
二、双目查询:
1、col between '1900-1-1' and '1901-1-1'; //主要用于时间段的查询。
2、col between 1 and 10; //数字类型的范围查询。
3、col > 1 and col <=10; //数字类型的范围查询。
4、col >= 1 and col < 10; //数字类型的范围查询。
5、col > 1 and col < 10; //数字类型的范围查询。
单目查询能想到的就是这些了,如果还有其他的,欢迎补充,谢谢。
三、多目查询:
1、col in (1,2,3); //多条件数字类型的or查询。比如,同时显示研发部和业务部的员工。
2、col in ('1','2','3'); //多条件字符串类型的or查询。
这个呢,表面上看是多目,但是由于一般会采用ChekcBoxList控件,所以呢会直接得到 "1,2,3"这样的值,所以又有点像单目查询,但是处理方式上有些不同。
四、特殊查询:
1、col is null; //查找为null的数据
2、col is not null; //查找不为null的数据
3、col in (select ID from table1 where ...); //子查询
其他,这里呢情况就很多了,对于这种情况就需要使用委托(事件、钩子),交给调用查询控件的部分来处理了。
前三种情况交给查询控件自己处理,第四种情况就要“委托”给别人了,这样即可以保证使用简单,又可以保证灵活性。那么代码怎么实现呢?就是说上面的这些情况怎么抽象出来呢?很简单,利用Dictionary来做。
我们定义一个Dictionary来存放“查询方式”。
public static Dictionary<Int32, string> SearchKind = new Dictionary<Int32, string>();
我们来制定一个编号来作为key值,我们可以规定 1-99表示单目查询;101-199表示双目查询;201-299表示多目查询;301表示特殊查询。然后我们填充Dictionary
Code
public string GetSearchWhere()
{
System.Text.StringBuilder sql = new StringBuilder(1000);
sql.Append(" 1=1 ");
//提取用户输入的信息
GetInputValue();
BaseColumnsInfo bInfo;
foreach (KeyValuePair<int, BaseColumnsInfo> info in dic_BaseCols)
{
//根据查询条件,拼接SQL语句。
bInfo = (BaseColumnsInfo)info.Value;
if (bInfo.DataValue.Length > 0 && bInfo.DataValue != "-3")
{
sql.Append(" and ");
if (bInfo.FindKind < 100)
{
//单目查询
sql.Append(String.Format(SearchKind[bInfo.FindKind], bInfo.ColSysName, bInfo.DataValue));
}
else if (bInfo.FindKind < 200)
{
//双目查询
string[] str = bInfo.DataValue.Split('`');
if (str.Length >= 2)
sql.Append(String.Format(SearchKind[bInfo.FindKind], bInfo.ColSysName, str[0], str[1]));
}
else if (bInfo.FindKind < 300)
{
//多目查询
string query2 = bInfo.DataValue;
if (bInfo.FindKind == 302)
query2 = query2.Replace(",", "','");
sql.Append(String.Format(SearchKind[bInfo.FindKind], bInfo.ColSysName , query2));
}
//特殊查询不处理
}
}
return sql.ToString();
}
我没有使用实体类,所以也不知道使用实体类的方式如何来实现查询,所以呢,目前只是针对SQL语句来做查询功能,得到了SQL语句(where后面的),也就达到了我的目的。
说了这么多,好像有点晕,我想让查询控件做下面几件事情:
1、绘制UI,就是自动添加文本框的控件。
2、布局,多行多列的方式显示。
3、提取用户输入的数据。
4、根据查询方式拼接成SQL语句。
其中前三条和表单控件一样,所以就抽出来一个基类BaseForm,在BaseForm里面实现,查询控件只实现第四条就可以了。
源代码下载,代码还比较粗糙,没有整理,还有一些不合理的地方。我想先把搭架子搭建起来,然后在完善细节。
相关文章推荐
- 我的第十个java程序--(其实是修改别人的web代码{springmvc+mybatis},知道了原理后其实一切都变的很简单)
- CD转换高品质MP3,其实也可以很简单
- 幸福其实很简单
- Qt多线程和GUI界面假死(分析QThread::exec函数的源码,旧的QMutexLocker方法其实很好用,挡住别人进入抢占资源)
- LinuxGPIO驱动使用其实很简单
- 其实Unix很简单
- Notes文档查询的研究(摘自别人的总结)
- java获取客户端ip 及通过ip获取mac地址后台代码(借鉴别人)
- SQL Server 查询表的记录数(3种方法,推荐第一种)--来自别人的博客
- 其实API的学习很简单
- 其实Unix很简单
- 经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已~~主要是:ceil,floor,round,intval
- 素数之年,IT运维其实可以很简单 推荐
- 幸福其实很简单
- ConstraintLayout其实很简单
- 其实实现梦想很简单,不要放弃不要迷茫
- MySQL入门很简单-学习笔记 - 第10章 查询数据
- 其实UNIX很简单
- 其实Unix很简单
- IOS多线程开发其实很简单