历经n多天。组合查询模板最终做完了,总结一下这几天的成果。和大家一起学习交流。

先看一下父窗口的关键代码:

父窗口代码:

Public Class frmComboQueryProtected Overridable Sub frmComboQuery_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim ComboxArray(4) As ComboBox            '定义控件数组,获取组合框ComboxArray(0) = cboOperator1ComboxArray(1) = cboOperator2ComboxArray(2) = cboOperator3ComboxArray(3) = cboRelation1ComboxArray(4) = cboRelation2CommonMethod.SelectIndex(ComboxArray)           '设置combox默认显示第一项Dim ControlArray(6) As Control            '定义控件数组,获取组合2和组合3的控件ControlArray(0) = cboField2ControlArray(1) = cboOperator2ControlArray(2) = txtContent2ControlArray(3) = cboRelation2ControlArray(4) = cboField3ControlArray(5) = cboOperator3ControlArray(6) = txtContent3CommonMethod.LockControlArray(ControlArray)        '调用共同拥有方法,锁定控件End SubPrivate Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.ClickTryDim ControlArray(2) As Control             '定义控件数组,获取组合1的控件ControlArray(0) = cboField1ControlArray(1) = cboOperator1ControlArray(2) = txtContent1If CommonMethod.IsEmptyControlArray(ControlArray) = False Then           '推断组合1的控件是否为空Exit SubEnd IfIf cboRelation1.Text.Trim <> "<请选择>" Then                '组合关系1不为空时ControlArray(0) = cboField2                   '获取组合2的控件ControlArray(1) = cboOperator2ControlArray(2) = txtContent2If CommonMethod.IsEmptyControlArray(ControlArray) = False Then      '推断组合2的条件是否为空Exit SubEnd IfIf cboRelation2.Text.Trim <> "<请选择>" Then                 '组合关系2不为空时ControlArray(0) = cboField3                     '获取组合3的控件ControlArray(1) = cboOperator3ControlArray(2) = txtContent3If CommonMethod.IsEmptyControlArray(ControlArray) = False Then     '推断组合3的条件是否为空Exit SubEnd IfEnd IfEnd IfDim eComboQuery1 As New Entity.ComboQueryEntity       '定义组合查询实体,将条件传入实体eComboQuery1.dbName = GetdbName()eComboQuery1.Field1 = cboField1.Text.TrimeComboQuery1.Field2 = cboField2.Text.TrimeComboQuery1.Field3 = cboField3.Text.TrimeComboQuery1.Operator1 = cboOperator1.Text.TrimeComboQuery1.Operator2 = cboOperator2.Text.TrimeComboQuery1.Operator3 = cboOperator3.Text.TrimeComboQuery1.Content1 = txtContent1.Text.TrimeComboQuery1.Content2 = txtContent2.Text.TrimeComboQuery1.Content3 = txtContent3.Text.TrimeComboQuery1.Relation1 = cboRelation1.Text.TrimeComboQuery1.Relation2 = cboRelation2.Text.TrimDim dtComboQuery As New DataTableDim mgr As New BLL.ComboQueryBLLdtComboQuery = mgr.ComboQuery(eComboQuery1)dgvRecord.DataSource = dtComboQueryCatch ex As ExceptionMessageBox.Show(ex.Message.ToString())dgvRecord.DataSource = NothingEnd TryEnd SubProtected Overridable Function GetdbName() As StringReturn ""End FunctionPrivate Sub cboRelation1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelation1.SelectedIndexChangedDim ControlArray(3) As Control                   '定义控件数组。获取组合2的控件和组合关系2的控件,ControlArray(0) = cboField2ControlArray(1) = cboOperator2ControlArray(2) = txtContent2ControlArray(3) = cboRelation2If cboRelation1.SelectedIndex = 0 Then               '假设组合关系1为空,清空组合2和组合关系2CommonMethod.ClearControlArray(ControlArray)CommonMethod.LockControlArray(ControlArray)ElseCommonMethod.UnLockControlArray(ControlArray)                 '否则。解锁组合2和组合关系2End IfEnd SubPrivate Sub cboRelation2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelation2.SelectedIndexChangedDim ControlArray(2) As Control                   '定义控件数组,获取组合3的控件ControlArray(0) = cboField3ControlArray(1) = cboOperator3ControlArray(2) = txtContent3If cboRelation2.SelectedIndex = 0 Then               '假设组合关系2为空。清空组合2。锁定组合3CommonMethod.ClearControlArray(ControlArray)CommonMethod.LockControlArray(ControlArray)ElseCommonMethod.UnLockControlArray(ControlArray)                '否则,解锁组合3End IfEnd Sub
End Class

文中调用的公共方法上篇博客已写,这里不再反复。

如今以查询操作员工作记录为例:

Public Class frmWorkLogProtected Overrides Sub frmComboQuery_Load(sender As Object, e As EventArgs)MyBase.frmComboQuery_Load(sender, e)Dim ComboxArray(2) As ComboBox           '定义控件数组,获取组合框ComboxArray(0) = cboField1ComboxArray(1) = cboField2ComboxArray(2) = cboField3CommonMethod.SelectIndex(ComboxArray)           '设置combox默认显示第一项End SubProtected Overrides Function GetdbName() As StringReturn "WorkLog"End Function
End Class

说明:1.设置默认第一项在父窗口加入了一部分,这里是字段的那部分,由于字段是在子窗口加入,所以假设这段代码也放父窗口会报错。

2.这里通过传递一个字符串来通知D层确定哪一个数据表,这里是我感觉不好的地方,可是临时没有想到其它方法。仅仅能先这么写。
B层代码:

Public Class ComboQueryBLLDim factory As New Factory.DataAccessPublic Function ComboQuery(ByVal cboworklog As Entity.ComboQueryEntity) As DataTableDim iComboQuery As IDAL.IComboQueryiComboQuery = factory.CreateComboQueryDim dtComboQuery As New DataTabledtComboQuery = iComboQuery.ComboQuery(cboworklog)If dtComboQuery.Rows.Count = 0 ThenThrow New Exception("没有记录")ElseReturn dtComboQueryEnd IfEnd Function
End Class

D层代码:

Imports System.Data.SqlClient
Public Class SqlServerComboQueryDAL : Implements IDAL.IComboQueryDim sqlhelper As New SqlHelperPublic Function ComboQuery1(cboworklog As Entity.ComboQueryEntity) As DataTable Implements IDAL.IComboQuery.ComboQueryDim ecboworklog As New Entity.ComboQueryEntitySelect Case cboworklog.dbNameCase "WorkLog"ecboworklog = Method.SwitchWorklogField(cboworklog)            '调用方法,转换字段,以匹配数据库Case "StudentAccount"ecboworklog = Method.SwitchStudentAccount(cboworklog)End SelectDim sqlParameter As SqlParameter()sqlParameter = New SqlParameter() {New SqlParameter("@dbName", ecboworklog.dbName),New SqlParameter("@Field1", ecboworklog.Field1),New SqlParameter("@Field2", ecboworklog.Field2),New SqlParameter("@Field3", ecboworklog.Field3),New SqlParameter("@Operator1", ecboworklog.Operator1),New SqlParameter("@Operator2", ecboworklog.Operator2),New SqlParameter("@Operator3", ecboworklog.Operator3),New SqlParameter("@Content1", ecboworklog.Content1),New SqlParameter("@Content2", ecboworklog.Content2),New SqlParameter("@Content3", ecboworklog.Content3),New SqlParameter("@Relation1", ecboworklog.Relation1),New SqlParameter("@Relation2", ecboworklog.Relation2)}Dim dtComboQuery As New DataTabledtComboQuery = sqlhelper.Query("sp_ComboQuery", CommandType.StoredProcedure, sqlParameter)Return dtComboQueryEnd Function
End Class

D层转换字段的方法:

    Function SwitchWorklogField(ByVal eworklog As Entity.ComboQueryEntity)Dim strField(2) As String             '字符串数组。暂时存放字段值Dim Field(2) As StringField(0) = eworklog.Field1Field(1) = eworklog.Field2Field(2) = eworklog.Field3For i = 0 To 2                              '通过一个循环对字段进行匹配Select Case Field(i)Case "职工ID"strField(i) = "UserID"Case "登陆日期"strField(i) = "LoginDate"Case "登陆时间"strField(i) = "LoginTime"Case "注销日期"strField(i) = "LogOffDate"Case "注销时间"strField(i) = "LogOffTime"Case "电脑名"strField(i) = "ComputerName"Case ElsestrField(i) = ""End SelectField(i) = strField(i)Nexteworklog.Field1 = Field(0)                     '将字段值进行匹配。并赋值给组合查询实体eworklog.Field2 = Field(1)eworklog.Field3 = Field(2)Dim strRelation(1) As String                    '定义字符串数组,暂时存在关系值Dim Relation(1) As StringRelation(0) = eworklog.Relation1Relation(1) = eworklog.Relation2For i = 0 To 1                                            '循环匹配字段Select Case Relation(i)Case "或"strRelation(i) = "OR"Case "且"strRelation(i) = "AND"Case ElsestrRelation(i) = ""End SelectRelation(i) = strRelation(i)Nexteworklog.Relation1 = Relation(0)            '组合查询实体赋值eworklog.Relation2 = Relation(1)eworklog.dbName = "T_WorkLog"Return eworklog                           '返回实体End Function

存储过程代码:

USE [ChargeSystem]
GO
/****** Object:  StoredProcedure [dbo].[sp_ComboQuery]    Script Date: 2014/6/22 16:40:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      刘晓春
-- Create date: 2014年6月17日
-- Description: 组合查询
-- =============================================
CREATE PROCEDURE [dbo].[sp_ComboQuery]@dbName varchar(20),@field1 varchar(20),@operator1 varchar(20),@content1 varchar(20),@relation1 varchar(10),@field2 varchar(20),@operator2 varchar(20),@content2 varchar(20),@relation2 varchar(20),@field3 varchar(20),@operator3 varchar(20),@content3 varchar(20)AS
BEGINDECLARE @sqlText varchar(200)SET @sqlText='SELECT * FROM '+@dbName+' WHERE ' +@field1 +@operator1+char(39) + @content1 + char(39)if @relation1<>''BEGINSET @sqlText=@sqlText+@relation1+CHAR(32)+@field2+@operator2+CHAR(39)+@content2+CHAR(39)if @relation2<>''BEGINSET @sqlText=@sqlText+@relation2+CHAR(32)+@field3+@operator3+CHAR(39)+@content3+CHAR(39)ENDENDEXECUTE(@sqlText)
END

效果例如以下:

题外话:

由于系统多次用到组合查询,并且各个窗口很类似,所以最初仅仅是想到用窗口的继承,免得做反复的窗口。后来父窗口做好之后,发现那些推断是否为空、清空等代码能够写到父窗口。然后子窗口写关于查询的代码。

紧接着就出现了一个问题,使用窗口继承。对于同一个事件而言,程序会先运行父窗口中的代码,后运行子窗口中的代码。在我的程序里,当运行button的click事件时,父窗口会先推断组合框是否为空。假设推断出为空,给出了提示。当点完确定后,程序并没有像想象中那样停下来让你选择组合框,而是接着运行子窗口的查询。

后来仅仅好请教师父和师哥,得到一个解决的方法。就是声明一个全局变量,由它通知子窗口是否运行,同一时候师哥指出,事实上子窗口的代码也能够放在父窗口中,我自己也认为声明全局变量感觉不好。所以就演化到如今的样子了。后来才知道,不知不觉还用了一个设计模式。模板方法模式。

只是这个模式依旧须要子窗口去传递一个參数,让D层去推断是用的哪一个数据库,感觉不好,可是也没有想出好的办法。假设大家有什么好的建议。望不吝奉献。

转载于:https://www.cnblogs.com/blfshiye/p/5379484.html

组合查询(机房重构知识点总结)相关推荐

  1. 配置文件总结(机房重构知识点总结)

    在这次机房重构中,第一次用了配置文件,把数据库的链接字串放在了配置文件中.和VB6.0版相比.不用又一次编译软件,就可以实现数据库的变更,确实方便了非常多. 直到想要总结配置文件才发现,自己对配置文件 ...

  2. 职责链模式应用——下机(机房重构知识点总结)

    下机涉及两个方面,消费时间和消费金额. 对消费时间的处理用的是职责链模式,感觉这个模式用的非常妙,參考的师哥的博客:<机房收费下机中用到的策略与职责链解析>:消费金额的处理用策略模式.针对 ...

  3. 【机房重构】组合查询--存储过程

    定义 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参 ...

  4. 蠡测机房重构之组合查询

    [写在前边的话] 在进行机房重构的过程中,设计组合查询的窗体,真的是学到了很多东西.以管窥豹,以蠡测海,所以想小小的总结一下,缅怀这一寸寸学习的时光. [设计模式之模板方法的运用] 模板方法模式--在 ...

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

    导读:在机房重构中,有好些个查询都是大同小异,最为显著的就是组合查询了.怎样给自己省事儿,相同的东西能不能重复利用,就成了一个现实的问题.第一遍做机房的时候,使用的更多的是:复制+粘贴.学习了设计模式 ...

  6. 机房系统(九)——【组合查询】

    机房收费系统首次让小编接触到了"组合查询".到现在为止,"组合查询"的类型,大概接触到了两种方式,一是单一表多个字段连接的查询:二是多个表的连接查询.机房收费系 ...

  7. vb.net机房收费系统之组合查询

    我个人一直认为,组合查询是机房收费系统的一个难点,尤其是用到三层之后,如果要为组合查询中的每一个查询建立一个显然是太麻烦了. 下面介绍一下我的方法,对大家起个参考作用. 我将该表中可输入的内容定义为一 ...

  8. VB.NET版机房收费系统---组合查询

    查询的意思就是查找,寻找,指在某一个或几个地方找出自己所要的信息,假如我想搜索一下我自己写的博客,名字叫做初雪之恋,我在百度的搜索框中输入丁国华三个字,会有怎样的惊喜等着我? 啊哦,这个信息并不是我想 ...

  9. 《从LRS项目重构看如何做UI设计——组合查询的界面创意设计(一)》

    引言: 在第一遍机房的时候做组合查询的经验我相信大家印象还很深刻,那里面惨不忍睹的if判断和select分支结构,搞得人叫那个晕啊!什么第一个条件,第二个条件,第三个条件-- 其实,这件事儿没有咱们想 ...

最新文章

  1. Sql Server 2008 精简版(Express)和管理工具的安装以及必须重新启动计算机才能安装 SQLServer的问题和第一次使用sqlexpress的连接问题
  2. 漫谈概率 PCA 和变分自编码器
  3. CSS使用Chrome进行取色
  4. 第三讲系统的基本操作
  5. draw python_科学网—Draw figures with Python - 高琳琳的博文
  6. ICPR 2022 第一届卫星视频运动目标检测与跟踪挑战赛正式开赛
  7. 洛谷P1007 独木桥(贪心)
  8. thinkphp5 return 返回空_网红饮品大杯约1/3是空的!店员:这是公司设计的中空隔冷层...
  9. 企业数据可视化大屏的三大优势
  10. 数据--第35课 - 创建二叉树
  11. 字节码指令之控制转移指令
  12. jspSmartUpload的使用—实现文件上传
  13. 如何应对微软的强制黑屏(转)
  14. word2013无法撤销解决方法-有效
  15. Python-pip镜像源配置及国内常用镜像源
  16. JetBrains.ReSharper 字典
  17. pythonmatplot教程_matplotlib入门实战全教程
  18. Android端一对一视频聊天系统功能实现方式
  19. MATLAB处理信号得到频谱、相谱、功率谱
  20. ESP32-C3 迷你智能语音照明

热门文章

  1. 一个小小的知识点,关于强制类型转换
  2. node 调用腾讯大数据接口
  3. ubuntu终端彻底删除软件
  4. CentOS7 虚拟机搭建、初始设置、简单使用
  5. iOS开发的一些奇巧淫技2
  6. jqGrid如何设置jqGrid第一次初始化时不加载任何数据?实现方法!
  7. 皮肤的实时3S渲染(OpenGL + GLSL)
  8. 使用python的docker-py实现docker的api操作
  9. Asp.net MVC 学习之路-003(增删改查,后端手工,前端生成)
  10. “+=”消除格式的强转问题