.NET上,利用二维数组“组合”查询之优化
.NET下,利用二维数组“组合”查询之优化
而对于B层,这个功能的业务逻辑不是很复杂,只是调用D层相应的方法,然后返回一个DataTable就可以了(不太符合三层,哈哈)
这种方法避免了对“组合关系”字段的判断,然后在拼接字符串。当然,这里说的不是很全面,还需要在界面对控件添加一些判断:如果“组合关系”第一个控件不为空,那么它后面的“字段”、“操作符”、“查询条件”这三个控件也不能为空,相应的“组合关系”第二控件若不为空,那么所有的控件都不能为空,不然在D层的SQL语句不全,会报错。对这个问题,我还没有想到更好的解决方法,希望各位大虾,不吝赐教,小弟在此感激不尽。
以前写过一篇博客《Vb.net下,利用数组进行“组合”查询》。这篇博客中,针对“机房收费系统”中这种组合方式的查询进行了分析。
当时,那篇博客是我经过好几天的思考才将这个功能实现,然后就迫不及待的写出来和大家分享一下。写的时候也没有考虑的太多,只是单纯的能够将功能实现而已。但是在评论区,有很多热心的大虾,他们认真的读了我的博客,给我提出了很多中肯的意见,如下:
针对各位大虾提出的意见,加之这次录制视频也包括这一部分,所以我又认真的对上次的代码针对这些意见做了一些改进。在此很真诚的感谢以上给我提出宝贵意见的大侠们。
好了废话不多说,下面进入代码的优化讲解。
至于界面层,这里就不再贴图了,和链接博客中的一样。在这里说明一下:下拉列表中的所有汉字不用在frmWorkRecord_Load中定义了,而是通过将下拉列表中的汉字放到ComboBox的Item属性里。
下面就是U层代码了
Imports Entity Imports BLL Public Class form1 '定义一个二维数组,使得下拉列表中的汉字与英文对应 Dim strArr(2, 7) As String Private Sub frmWorkRecord_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load '使用二维数组,避免了之前的select case语句 '实现“教师”和“UserID”、“上机日期”和“OnDate“.....的一一对应 strArr(0, 0) = "UserID" strArr(0, 1) = "OnDate" strArr(0, 2) = "OnTime" strArr(0, 3) = "OffDate" strArr(0, 4) = "OffTime" strArr(0, 5) = "Computer" '实现“与”和“and”、“或”和“or”的一一对应 strArr(1, 0) = "and" strArr(1, 1) = "or" End Sub Private Sub cmdOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOk.Click Dim arrTeacherE As TeacherE() = {New TeacherE(), New TeacherE(), New TeacherE(), New TeacherE(), New TeacherE(), New TeacherE(), New TeacherE(), New TeacherE(), New TeacherE(), New TeacherE(), New TeacherE()} '“字段”下拉列表中与汉字对应英文赋值到arrTeacherE数组中 arrTeacherE(0).Name = strArr(0, cbxName1.SelectedIndex) 'ComboBox控件在页面加载时,默认SelectedIndex=-1,而数组下标不能出现负数,故需要进行判断 If cbxName2.Text = "" Then arrTeacherE(1).Name = "" Else arrTeacherE(1).Name = strArr(0, cbxName2.SelectedIndex) End If If cbxName3.Text = "" Then arrTeacherE(2).Name = "" Else arrTeacherE(2).Name = strArr(0, cbxName3.SelectedIndex) End If '将“操作符”赋值到arrTeacherE数组中 arrTeacherE(3).Operation = cbxOperation1.Text arrTeacherE(4).Operation = cbxOperation2.Text arrTeacherE(5).Operation = cbxOperation3.Text '将“查询条件”赋值到arrTeacherE数组中 arrTeacherE(6).txtName = txtName1.Text arrTeacherE(7).txtName = txtName2.Text arrTeacherE(8).txtName = txtName3.Text '“组合关系”下拉列表中与汉字对应英文赋值到arrTeacherE数组中 If cbxCompone1.Text = "" Then arrTeacherE(9).Compone = "" Else arrTeacherE(9).Compone = strArr(1, cbxCompone1.SelectedIndex) End If '这里的If语句作用同上面的If语句 If cbxCompone2.Text = "" Then arrTeacherE(10).Compone = "" Else arrTeacherE(10).Compone = strArr(1, cbxCompone2.SelectedIndex) End If Dim mybll As New TeacherBLL Dim dt As New DataTable dt = mybll.test(arrTeacherE) If dt.Rows.Count() > 0 Then DataGridView1.DataSource = dt Else MessageBox.Show("没有记录") End If End Sub End Class
而对于B层,这个功能的业务逻辑不是很复杂,只是调用D层相应的方法,然后返回一个DataTable就可以了(不太符合三层,哈哈)
下面就是D层的代码了,这里用到了SqlHelper,相信大家对SqlHelper很熟悉了,这里就不再赘述了,只是在这里调用一下。
Imports Entity Imports System.Data.SqlClient Public Class OnDutyTeacher Function test(ByVal arrTeacherE() As TeacherE) As DataTable Dim strSqlText As String = "select * from Teacher_Info where " & arrTeacherE(0).Name & arrTeacherE(3).Operation & " " & "@txtName1" & arrTeacherE(9).Compone & " " & arrTeacherE(1).Name & arrTeacherE(4).Operation & " " & "@txtName2" & " " & arrTeacherE(10).Compone & " " & arrTeacherE(2).Name & " " & arrTeacherE(5).Operation & "@txtName3" & " " Dim param() As SqlParameter Dim intInfluencedRecord As Integer param = New SqlParameter() {New SqlParameter("@txtName1", SqlDbType.Char, 10), New SqlParameter("@txtName2", SqlDbType.Char, 10), New SqlParameter("@txtName3", SqlDbType.Char, 10)} param(0).Value = arrTeacherE(6).txtName.ToString() param(1).Value = arrTeacherE(7).txtName.ToString() param(2).Value = arrTeacherE(8).txtName.ToString() intInfluencedRecord = SQLHelper.SQLHelper.ExecuteNoQuery(strSqlText, CommandType.Text, param) If intInfluencedRecord > 0 Then Return True Else Return False End If End Function End Class
这种方法避免了对“组合关系”字段的判断,然后在拼接字符串。当然,这里说的不是很全面,还需要在界面对控件添加一些判断:如果“组合关系”第一个控件不为空,那么它后面的“字段”、“操作符”、“查询条件”这三个控件也不能为空,相应的“组合关系”第二控件若不为空,那么所有的控件都不能为空,不然在D层的SQL语句不全,会报错。对这个问题,我还没有想到更好的解决方法,希望各位大虾,不吝赐教,小弟在此感激不尽。
- 16楼lishehe5小时前
- 顶接着顶
- Re: aboy1235小时前
- 回复lishehen谢谢
- 15楼yi_zz5小时前
- 为什么踩这么多?而且不给评论?
- 14楼xqf309昨天 21:47
- ......踩了这么多,ca
- Re: aboy1235小时前
- 回复xqf309n不知道是怎么回事啊,不到一小时就这样了。妹的,踩也不给个理由
- 13楼yuyunli1989昨天 19:49
- good!
- Re: aboy123昨天 19:51
- 回复yuyunli1989nThanks
- 12楼han_yankun2009昨天 19:48
- 支持
- Re: aboy123昨天 19:49
- 回复han_yankun2009n谢谢
- 11楼wwwwenhuan昨天 15:35
- 吓我一跳,我以为刚开始就结束了。
- Re: aboy123昨天 15:35
- 回复wwwwenhuann一看就没认真读
- 10楼lzh1110昨天 14:58
- 顶你一下!李志华
- Re: aboy123昨天 14:58
- 回复lzh1110n晕,我也顶你一下啊
- 9楼xiaoduishenghuogo昨天 14:30
- 数组用那么多啊!
- Re: aboy123昨天 14:56
- 回复xiaoduishenghuogon我试了试,定义数组时只能那么写
- 8楼han_yankun2009昨天 14:28
- 顶顶
- 7楼hejingyuan6昨天 10:14
- 顶顶呀!
- Re: aboy123昨天 11:53
- 回复hejingyuan6n哈哈
- 6楼lbq613613昨天 09:49
- 灰常不错!
- Re: aboy123昨天 10:08
- 回复lbq613613n还行把,但还是那么多人踩
- 5楼lfmilaoshi昨天 09:49
- 交流,撞击出火花。。。米老师
- Re: aboy123昨天 09:49
- 回复lfmilaoshin嗯,会的
- 4楼a1314517love昨天 09:26
- 严重同意五楼,长收
- Re: aboy123昨天 09:39
- 回复a1314517loven汗
- 3楼beijiguangyong昨天 09:14
- 不错~
- Re: aboy123昨天 09:22
- 回复beijiguangyongn嘿嘿
- 2楼penglaidao昨天 08:58
- 有很大的改进
- Re: aboy123昨天 09:03
- 回复penglaidaon谢谢
- 1楼haibingongyuan昨天 08:21
- 很好
- Re: aboy123昨天 08:45
- 回复haibingongyuann谢谢