存储过程实现组合查询

这几天重构机房收费系统比以前上手多了,解决每一个bug都很有成就感。在做组合查询时,我在网上找了一些资料,发现有用字符串拼接的,但是总感觉字符串的判断条件放在D层不太好,不如将这些复杂的东西都交给数据库解决,我在数据库中创建了一个带参数的存储过程.下面就是我实现这个功能的总结.

1界面如下:通过界面可以看到要传递的参数有11.所以创建的Entity也有11个属性.


Entity创建代码:

Public Class QueryEntity
    Private field0 As String
    Private field1 As String
    Private field2 As String
    Private operate0 As String
    Private operate1 As String
    Private operate2 As String
    Private content0 As String
    Private content1 As String
    Private content2 As String
    Private relation0 As String
    Private relation1 As String

    Public Property _field0 As String   '字段0
        Get
            Return field0
        End Get
        Set(value As String)
            field0 = value
        End Set
    End Property

    Public Property _field1 As String   '字段1
        Get
            Return field1
        End Get
        Set(value As String)
            field1 = value
        End Set
    End Property

    Public Property _field2 As String    '字段2
        Get
            Return field2
        End Get
        Set(value As String)
            field2 = value
        End Set
    End Property

    Public Property _operate0 As String   '操作符0
        Get
            Return operate0
        End Get
        Set(value As String)
            operate0 = value
        End Set
    End Property

    Public Property _operate1 As String    '操作符1
        Get
            Return operate1
        End Get
        Set(value As String)
            operate1 = value
        End Set
    End Property

    Public Property _operate2 As String    '操作符2
        Get
            Return operate2
        End Get
        Set(value As String)
            operate2 = value
        End Set
    End Property

    Public Property _content0 As String    '查询内容0
        Get
            Return content0
        End Get
        Set(value As String)
            content0 = value
        End Set
    End Property

    Public Property _content1 As String   '查询内容1
        Get 
            Return content1
        End Get
        Set(value As String)
            content1 = value
        End Set
    End Property

    Public Property _content2 As String   '查询内容2
        Get
            Return content2
        End Get
        Set(value As String)
            content2 = value
        End Set
    End Property

    Public Property _relation0 As String   '关系0
        Get
            Return relation0
        End Get
        Set(value As String)
            relation0 = value
        End Set
    End Property

    Public Property _relation1 As String   '关系1
        Get
            Return relation1
        End Get
        Set(value As String)
            relation1 = value
        End Set
    End Property

End Class

2U层中主要实现的功能就是给Entity赋值,和将返回的值显示在datagridview中。


3B层中的逻辑简单,就是传递参数调用D层的函数,返回datatableU.

 

4D层中将参数传给数据库执行存储过程.并将返回的datatableB层。D层的代码为:

    Public Overloads Function SelectCard(ByVal enQuery As Entity.QueryEntity) As DataTable
        Using conn As New SqlConnection(DBUtil.strConnection)

            Dim cmd As SqlCommand
            cmd = New SqlCommand("QueryStuInfo", conn)
            cmd.CommandType = CommandType.StoredProcedure   '执行的是存储过程
            cmd.Parameters.Add(New SqlParameter("@field0", enQuery._field0))         '添加的一系列参数
            cmd.Parameters.Add(New SqlParameter("@operate0", enQuery._operate0))
            cmd.Parameters.Add(New SqlParameter("@content0", enQuery._content0))
            cmd.Parameters.Add(New SqlParameter("@relation0", enQuery._relation0))
            cmd.Parameters.Add(New SqlParameter("@field1", enQuery._field1))
            cmd.Parameters.Add(New SqlParameter("@operate1", enQuery._operate1))
            cmd.Parameters.Add(New SqlParameter("@content1", enQuery._content1))
            cmd.Parameters.Add(New SqlParameter("@relation1", enQuery._relation1))
            cmd.Parameters.Add(New SqlParameter("@field2", enQuery._field2))
            cmd.Parameters.Add(New SqlParameter("@operate2", enQuery._operate2))
            cmd.Parameters.Add(New SqlParameter("@content2", enQuery._content2))

            Dim adp As New SqlDataAdapter(cmd)
            Dim dt As New DataTable
            Try
                conn.Open()
                adp.Fill(dt)          ’填充数据表
            Catch ex As Exception
                Throw ex
            End Try
            Return dt
        End Using
    End Function

 

5SQL Sever中创建的存储过程的T-SQL语句为:

create procedure QueryStuInfo 
(@field0 char(10),
 @operate0 char(10),
 @content0 char(20),
 @relation0 char(10),
 @field1 char(10)=default,
 @operate1 char(10)=default,
 @content1 char(20)=default,
 @relation1 char(10),
 @field2 char(10)=default,
 @operate2 char(10)=default,
 @content2 char(20)=default
 )
 as 
 begin
 
 declare @SQL varchar(2000)       '实现拼接字符串
 select @SQL = 'select * from V_StuCards where ' + @field0 +@operate0 +@content0 
 if @relation0 != ''
    select @SQL =@SQL + @relation0 + @field1 +@operate1 + @content1
 if @relation1 != ''
    select @SQL =@SQL + @relation1 + @field2 +@operate2 +@content2
    
 exec(@SQL) 
 
 end
6.总结:虽然说存储过程有它的缺点,比如移植性差等,但是我不能投鼠忌器。基本的内容还是要踏实地掌握。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值