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

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


观点:组合查询在机房中有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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

github常见操作和常见错误!错误提示:fatal: remote origin already exists.

原文链接&#xff1a;http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果输入$ git remote add origin gitgithub.com:djqiang&#xff08;github帐号名&#xff09;/gitdemo&#xff08;项目名&#xff09;.git 提示出错信息&#xff1a;fatal: remote or…

云计算的下半场

经常有人说互联网上下半场的区别&#xff0c;大体上上半场烧钱&#xff0c;下半场分出胜负。自打美团王兴抛出互联网的下半场的说法&#xff0c;大家意识到这不仅仅是新美大的下半场&#xff0c;这更是整个互联网行业的下半场。爆炸式的人口红利带来互联网行业上半场的快速增长…

oracle中的l_satids,请问shared pool中的KQR L PO存放哪些数据

ROW CACHE 也叫做 dictionary cache &#xff0c;缓存数据字典基表如 OBJ$、COL$、IND$、SEQ$的信息以便解析SQL和library cache object。包括 KQR S PO &#xff0c; KQR M PO&#xff0c;KQR L PO &#xff0c; 等KQR > ROW CACHEkqr.h 1323 KSDTRADV("ROW_CACHE&quo…

This task is currently locked by a running workflow and cannot be edited

转自&#xff1a;http://geek.hubkey.com/2007/09/locked-workflow.html 转自&#xff1a;http://blogs.code-counsel.net/Wouter/Lists/Posts/Post.aspx?Listc04a88a9%2Dd138%2D4ac3%2Da2bb%2Db95c9fdd114e&ID118 SPWorkflow.AlertTask()的时候出现“This task is curren…

ETL模型设计

传统的关系数据库一般采用二维数表的形式来表示数据&#xff0c;一个维是行&#xff0c;另一个维是列&#xff0c;行和列的交叉处就是数据元素。关系数据的基础是关系数据库模型&#xff0c;通过标准的SQL语言来加以实现。 数据仓库是多维数据库&#xff0c;它扩展了关系数据库…

《剑指offer》-整数中1出现的次数

题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数&#xff1f;为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的…

This is Me!——回顾第一个项目的前前后后

今天终于把论文敲完了&#xff0c;一路走来&#xff0c;颇多感想。遂写下以下诸多文字&#xff0c;以飨读者。 在说这个项目之前&#xff0c;先简单介绍一下我的经历。我叫王财勇&#xff0c;家是山西的&#xff0c;2009年至2013年在新疆大学就读数学专业&#xff0c;也许有人…

从零开始学JavaScript三(变量)

一、变量 ECMAscript变量是松散型变量&#xff0c;所谓松散型变量&#xff0c;就是变量名称可以保存任何类型的数据&#xff0c;每个变量仅仅是一个用于保存值的占位符。 定义变量时要使用var操作符 如&#xff1a; var message; /*定义一个名为message的变量&#xff0c;该变量…

DES加密过程例解

DES加密算法是最被广泛使用的对称加密算法&#xff0c;通过示例来演示DES、TribleDES&#xff08;3Key&#xff09; DES-ECB&#xff1a; 按8字节为单位进行加密&#xff0c;不足8字节补0key&#xff1a; 1111111111111111indata: 2222222222222222 OutData: 950973182317F8…

linux在双系统中消失了,双系统重新安装windows后,ubuntu选项消失

1、首先用LiveCD进入ubuntu2、打开终端&#xff0c;&#xff0c;输入&#xff1a;fdisk -l 查看自己linux的分区情况&#xff0c;我的分了4个区&#xff0c;swap&#xff0c;boot&#xff0c;/&#xff0c;home&#xff0c;对应的分别是&#xff1a;/dev/sda9 swap…

Cydia源局域网化

2019独角兽企业重金招聘Python工程师标准>>> 步骤 在网址根目录创建文件夹cydia&#xff0c;把你的deb文件放到 cydia/debs/ 文件夹下。在终端cd进入cydia文件夹输入命令&#xff1a;dpkg-scanpackages debs /dev/null > Packages输入命令&#xff1a;tar zcvf P…

前缀++ 后缀++ 运算符重载

下面例子程序中 const Fraction operator (int) 中 int不过是个哑元&#xff08;dummy&#xff09;,是永远用不上的 它只是用来判断&#xff0b;&#xff0b;是prefix 还是 postfix 记住&#xff0c;如果有哑元&#xff0c;则是postfix,否则&#xff0c…

固定资产调整对资产折旧的影响

固定资产折旧计提方法 一、原值增加&#xff1a; 1、已摊销资产&#xff1a; 摊销调整时间设在当期&#xff1a;(1078135) 在进行原值增加后&#xff0c;摊销日期不变时&#xff0c;折旧在当月体现。 每月新增月折旧调增金额*(1-残值率)/(折旧年限*12-已提折旧月份的个数) 例&a…

linux系统中 库分为静态库和,Linux系统静态库与共享库

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;This article mainly introduces the statics library and shared library on Linux and has done some experiments for better comprehension.Static library&am…

软件工程概论作业01

软件工程作业01 写一个能自动生成三十道小学四则运算题目的 “软件”&#xff0c;要求&#xff1a;除了整数以外&#xff0c;还要支持真分数的四则运算&#xff08;需要验证结果的正确性&#xff09;、题目避免重复、可定制出题的数量。 思路&#xff1a;随机生成两个数进行计算…

成员指针运算符 .* 和 -*

转载&#xff1a; http://www.groad.net/bbs/thread-5548-1-1.html 有一种特殊的指针叫做成员指针&#xff0c;它们通常指向一个类的成员&#xff0c;而不是对象中成员的特定实例。 成员指针并不是真正的指针&#xff0c;它只是成员在对象中的偏移量&#xff0c;它们分别是&am…

捕捉Entity framework 6的详细异常提示

采用 try{}catch (Exception e){throw;}不能捕捉到详细异常提示, e.message的内容为"Validation failed for one or more entities. See EntityValidationErrors property for more details." 如果需要获取详细的异常提示,采用 1 try2 {3 return…

8.16——熟悉安装linux系统

一、linux的版本——CentOS CentOS&#xff08;Community ENTerprise Operating System&#xff09;是Linux发行版之一&#xff0c;它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码&#xff0c;因此有些要求高度稳定性的服…

linux中设置默认权限的命令,Linux默认权限掩码

Linux教程Linux教程&#xff1a;http://www.fdlly.com/m/linux文章目录默认权限掩码设置权限掩码以文字的方式设置权限掩码查看系统当前的权限掩码默认权限掩码当我们创建文件或目录时&#xff0c;系统会自动根据权限掩码来生成预设权限&#xff1b;默认情况下的umask值是022(可…

percona-toolkit工具包安装

percona-toolkit工具包同percona-xtrabackup一样都是用Perl写的工具包&#xff0c;percona-toolkit工具包是一组高级的管理mysql的工具包集&#xff0c;可以用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务&#xff0c;在生产环境中能极大的提高效率&#xff0c;安装…