表单控件的副产品——查询控件
查询控件
当初在写表单控件的时候,突然想到,这个表单控件稍微修改一下不就是一个查询控件了吗?
那么查询控件需要做的什么事情呢? 1、自己描绘控件,比如能够自己添加文本框、下拉列表框这一类的控件。 2、可以自己获取用户输入的信息,根据查询方式组合where 后面的 SQL语句 。
是不是和表单控件很像呢?
在表单控件的SaveData()里面我们可以得到字段名称和对应的用户输入的信息,那么我们就可以写成这种方式。
for (int i = 0; i < info.Length; i++)
{
iCntl = this.FindControl("c_" + info[i].ColSysName) as IGetControlValue;
if (iCntl != null)
query = ColSysName + "like '%" + iCntl.GetControlValue() + "%'";
}
当然并不是所有的查询都是只用 like 就可以搞定的,这里需要一个查询方式的属性,于是我们可以扩展一下ControlInfos 加一个属性(FindKind),用来记录查询方式。
然后根据这个属性,我们就可以来组合SQL语句了,准确的说是where 后面的SQL语句。目前的方法还是需要使用case 。
string str = iCntl.GetControlValue()
switch ( infos[i].FindKind)
{
case 1:
if (DoubleType.FromString(inputInfo[i]) != 0.0)
{
str2 = " [" + info[i].ColSysName + "]=" + str;
}
goto Label_0615;
case 2:
str2 = " [" + info[i].ColSysName + "]='" + str + "'";
goto Label_0615;
case 3:
str2 = " [" + info[i].ColSysName + "] like '%" + str + "%'";
goto Label_0615;
case 4:
str2 = " [" + info[i].ColSysName + "] like '" + str + "%'";
goto Label_0615;
case 5:
str2 = " [" + info[i].ColSysName + "] like '%" + str + "'";
goto Label_0615;
case 6:
str2 = " [" + info[i].ColSysName + "] like '" + str + "'";
goto Label_0615;
case 11:
str2 = " [" + info[i].ColSysName + "]>'" + str + "'";
goto Label_0615;
case 12:
str2 = " [" + info[i].ColSysName + "]<'" +str + "'";
goto Label_0615;
case 13:
str2 = " [" + info[i].ColSysName + "]>='" +str + "'";
goto Label_0615;
case 14:
str2 = " [" + info[i].ColSysName + "]<='" + str + "'";
goto Label_0615;
case 0x15:
strArray3 = inputInfo[i].Split(new char[] { '|' });
if (strArray3[0].Length != 0)
{
goto Label_04B1;
}
str2 = "";
goto Label_0615;
case 0x16:
strArray2 = inputInfo[i].Split(new char[] { '|' });
if (strArray2[0].Length != 0)
{
break;
}
str2 = "";
goto Label_0615;
case 0x17:
str3 = inputInfo[i].Replace("|", ",");
if (str3.Length != 0)
{
goto Label_0549;
}
str2 = "";
goto Label_0615;
case 0x18:
str4 = inputInfo[i].Replace(",", "','").Replace("|", "','");
if (str4.Length != 0)
{
goto Label_05CA;
}
str2 = "";
goto Label_0615;
case 30:
str2 = "";
goto Label_0615;
default:
goto Label_0615;
}
不好意思,原来使用vb.net来写的,这个是用Reflector反编译的,不知道为什么还给弄出来goto了。看来我写的代码不用混淆也可以了,我自己都看不懂了。还是发一个“原版”的吧。
Private Sub btn_click(ByVal Sender As Object, ByVal E As EventArgs)
'MyBase.Context.Response.Write("内部事件<BR>")
Dim colInfo() As ColumnsInfo = _Col.SetColumnsInfos()
Dim inputInfo() As String = _Col.GetInputInfo
If inputInfo Is Nothing Then
System.Web.HttpContext.Current.Response.Write("_") '没有输入,或者输入有误!
Return
End If
'调用外部事件——查询前
OnBtnClick(Sender, E)
'字段的查询方式。1:= int;2:=string; 3:like %n%; 4:like n%; 5:like %n ;6:like n;11:> string;12:< string;13:>= string;14: <= string
Dim find As String = ""
Dim tmp As String = ""
Dim i As Int32
For i = To colInfo.Length -
If inputInfo(i).Length > And inputInfo(i) <> "-999999" And inputInfo(i) <> "_n_" Then
'输入了信息,组成查询条件
Select Case colInfo(i).SearchKind
Case '= int
If inputInfo(i) <> Then
tmp = " [" & colInfo(i).ColSysName & "]=" & inputInfo(i)
End If
Case '= string
tmp = " [" & colInfo(i).ColSysName & "]='" & inputInfo(i) & "'"
Case 'like %n%
tmp = " [" & colInfo(i).ColSysName & "] like '%" & inputInfo(i) & "%'"
Case 'like n%
tmp = " [" & colInfo(i).ColSysName & "] like '" & inputInfo(i) & "%'"
Case 'like %n
tmp = " [" & colInfo(i).ColSysName & "] like '%" & inputInfo(i) & "'"
Case 'like n
tmp = " [" & colInfo(i).ColSysName & "] like '" & inputInfo(i) & "'"
Case '> string
tmp = " [" & colInfo(i).ColSysName & "]>'" & inputInfo(i) & "'"
Case '< string
tmp = " [" & colInfo(i).ColSysName & "]<'" & inputInfo(i) & "'"
Case '>= string
tmp = " [" & colInfo(i).ColSysName & "]>='" & inputInfo(i) & "'"
Case '<= string
tmp = " [" & colInfo(i).ColSysName & "]<='" & inputInfo(i) & "'"
Case 'between int
Dim aa() As String = inputInfo(i).Split("|")
If aa().Length = Then
tmp = ""
Else
If aa().Length = Then
aa() = aa()
End If
tmp = " [" & colInfo(i).ColSysName & "] between " & aa() & " and " & aa()
End If
Case 'between string
Dim aa() As String = inputInfo(i).Split("|")
If aa().Length = Then
tmp = ""
Else
If aa().Length = Then
aa() = aa()
End If
tmp = " [" & colInfo(i).ColSysName & "] between '" & aa() & "' and '" & aa() & "'"
End If
Case 'col in () 多选查询 数字方式
Dim a23 As String = inputInfo(i).Replace("|", ",")
'System.Web.HttpContext.Current.Response.Write(a23)
If a23.Length = Then
tmp = ""
Else
tmp = " [" & colInfo(i).ColSysName & "] in (" & a23 & ")"
End If
Case 'col in () 多选查询 字符串方式
Dim a23 As String = inputInfo(i).Replace(",", "','")
a23 = a23.Replace("|", "','")
'System.Web.HttpContext.Current.Response.Write(a23)
If a23.Length = Then
tmp = ""
Else
tmp = " [" & colInfo(i).ColSysName & "] in ('" & a23 & "')"
End If
Case '不生成查询条件
tmp = ""
End Select
'加到查询条件里面
If tmp.Length > Then
If find.Length > Then
find &= " and " & tmp
Else
find = tmp
End If
End If
End If
tmp = ""
Next
If _OutSearch.Length > Then
'有外部的查询条件,加到 find 里面
If find.Length > Then
find = find & " and " & _OutSearch
Else
find = _OutSearch
End If
End If
'System.Web.HttpContext.Current.Response.Write(find)
If Not _PageTurn Is Nothing Then
If _PageTurn.SetQuery.Length = Then
_PageTurn.SqlQuery = find
Else
If find.Length = Then
_PageTurn.SqlQuery = _PageTurn.SetQuery
Else
_PageTurn.SqlQuery = _PageTurn.SetQuery & " and " & find
End If
End If
_Search = find
_PageTurn.SqlQuery = find
_PageTurn.CreateQuery()
_PageTurn.BindFirstPage()
End If
End Sub
#End Region
当然这里有一个适用范围和习惯的问题。我是习惯使用DataTable来装载数据,而填充 DataTable 需要SQL语句,那么我只需要得到 where 后面的部分,查询的功能就可以实现了,所以对于我来说,查询控件能够输出像 "myName like '%jyk%'" 这样的字符串就已经够用了。 还记得分页控件吗?分页控件有一个属性:myPage.SqlQuery = "";这个属性就是用来给分页控件设置查询条件的,正好可以查询控件对应上,这两个控件一配合起来,查询、分页就变得非常的简单了。
对其他的查询方式的支持的考虑 我没有用过使用实体类来显示数据的方式,所以也不知道对于实体类来说,查询是怎么做的,不过这个查询控件至少可以提供字段名和对应的值,应该是可以用得上的吧。
可能有些人喜欢使用存储过程来返回记录,查询条件也会写在存储过程里面,那么在调用存储过程的时候需要传递存储过程的参数,这种情况,查询控件也可以帮上点忙吧。
抽象 这样出现了一个问题,由于两个控件比较象,但是总不能等表单控件写好了,然后复制粘贴,再改一改,查询控件就诞生了吧。我们是不是应该对于相同的地方进行“抽象”呢,把相同的代码放在基类里面。可能你会说,就两种情况,有必要抽象吗,还弄一个基类出来是不是多此一举呢?我的回答是:很有必要。除非这两个控件件写完了之后就再也不需要修改了。
只是单独写很好写,不用顾忌其他,但是要考虑到其他的用法的话,那就要十分小心了。
- 比特币退伍后,币圈新宠以特币,踏上了高端市场的远征之路
- 性能测试之gatling详解
- PHP中用PDO查询Mysql来避免SQL注入风险的方法
- 如果你再单身100年,你可能就会有一位机器人女友与你结婚生子
- 域名peza.com结拍 持有者身份未明
- 不用@微信官方,教你写头像戴圣诞帽的程序
- 云数据-欲练神功必先写文档
- ALM损坏后的恢复步骤
- 2020年180万人将被人工智能取代 制造业首当其冲
- SEO之404页面应该怎么做?
- AI到底是个什么鬼?
- Python数据挖掘学习路线是什么?学习Python学什么?
- 人脸智慧时尚店落地广深,微信支付赋能智慧零售
- 基层医疗破局关键:从医疗SaaS三大未来趋势说起
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 63. Vue MUI的基本使用
- 初学web自动化测试--笔记1
- R语言作图——Line plot with error
- Python自学成才之路 玩转虚拟环境
- 基于腾讯云的 Rust 和 WebAssembly 函数即服务
- 谷歌开源NLP模型可视化工具LIT,模型训练不再「黑箱」
- Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案
- 社区开源框架预制件相关模块:CollectManager详解
- Kettle构建Hadoop ETL实践(三):Kettle对Hadoop的支持
- 3种 Springboot 全局时间格式化方式,别再写重复代码了
- 一文搞懂CDN加速原理
- 3分钟短文:Laravel Carbon自定义日期时间格式
- (30)字符截取命令sed
- 2. Bean Validation声明式校验方法的参数、返回值
- 如何识别和阻止基于电报的僵尸网络