导读:在机房重构中,有好些个查询都是大同小异,最为显著的就是组合查询了。怎样给自己省事儿,相同的东西能不能重复利用,就成了一个现实的问题。第一遍做机房的时候,使用的更多的是:复制+粘贴。学习了设计模式后,可以用模板方法解决。这篇文章,就通过窗体继承和模板方法,实现组合查询。

观点:组合查询在机房中有3中情况,其实,组合查询完全可以看到是一种查询情况。

一、窗体继承的使用


1,首先建立一个父窗体

2,添加一个新项

3,选择继承窗体

4,确定后,一个新的继承窗体就好了。

二、模板方法的使用


备注:定义一个组合查询的实体,方便传参

1,首先在U层写入基础方法和传参

<span style="font-size:18px;">Public Class FrmGroupQueryPublic enGroupQuery As New Model.GroupQueryM  '定义一个实体参数Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles btnQuery.Click'第一行组合关系为空If cmbRelation1.Text = "" Then'判断第一行控件内容是否为空If cmbField1.Text = "" ThenMsgBox("请输入字段名")ElseIf cmbOperation1.Text = "" ThenMsgBox("请输入操作符")ElseIf txtContent1.Text = "" ThenMsgBox("请输入要查询的内容")End IfEnd If' 当第一个组合关系不为空时  If cmbRelation1.Text <> "" ThenIf cmbField1.Text = "" ThenMsgBox("请输入字段名")ElseIf cmbOperation1.Text = "" ThenMsgBox("请输入操作符")ElseIf txtContent1.Text = "" ThenMsgBox("请输入要查询的内容")ElseIf cmbField2.Text = "" ThenMsgBox("请输入字段名")ElseIf cmbOperation2.Text = "" ThenMsgBox("请输入操作符")ElseIf txtContent2.Text = "" ThenMsgBox("请输入要查询的内容")End IfEnd If' 当第二个组合关系不为空时  If cmbRelation2.Text <> "" ThenIf cmbField1.Text = "" ThenMsgBox("请输入字段名")ElseIf cmbOperation1.Text = "" ThenMsgBox("请输入操作符")ElseIf txtContent1.Text = "" ThenMsgBox("请输入要查询的内容")ElseIf cmbField2.Text = "" ThenMsgBox("请输入字段名")ElseIf cmbOperation2.Text = "" ThenMsgBox("请输入操作符")ElseIf txtContent2.Text = "" ThenMsgBox("请输入要查询的内容")ElseIf cmbField3.Text = "" ThenMsgBox("请输入字段名")ElseIf cmbOperation3.Text = "" ThenMsgBox("请输入操作符")ElseIf txtContent3.Text = "" ThenMsgBox("请输入要查询的内容")End IfEnd If'给实体层传参Dim enGroupQuery As New Model.GroupQueryMenGroupQuery._field1 = GetDBName(cmbField1.Text.Trim())enGroupQuery._field2 = GetDBName(cmbField2.Text.Trim())enGroupQuery._field3 = GetDBName(cmbField3.Text.Trim())enGroupQuery._operate1 = cmbOperation1.Text.Trim()enGroupQuery._operate2 = cmbOperation2.Text.Trim()enGroupQuery._operate3 = cmbOperation3.Text.Trim()enGroupQuery._content1 = txtContent1.Text.Trim()enGroupQuery._content2 = txtContent2.Text.Trim()enGroupQuery._content3 = txtContent3.Text.Trim()enGroupQuery._relation1 = GetDBName(cmbRelation1.Text.Trim())enGroupQuery._relation2 = GetDBName(cmbRelation2.Text.Trim())enGroupQuery.GetTable = GetTable() '通过函数的返回值给参数赋值'给B层GroupQuery方法传递参数Dim FGroupQuery As New Facade.GroupQuertFADim table As DataTabletable = FGroupQuery.GroupQuery(enGroupQuery)If table.Rows.Count = 0 ThenMsgBox("没有记录,请重新设置查询条件", vbOKOnly, vbExclamation)DataGridView1.DataSource = NothingElseDataGridView1.DataSource = FGroupQuery.GroupQuery(enGroupQuery)End IfEnd Sub' 定义虚函数GetDBName,获取不同数据库的字段名  Protected Overridable Function GetDBName(ByVal control As String) As StringReturn ""End Function' 定义虚函数GetDBName,获取不同数据库的表名  Protected Overridable Function GetTable() As StringReturn ""End FunctionPrivate Sub Button2_Click_1(sender As Object, e As EventArgs) Handles btnExit.ClickMe.Close()End Sub'组合关系一不为空后,显示第二行查询条件Private Sub cmbRelation1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbRelation1.SelectedIndexChangedcmbField2.Enabled = TruecmbOperation2.Enabled = TruecmbRelation2.Enabled = TruetxtContent2.Enabled = TrueEnd Sub'组合关系二不为空后,显示第三行查询条件Private Sub cmbRelation2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbRelation2.SelectedIndexChangedcmbField3.Enabled = TruecmbOperation3.Enabled = TruetxtContent3.Enabled = TrueEnd SubEnd Class</span>

2,在B层,对D层数据库的查询结果做出处理

<span style="font-size:18px;">Imports Charge.IDAL
Imports Charge.Model
Public Class GroupQueryBLL''' <summary>''' 根据组合查询D层的返回结果,判断是否有值''' </summary>''' <param name="enGroupQuery"></param>''' <returns>没有值,不返回任何东西,有,就返回信息</returns>''' <remarks></remarks>Public Function GroupQueryStudent(ByVal enGroupQuery As Model.GroupQueryM) As DataTableDim factory As New Factory.CreateFactoryDim IGroupQuery As IGroupQuery = factory.CreateGroupQueryDim table As DataTable = IGroupQuery.GroupQuery(enGroupQuery)'检查D层返回的数据表中是否有数据If table.Rows.Count = 0 ThenReturn NothingElseReturn tableEnd IfEnd Function
End Class</span>

3,在D层对数据进行查询

<span style="font-size:18px;">/**********************************************
'类名:SQLGroupQuery
'命名空间:ChargeDAL
'创建时间:2015/1/5 20:58:39
'创建人:HXX
'修改时间:
'修改人:
'版本号:4.0.30319.18449
'说明:实现组合条件的
'版权:HHX
'/**********************************************
Imports System.Data.SqlClient
Imports System.Data
Imports ChargePublic Class SQLGroupQuery : Implements IDAL.IGroupQuery''' <summary>''' 根据设置的条件,进行信息查询''' </summary>''' <param name="enGroupQuery"></param>''' <returns>返回查询结果信息的集合</returns>Public Function GroupQuery(enGroupQuery As Model.GroupQueryM) As DataTable Implements IDAL.IGroupQuery.GroupQueryDim strSQL As String = "QueryGroup" '调用存储过程  Dim prams As SqlParameter() = {New SqlParameter("@cmbField1", enGroupQuery._field1),New SqlParameter("@cmbField2", enGroupQuery._field2),New SqlParameter("@cmbField3", enGroupQuery._field3),New SqlParameter("@cmbOperation1", enGroupQuery._operate1),New SqlParameter("@cmbOperation2", enGroupQuery._operate2),New SqlParameter("@cmbOperation3", enGroupQuery._operate3),New SqlParameter("@txtContent1", enGroupQuery._content1),New SqlParameter("@txtContent2", enGroupQuery._content2),New SqlParameter("@txtContent3", enGroupQuery._content3),New SqlParameter("@cmbRelation1", enGroupQuery._relation1),New SqlParameter("@cmbRelation2", enGroupQuery._relation2),New SqlParameter("@tableName", enGroupQuery.GetTable)} '设置参数Dim MyHelper As New SqlHelperDim table As New DataTabletable = MyHelper.ExecSelect(strSQL, CommandType.StoredProcedure, prams)Return tableEnd Function
End Class</span>

三、在继承窗体中的应用


在继承窗体中,需要重写模板父窗体中的方法,关键点有:字段的转换,数据表的返回。

<span style="font-size:18px;">  Private Sub FrmOperateWorkLog_Activated(sender As Object, e As EventArgs) Handles Me.Activated'避免一个窗体多次打开,或者打开多个操作窗体Dim frm As Form'遍历打开了的每一个窗体For Each frm In Application.OpenForms'如果当前窗体不是主窗体或者没有被打开过If frm.Name <> Me.Name And frm.Name <> FrmMain.Name And frm.Name <> FrmLine.Name Then'其他打开的窗体最小化frm.WindowState = 1End IfNextEnd SubPrivate Sub FrmMaintainInfo_Load(sender As Object, e As EventArgs) Handles MyBase.Load'给字段赋值cmbField1.Items.AddRange({"教师", "注册日期", "注册时间", "注销日期", "注销时间", "机器名"})cmbField2.Items.AddRange({"教师", "注册日期", "注册时间", "注销日期", "注销时间", "机器名"})cmbField3.Items.AddRange({"教师", "注册日期", "注册时间", "注销日期", "注销时间", "机器名"})cmbOperation1.Items.AddRange({"=", "<", ">", "<>"})cmbOperation2.Items.AddRange({"=", "<", ">", "<>"})cmbOperation3.Items.AddRange({"=", "<", ">", "<>"})cmbRelation1.Items.AddRange({"与", "或"})cmbRelation2.Items.AddRange({"与", "或"})End Sub'重写获得表名方法Protected Overrides Function GetTable() As StringenGroupQuery.GetTable = "TC_WorkLogInfo"Return enGroupQuery.GetTable()End Function'重写转换成数据库字段方法Protected Overrides Function GetDBName(control As String) As StringSelect Case (control)Case "教师"Return "UserID"Case "注册时间"Return "OnTime"Case "注册日期"Return "OnDate"Case "注销时间"Return "OffTime"Case "注销日期"Return "OffDate"Case "机器名"Return "Computer"Case "或"Return "or"Case "与"Return "and"Case ElseReturn ""End SelectEnd Function
End Class
</span>

到这里,利用窗体继承和模板方法进行组合查询就算是实现了。


四、应用说明
1,这里的返回类型都是DataTable,如果将其换为List,则就没有这么简单了。还需要多写一步(存储过程中),就像返回查询表格的参数一样,将查询表格的参数写到List中的表。
2,这里D层的查询是通过调用的存储过程,对存储过程的使用和理解,将在下一篇博客中详细说明。不过,在这里可以替换成一种类型,就像是第一次做机房时那样。例(第一次机房中):

<span style="font-size:18px;">txtSQL = txtSQL & tiaojian(Trim(cobozd1(0).Text)) & Trim(cobocz1(0).Text) & "'" & Trim(txtnr1.Text) & "'" _& " and " _& tiaojian(Trim(cobozd1(1).Text)) & Trim(cobocz1(1).Text) & " '" & Trim(txtnr2.Text) & "'" _& " and " _& tiaojian(Trim(cobozd1(2).Text)) & Trim(cobocz1(2).Text) & " '" & Trim(txtnr3.Text) & "'"</span>

在这里,也可以将存储过程,换成一般的文本类型查询。因为是应用的参数赋值,使用字符拼接的方式,将组合查询的三个情况看做是一种情况,也是可行的。

五、个人感想


学以致用,学了还要会用才行。刚开始学了设计模式的时候,真的感受不大。但用上了之后,真的觉得很方便。只是在用的过程中有点艰难,不过,把一个个的问题解决了,最后实现了,感觉真的很良好。

转载于:https://www.cnblogs.com/hhx626/p/6010455.html

.NET重构(四):窗体继承+模板方法,完美实现组合查询相关推荐

  1. 模板方法模式实现组合查询

    1.前提 1.模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 2.组合方法 之前写过一篇博客,讲述实现任意 ...

  2. 数据库第四次试验:数据库的组合查询、统计查询及视图

    数据库第四次试验:数据库的组合查询.统计查询及视图 前言 一.实验目的 二.实验要求 三.实验原理.方法和手段 四.实验组织运行要求 五.实验条件 六.实验步骤 七.思考题 八.实验报告 九.其他说明 ...

  3. 继承窗体搭建组合查询模板方法的幸福之家

            窗外寒冬有了春的温暖,过了立春还在北国,总觉得已过春节,实际迟迟未到.         继承窗体做了组合查询与模板方法的红娘,搭建了幸福之间.期盼着春节列车红娘,只想做南方过客的&qu ...

  4. windows窗体继承问题

    窗体继承什么时候用的到呢?当我们使用三层架构来编写我们的cs程序时,我们的U层大部分是windows窗体.这个时候如果我们有一些公共变量,或者是一个窗体需要使用另一个窗体的数据.或者是有一些用于判断的 ...

  5. C++类的使用(四)—— 继承

    一.继承 有时候,我们想要写一个类实现某些功能,但又想同时具备另一个类的功能,这个时候,我就要用到类的第二大特点--继承 class ClassA {public:ClassA(int x):_x(x ...

  6. 数字加字母文件 服务器,unraid服务器all in one 篇四:1秒钟完美解决jellyfin字幕乱码...

    unraid服务器all in one 篇四:1秒钟完美解决jellyfin字幕乱码 2020-07-14 10:57:29 18点赞 98收藏 17评论 先说最简单的方法,就是把镜像从linuxse ...

  7. [VB.NET]单元四 窗体编程

    单元四 窗体编程 <script type="text/javascript"></script> <script type="text/j ...

  8. delphi bpl包窗体继承

    1. BPL手工修改窗体继承时,怎样让其父类的所有控件显示(在设计时)? 在包文件上点击鼠标右键 bplxiexingBom.bpl -> AddNew -> VclForm,新建一个fo ...

  9. 接口【四】继承父类并实现多个接口

    接口[四]继承父类并实现多个接口 继承父类接口 接口间的多继承 继承父类接口 使用接口时需要注意: 1.接口没有静态代码块或者构造方法的. 先创建一个接口 public interface MyInt ...

最新文章

  1. usaco Controlling Companies
  2. Call to undefined function Workerman\posix_getpid
  3. VCL界面控件DevExpress VCL Controls发布v18.2.5|附下载
  4. MySQL修改字段的排列位置
  5. 并行开发 —— 第三篇 plinq的使用
  6. netbeans ide_IDE:5个最喜欢的NetBeans功能
  7. The command ‘/bin/sh -c apt-get install -y vim’ returned a non-zzero code: 100
  8. BZOJ - 2783 树
  9. 配置nginx作为下载站点
  10. 华三交换机配置基础及讲解
  11. Excel双样本T检验之异方差检验
  12. 变量的作用域与生命周期
  13. SoftICE初使用
  14. 计算机毕业设计java+jsp报刊订阅信息网站(源码+系统+mysql数据库+Lw文档)
  15. TANGENT_SPACE_ROTATION的解释
  16. You can find the Nike LeBron Soldier 11 now at kd10sale.com
  17. android 定时截图,这款 APP 让我每天都忍不住想发截图!
  18. 关于word插入题注“题注或页码中不含章节号”错误提示
  19. android4.2屏幕录像,android——使用自带录屏工具进行屏幕录像
  20. 统计案例 | 系列文章合集

热门文章

  1. Marvell 88E1111 linux driver
  2. “城迷”:黑白梦与精神逃离
  3. java 堆内存分析_JVM内存堆布局图解分析
  4. c++ map是有序还是无序的_c++ unorder_map的用法
  5. 依据imu姿态角计算z轴倾角_1. 姿态的表示方法
  6. python 工资管理软件_基于[Python]的员工管理系统
  7. android home键后计时拉起app_使用React Native完成App软件
  8. 2.1对 特征归一化 的一些理解
  9. sublime 设置自动换行
  10. android数据的五种存储方式