首页 > 代码库 > 三层架构下带实体参数泛型集合的“传递”
三层架构下带实体参数泛型集合的“传递”
看过我的三种方法实现从“一个(组)查询过程中返回两个表的查询结果“这篇博客的同学,可能大都对最后一种方法比较感兴趣。即:把查询结果放到泛型集合中,在两个将泛型集合放入另一个新的泛型集合,新集合的参数为object。(链接:http://blog.csdn.net/u010191243/article/details/38798773)
D层代码:
Public Function QueryCardStudentInfo(ByVal enCard As CardEntity, ByVal enStudent As StudentEntity) As List(Of Object) Implements ICardDAL.QueryCardStudentInfo Dim strQueryCardInfo As String Dim strQueryStudentInfo As String Dim dtQueryCardInfo As DataTable Dim dtQueryStudentInfo As DataTable Dim myCardList As List(Of CardEntity) Dim myStudentList As List(Of StudentEntity) '联合查询sql子句:strQueryCardInfo = "Select c.comment,c.money,c.status From T_Card as c inner join T_Student as s on c.cardNo=s.cardNo Where (c.cardNo=@CardNo)" '查找卡表中的信息,放到myCardList中 strQueryCardInfo = "Select * From T_Card Where cardNo=@CardNo" Dim paraCard As SqlParameter() = {New SqlParameter("@CardNo", enCard.cardNo)} dtQueryCardInfo = sqlHelper.ExecuteSelect(strQueryCardInfo, CommandType.Text, paraCard) myCardList = CType(listHelper.convertToList(Of CardEntity)(dtQueryCardInfo), Global.System.Collections.Generic.List(Of Global.Entity.CardEntity)) '查找学生表中的信息,放到myStudentList中 strQueryStudentInfo = "Select * From T_Student Where cardNo=@CardNo" Dim paraStudent As SqlParameter() = {New SqlParameter("@CardNo", enStudent.cardNo)} dtQueryStudentInfo = sqlHelper.ExecuteSelect(strQueryStudentInfo, CommandType.Text, paraStudent) myStudentList = CType(listHelper.convertToList(Of StudentEntity)(dtQueryCardInfo), Global.System.Collections.Generic.List(Of Global.Entity.StudentEntity)) Dim myList As New List(Of Object) '建立一个新List myList.Add(myCardList) '添加myCardList myList.Add(myStudentList) '添加myStudentList Return myList End Function
虽说DAL层这样写好了,但我们要求的是在U层还能找到实体的属性并给它赋值,不然你D层设想的多么好,写的多么优秀也是白搭,U层无法实现!那么如何在U层找到它的属性?
想达到这种效果,我们先要弄懂这样设计的原理:
首先,我们把实体结果放入泛型集合中,即代码中的“myStudent=……”这一大串代码;我们可以把它实体里的内容想象成一包钉子,装入泛型集合中理解为“打包”。
然后,把这些泛型集合装入一个新的myList中,即myList.Add(myCardList);就像把打包后的钉子“装车”。
最后就是返回啦!Return myList,即开车把钉子运到U层。
那么,在U层怎么办?
当然是先卸车!
然后?然后就拆包装啊!
来看U层代码:
Private Sub btn_On_Click(sender As Object, e As EventArgs) Handles btn_On.Click '判断卡号是否为空,是否为数字 If txtcardno.Text = "" Then MsgBox("卡号不能为空", , "提示") txtcardno.Focus() Exit Sub Else If IsNumeric(txtcardno.Text) = False Then MsgBox("卡号请写数字", , "提示") txtcardno.Focus() Exit Sub End If End If Dim enLine As New Entity.LineEntity '定义上机实体,在下面给具体的实体属性赋值 Dim fLine As New Facade.FLine '定义外观 enLine.cardNo = txtcardno.Text '传入卡号 enLine.onDate = Format(Date.Today, "yyyy/MM/dd") enLine.onTime = Format(Date.Now, "HH:mm") enLine.status = "正在上机" enLine.userName = FrmLogin.txtUsername.Text Dim myLine As New List(Of Object) '关键步骤,定义的参数为Object的泛型集合变量 Try myLine = fLine.LoginOn(enLine) '把上机的执行结果传入到定义好的泛型集合中 '显示数据 Dim card As New List(Of Entity.CardEntity) Dim student As New List(Of Entity.StudentEntity) card = myLine.Item(0) '关键步骤,把泛型集合中的第一个Item里的内容传入到参数为CardEntity的泛型集合变量中 lMoney.Text = card.Item(0).money.ToString '赋值 student = myLine.Item(1) '把泛型集合中的第二个Item里的内容传入到参数为StudentEntity的泛型集合变量中 lApartment.Text = student.Item(0).department.ToString '注意,这里的 student.Item(0)同上边的card.Item(0)是同级的,他们是各自独立的 lGrade.Text = student.Item(0).grade.ToString lStudentname.Text = student.Item(0).studentName.ToString lCardno.Text = txtcardno.Text lSex.Text = student.Item(0).sex.ToString lClass.Text = student.Item(0).stclass.ToString lOndate.Text = Now.Date lOnTime.Text = Now.Hour & ":" & Now.Minute Call fLine.QueryOnlineNo(enLine) '查询下机人数 Catch ex As Exception MsgBox(ex.Message, , "提示") End Try End Sub
卸车过程:card=myLine.Item(0)和student=myLine.Item(1),也就是把包含两个结果集(返回的card信息和student信息)的myLine分别卸到两个地方。
拆包装过程:lMoney.Text=card.Item(0).money.ToString
像上边这样写虽然能实现上机,但还是有一些问题。
如果我先上卡号1,再上卡号2,这时界面中的卡号2的信息就会覆盖1。假如我们再输入卡号1,点击上机后,界面上不能出现卡号1的信息了。
尝试过把上边注释“’显示信息”下的内容移出Try……Catch块,还是不能解决问题,期待大家的方案!当然,我也会再找方法尝试,一旦解决,立即更新~
三层架构下带实体参数泛型集合的“传递”