组合查询——拼接字符串

首先,什么情况下要用到组合查询呢?总的来说,有两种情况:一是在单个查询中从不同的表返回类似结构的数据;二是对单个表执行多个查询,按单个查询返回数据。在这里,我们说的组合查询是指第二种情况,即要查询的表是固定的,查询条件是不定的并且有多个查询条件。

从例子来看,

例如,输入相应的查询条件

1、教师不等于“0”

2、机器号等于“yang”

两个条件是“与”的关系,我们可以很容易的写出它的sql语句

select * from T_Worklog_Info  where id <> ‘0‘ and computer=‘yang‘

所以接下来要做的核心就是拼出这条语句。

在U层,我们把输入的查询条件的信息赋给实体,然后把实体传入B层。

 Dim student As New Login.Model.CmbQueryInfo
        Dim Bquery As New Login.BLL.cmbQueryforBLL
        '定义控件基类
        Dim controlArray(2) As System.Windows.Forms.Control
        Dim table As New DataTable
        Dim i As Integer

        controlArray(0) = cmbWord1
        controlArray(1) = cmbOperator1
        controlArray(2) = txtContent1
        '字段名
        student.FileName1 = cmbWord1.Text
        student.FileName2 = cmbWord2.Text
        student.FileName3 = cmbWord3.Text
        '操作符
        student.Operator1 = cmbOperator1.Text
        student.Operator2 = cmbOperator2.Text
        student.Operator3 = cmbOperator3.Text
        '查询内容
        student.QueryContent1 = txtContent1.Text
        student.QueryContent2 = txtContent2.Text
        student.QueryContent3 = txtContent3.Text
        '组合关系
        student.CompositionRelation1 = cmbRelation1.Text
        student.CompositionRelation2 = cmbRelation2.Text

        DataGridView1.Rows.Clear()
        '查询
        table = Bquery.cmbQuery(student, "T_Worklog_Info")

在B层,接收实体之后,开始拼接字符串。

首先,会用到两个方法。

ModifyFields方法主要是把“卡号”等中文字符转换为数据库中的字段“cardno”。

    Public Function ModifyFields(student As Login.Model.CmbQueryInfo) As Login.Model.CmbQueryInfo
        Dim str As String
        Select Case student.FileName1
            Case "卡号"
                str = "cardno"
            Case "学号"
                str = "studentno"
            Case "姓名"
                str = "studentname"
            Case "性别"
                str = "sex"
            Case "系别"
                str = "apartment"
            Case "年级"
                str = "grade"
            Case "班级"
                str = "class"
            Case "上机日期"
                str = "ondate"
            Case "上机时间"
                str = "ontime"
            Case "下机日期"
                str = "offdate"
            Case "下机时间"
                str = "offtime"
            Case "机房号"
                str = "computer"
            Case "机器号"
                str = "computer"
            Case "登录日期"
                str = "LoginDate"
            Case "登录时间"
                str = "LoginTime"
            Case "注销日期"
                str = "LogoutDate"
            Case "注销时间"
                str = "LogoutTime"
            Case "教师"
                str = "id"
            Case Else
                str = ""
        End Select
        student.FileName1 = str

        'student.FileName2, student.FileName3类似

        Select Case student.CompositionRelation1
            Case "与"
                str = "and"
            Case "或"
                str = "or"
            Case Else
                str = "NO"
        End Select
        student.CompositionRelation1 = str
        Select Case student.CompositionRelation2
            Case "与"
                str = "and"
            Case "或"
                str = "or"
            Case Else
                str = "NO"
        End Select
        student.CompositionRelation2 = str
        Return student
    End Function

CreateQueryContent方法

 Public Function CreateQueryContent(student As Login.Model.CmbQueryInfo) As Login.Model.CmbQueryInfo
        Dim tempQueryComposition As New Login.Model.CmbQueryInfo
        Try
            tempQueryComposition.QueryContent1 = student.FileName1 + " " + student.Operator1 + "'" + student.QueryContent1 + "'"
            tempQueryComposition.QueryContent2 = student.FileName2 + " " + student.Operator2 + _
                                              "'" + student.QueryContent2 + "'"
            tempQueryComposition.QueryContent3 = student.FileName3 + " " + student.Operator3 + _
                                            "'" + student.QueryContent3 + "'"

            tempQueryComposition.CompositionRelation1 = student.CompositionRelation1
            tempQueryComposition.CompositionRelation2 = student.CompositionRelation2
            Return tempQueryComposition
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Function

在D层,完成最后的sql语句的拼接。

    Public Function CreateSqlString(student As Login.Model.CmbQueryInfo, tablename As String) As String
        Dim sql As String

        Try
            '没有组合关系时
            If student.CompositionRelation1.Trim = "NO" Then

                sql = "select * from " + tablename + " Where" + " " + student.FileName1 + student.Operator1 + "'" + student.QueryContent1 + "'"
            Else
                '有一个组合关系时
                sql = "select * from " + tablename + " Where" + " " + student.FileName1 + student.Operator1 + "'" + student.QueryContent1 + "'" + " " + student.CompositionRelation1 + " " + student.FileName2 + student.Operator2 + "'" + student.QueryContent2 + "'"
            End If
            '有两个组合关系时
            If student.CompositionRelation2.Trim <> "NO" Then
                sql = sql + student.CompositionRelation2 + " " + student.FileName3 + student.Operator3 + "'" + student.QueryContent3 + "'"
            End If

            Return sql
        Catch ex As Exception

        End Try
    End Function

拼接完成后,可以放到数据库中检验一下,接下来的问题就容易多了。

最后的显示结果:

组合查询,其本质终究还是查询。用拼接字符串的方法理解起来比较容易,但特别容易出错。一不小心sql语句就

会出错,不过调试起来也挺容易发现错误的。期待大家与我交流其他的查询方法。

组合查询——拼接字符串

时间: 2024-11-05 13:33:08

组合查询——拼接字符串的相关文章

Sql动态查询拼接字符串的优化

Sql动态查询拼接字符串的优化 最原始的 直接写:string sql="select * from TestTables where 1=1";... 这样的代码效率很低的,这样影响了数据库的索引引用如下所示:private void TestOneMethod()        {             string querySql = "select * from TestTables where 1=1";            if (hasOneCo

sql 多条件查询 拼接字符串 改成 普通查询格式

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROC [dbo].[usp_SRV_CheckServiceDemandOrder] @AInsNO NVARCHAR(50) =null,--必填 @ACompanyName NVARCHAR(50) = null,--必填 @ADepartmentName NVARCHAR(50) = null, @AName NVARCHAR(50) = null, --必填 @ApplicantI

ADO多条件模糊查询防字符串攻击

多条件组合查询使用字符串拼接TSQL语句来实现 1 void Button1_Click(object sender, EventArgs e) 2 { 3 string text = "select *from car"; //最终TSQL语句 4 string endtext = ""; //组合查询末尾部分 5 int num = 0; //记录当前是第几条查询,为了区别前缀是Where还是and 6 bool ok = false; //判断是否有填写查询

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

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

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

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

SSRS 2012 参数化报表 -- 利用拼接字符串来取代查询参数

SSRS 2012 参数化报表 -- 利用拼接字符串来取代查询参数 以上介绍过了如何在SQL Server中使用参数化查询,但是,如果遇到一些不支持参数化查询的数据库又该怎么办呢?此时,最终极的招数就是整个查询语句都通过参数化查询以拼接字符串的方式来产生. 举例来说,除了XML文件之外,SSRS也能够接收外部Web Services返回的数据集以产生报表.在以下的实例中,利用立陶宛国家银行所提供的实时汇率换算Web服务,它提供各种货币与立陶宛币(Litas)的汇率换算. 步骤1: 请将数据表拖拉

必须知道的sql编写技巧。多条件查询不拼接字符串&#183;的写法

在做项目中,我们经常遇到复杂的查询方法,要根据用户的输入,判断某个参数是否合法,合法的话才能当作过滤条件,我们通常的做法是把查询SQL赋值给一个字符串变量,然后根据判断条件动态的拼接where条件进行查询.下面来简单说一下写SQL中遇到的问题和解决办法.  一.不确定字段名,而产生的SQL字符串拼接 比如,有个公司要做一个系统,要支持多语言,这个时候我们就要将语音信息存储在数据库中.然后,根据客户选择查询对应的语言字段,进行显示.下面我们来模拟这个场景,打开SQL Server,新建SysLan

参数化查询比拼接字符串慢的原因

我们都知道,参数化查询可以处理SQL注入,以及提高查询的效率,因为参数化查询会使MSSQL缓存查询的计划. 但是现在我发现一个奇怪的问题,就是参数化查询比字符串拼接要慢,而且速度相差10倍之多. SQL语句是: select * from T_Message where T_Message.BelongTo=@BelongTo 开始在ADO.NET中用SqlParameter传递参数@BelongTo时是这么写的 SqlParameter param1 = new SqlParameter("@