VB.NET & (三层+泛型)实现组合查询

     对于组合查询,真的是“费劲苦难”,当然也只是玩笑话,下边谈谈自己拼接字符串的办法吧!

     首先我们要明确声明一个实体层,定义组合查询为实体类,将"字段,操作符,组合关系分别设为实体类combinQuery的属性

 '字段1
    Private _ComboFileName1 As String
    Public Property ComboFileName1() As String
        Get
            Return _ComboFileName1
        End Get
        Set(value As String)
            _ComboFileName1 = value
        End Set
    End Property
    '字段2
    Private _ComboFileName2 As String
    Public Property ComboFileName2() As String
        Get
            Return _ComboFileName2
        End Get
        Set(value As String)
            _ComboFileName2 = value
        End Set
    End Property
…………

 对于U层,我们除了要实现参数赋值,还要将其记录显示在DataGridView中,在显示的这一阶段自己采用了泛型集合,将datatable类型转换成了集合而显示出来

看U层:

Private Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.Click
        'combinQuery_m  ,定义一个实体
        Dim combinQuery_m As IList(Of Entity.RegisterEntity)   '定义泛型集合
        Dim combinQuery_bll As New BLL.StusInfoMainBLL    '定义一个B层接口
        Dim combinQuery As New Entity.CombinQueryEntity    '定义一个实体,作为参数

        Dim table As String = "T_student"    '用到的表,与学生表联系起来

        Dim arrayControl(2) As Control
 '给参数赋值
        With combinQuery
            '将查询条件字段1的值赋给实体combinQuery_m的字段1ComboFileName1属性
            .ComboFileName1 = ComboFileName1.Text.Trim()
            .ComboFileName2 = ComboFileName2.Text.Trim()
            .ComboFileName3 = ComboFileName3.Text.Trim()
            ''将操作符1的值赋给实体combinQuery_m的操作符1ComboSign1属性
            .ComboSign1 = ComboSign1.Text.Trim()
            .ComboSign2 = ComboSign2.Text.Trim()
            .ComboSign3 = ComboSign3.Text.Trim()
            '将查询内容1的值赋给实体combinQuery_m的查询内容1txtInqure1属性
            .txtInqure1 = txtInqure1.Text.Trim()
            .txtInqure2 = txtInqure2.Text.Trim()
            .txtInqure3 = txtInqure3.Text.Trim()
            '将组合关系1的值赋给实体combinQuery_m的组合关系1ComboRelation1属性
            .ComboRelation1 = ComboRelation1.Text.Trim()
            .ComboRelation2 = ComboRelation2.Text.Trim()
        End With
combinQuery_m = combinQuery_bll.StusInfo(table, combinQuery)

        DataGridView1.DataSource = combinQuery_m   '查询到的集合

以上代码主要还是实现将查询到的集合反馈到DataGridView的过程

我们还要将字符串转化,给字段,操作符,组合关系等分别赋值

将查询字段(1,2,3)对应于”表“的字段(eg: cardNo),操作符对应于关系运算符,组合关系对应于逻辑运算符(or/and)

看部分代码:

'字符串转换
        '给字段1赋值
        Select Case (combinQuery.ComboFileName1)
            Case "卡号"
                combinQuery.ComboFileName1 = "cardNo"
            Case "学号"
                combinQuery.ComboFileName1 = "studentNo"
            Case "姓名"
                combinQuery.ComboFileName1 = "studentName"
            Case "性别"
                combinQuery.ComboFileName1 = "sex"
            Case "年级"
                combinQuery.ComboFileName1 = "Grade"
            Case "班级"
                combinQuery.ComboFileName1 = "sclass"
        End Select
 '操作符1
        Select Case combinQuery.ComboSign1
            Case "="
                combinQuery.ComboSign1 = "="
            Case ">"
                combinQuery.ComboSign1 = ">"
            Case "<"
                combinQuery.ComboSign3 = "<"
            Case "<>"
                combinQuery.ComboSign1 = "<>"
        End Select
  '组合关系1
        Select Case combinQuery.ComboRelation1
            Case "或"
                combinQuery.ComboRelation1 = "or"
            Case "与"
                combinQuery.ComboRelation1 = "and"
        End Select

由于在整个系统过程中,我们涉及到了四个组合查询,所以定义了一个字符串类型的Table,实现了代码的复用性。以下则是拼接字符串的方法:

 ''' <summary>
    ''' 生成组合查询sql语句-拼接sql字符串
    ''' </summary>
    ''' <param name="table"></param>
    ''' <param name="combinQuery">combinQuery实体</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CombinsqlQuery(ByVal table As String, ByVal combinQuery As Entity.CombinQueryEntity) As String
        '首先,第一个查询条件有效  

        Dim sql As String = "select * from " & table & " where  " & combinQuery.ComboFileName1 & " " & combinQuery.ComboSign1 & " " & combinQuery.txtInqure1.Trim()
        If combinQuery.ComboRelation1 = "" Then    '如果第一个组合关系为空,则第一个查询条件有效
            Return sql

        Else     '如果第一个组合关系不为空,则前两个查询条件有效
            sql = sql & " " & combinQuery.ComboRelation1 & " " & combinQuery.ComboFileName2 & " " & combinQuery.ComboSign2 & " " & combinQuery.txtInqure2.Trim()

            If combinQuery.ComboRelation2 = "" Then     '如果第一个组合关系不为空,第二个组合关系为空,则仅仅前两个查询条件有效
                Return sql
            Else       '如果第一二组合关系不为空,则三个查询条件均有效
                sql = sql & " " & combinQuery.ComboRelation2 & " " & combinQuery.ComboFileName3 & " " & combinQuery.ComboSign3 & " " & combinQuery.txtInqure3.Trim()

                Return sql
            End If

        End If

        If combinQuery.ComboRelation1 <> "" And combinQuery.ComboRelation2 = "" Then     '如果第一个组合关系不为空,第二个组合关系为空,则前两个查询条件有效
            sql = sql & " " & combinQuery.ComboRelation1 & " " & combinQuery.ComboFileName2 & " " & combinQuery.ComboSign2 & " " & combinQuery.txtInqure2.Trim()

        ElseIf combinQuery.ComboRelation1 <> "" And combinQuery.ComboRelation2 <> "" Then '如果第一个组合关系和第二个组合关系均不为空,则三个查询条件有效
            sql = sql

        End If
    End Function

由于是D层实现调用,所以我把这个过程以一个Module形式定义在了D层中,下边看最关键的D层部分:

Private clsSqlhelper As DAL.sqlhelper = New DAL.sqlhelper()   '声明并实例化
    ''' <summary>
    ''' 泛型集合,组合查询
    ''' </summary>
    ''' <param name="table"></param>
    ''' <param name="combinQuery"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function StuInfoQuery(ByVal table As String, ByVal combinQuery As Entity.CombinQueryEntity) As <span style="color:#3333ff;">IList(Of Entity.RegisterEntity</span>) Implements IDAL.IStusInfoMainDAL.StuInfoQuery

        Dim dt As New DataTable
        Dim myList As IList(Of Entity.RegisterEntity)     '保存转化后的泛型集
        '调用查询语句
        'sql语句。调用Model层combinQuery类的方法CombinQuerySql()方法,返回sql语句
        Dim strsql As String = CombinQueryModule.CombinsqlQuery(table, combinQuery)
        dt = clsSqlhelper.Query(strsql, CommandType.Text)    '执行查询

        '将dt转换为泛型集合
       myList = EntityHelper.converToList(Of RegisterEntity)(dt)
        Return myList
    End Function

整个过程自己尝试定义了工厂类和接口,所以B层直接声明了一个变量,调用由Factory的方法返回来的接口

  '声明并实例化Factory为DataAccess类
    Private ReadOnly factory As DataAccess = New DataAccess
    Public Function StusInfo(ByVal data As String, ByVal StusQuery As Entity.CombinQueryEntity) As IList(Of Entity.RegisterEntity)
        '声明并实例化变量InterfaceUser为:调用Factory.CreateUserDAL()所返回来的IUser
        Dim comboQuery As IStusInfoMainDAL = factory.StusInfoMain()
        Dim StusMain As IList(Of Entity.RegisterEntity)   '定义一个泛型集合
        StusMain = comboQuery.StuInfoQuery(data, StusQuery)</span>

        Return StusMain
    End Function

     这样组合查询的整个过程就完成了, 整个过程的实现,很好的遵守了三层架构的要求,实现了解耦的目的。当然除了拼接字符串还有使用存储过程实现的方法,这样就无需大量赋值,而且也就不用拼接字符串了,直接将这些全部定义在了存储过程中,然后再存储过程中直接传入参数就好了,虽然自己明白整个过程的实现,但是还是欠缺实践,希望在合作开发的过程中能够熟练对于各种技巧的使用。

VB.NET & (三层+泛型)实现组合查询,布布扣,bubuko.com

时间: 2024-08-04 05:17:45

VB.NET & (三层+泛型)实现组合查询的相关文章

重构之路 组合查询之传递SQL字符串

既然是使用VB.NET语言对机房收费系统进行重构,那么无可避免的要去解决组合查询的问题,在VB版的实现中这是一个难点,不过大家还是依靠自己或者共同的智慧解决了这个看似复杂的问题. 如今编程的语言不同是一方面,更重要的是系统的结构不一样了,采用了三层架构去实现系统,这样一来就要考虑组合查询的在三层结构中的实现方法.当然,组合查询的核心办法是不变的,都是通过将查询的各个条件组装成SQL查询语句的where子句来实现的,问题就是这个where子句的组装在哪里完成? 如果放在U层完成,那么我们向下传递的

VB.NET+三层 机房收费系统之组合查询

关系组合查询已经用去了4天的时间.每天都在痛苦中煎熬,绞尽脑汁,一句代码都要瞪大眼睛看好长时间,有时候.由于两句话颠倒了.就nothing了:有时候,由于table如何可以转换成实体类型.将自己困住了.一想就是半天.状况不断呀.看了非常多师哥师姐们的代码,他们分享着自己的代码.为了给大家一点东西,给拿出自己给大家分享.期望大家能给点意见. 步骤: (1).首先建立实体,实体是用来存储变量的. (2).建立B层,B层除了有调用D层的函数,同一时候,它也有将汉字转换为sql中的字段的功能. (3).

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

查询的意思就是查找,寻找,指在某一个或几个地方找出自己所要的信息,假如我想搜索一下我自己写的博客,名字叫做初雪之恋,我在百度的搜索框中输入丁国华三个字,会有如何的惊喜等着我? 啊哦,这个信息并非我想要的,于是我再搜,"丁国华 廊坊师范学院  csdn"搜索结果例如以下: 非常显然,这个还不是我想要的结果,我接着搜,"丁国华 廊坊师范学院 csdn 初雪之恋": 在我的理解中,组合查询就是通过条件层层限制,一步一步精确,得到我们想要的答案,在机房收费系统中,有好几处涉

WebForm组合查询

封转类 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> /// Car 的摘要说明 /// </summary> public class Car { public int ids{get;set;} public string code{get;set;} public string name{get;set;} public st

组合查询——继承与多态的小练习

上次个人版机房收费做的时候,组合查询这里做的不好,没有抽出模板,导致感觉有很多冗余,这次自己挑U层,一方面是感觉自己的B层和D层做的可以提升的空间目前很小了,另一方面就是想加强一下自己对细节的注意问题. 上次组合查询是这样的,以代码为例: U层代码如下: Imports System.Collections '引入HashTable类 Public Class frmColWorkInfo Dim HtZD As New Hashtable '定义处理字段名转换的hashtable Dim Ht

重构—组合查询

组合查询是重构中的一个重点,也是比较麻烦的,但是我们可以用一个很好的办法来解决它,比如窗体继承,模板方法.关于窗体继承请参考博文:http://blog.csdn.net/augus3344/article/details/29384877 讲的很详细.这里主要说下模板方法,用这个方法可以为我们省掉很多繁琐的步骤和重复的代码.我们就以父窗体为模板,继承窗体来实现不同的模板,也就是将公共的代码写到模板中,自己特有的代码写到自己的模块,下面看代码. 父窗体的代码 U层代码 ImportsSystem

webform:分页组合查询

一个简单的分页组合查询页面 /// <summary> /// 查询方法 /// </summary> /// <param name="tsql">SQL语句</param> /// <param name="hh">哈希表</param> /// <returns></returns> public List<Goods> Select(string un

WebForm 分页与组合查询

1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> list = new List<Subject>(); cmd.CommandText = "select *from Subject where SubjectName like @a "; cmd.Parameters.Clear(); cmd.Parameters.Add

ADO.NET组合查询及其分页合并

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server&quo