数据访问层使用参数填充组合框

Posted

技术标签:

【中文标题】数据访问层使用参数填充组合框【英文标题】:Data Access Layer Populate Combobox With Parameters 【发布时间】:2014-07-29 02:14:51 【问题描述】:

我正在使用 VB.Net (Visual Studio 2013) 和 N 层架构来填充组合框列表。我的课程代码如下

    Public Shared Function List() As List(Of AppName.BusinessLogic.BLL_RMCodeComboClass)
    Dim dbo_RMCodeList As New List(Of AppName.BusinessLogic.BLL_RMCodeComboClass)
    Dim connTemp As SqlConnection = AppClass.GetConnection
    Dim strSelectSQL As String = "SELECT [RMCode] FROM [dbo].[RMMaster] WHERE [dbo].[RMMaster].[Category] = '" & strRMType & "'"
    Dim strCommandSelect As New SqlCommand(strSelectSQL, connTemp)
    Try
        connTemp.Open()
        Dim rdrTemp As SqlDataReader = strCommandSelect.ExecuteReader()
        Dim clsdbo_RMCodeList As AppName.BusinessLogic.BLL_RMCodeComboClass
        Do While rdrTemp.Read
            clsdbo_RMCodeList = New BusinessLogic.BLL_RMCodeComboClass
            clsdbo_RMCodeList.RMCode = System.Convert.ToString(rdrTemp("RMCode").ToString)
            dbo_RMCodeList.Add(clsdbo_RMCodeList)
        Loop
        rdrTemp.Close()
    Catch ex As SqlException
        Throw ex
    Finally
        connTemp.Close()
    End Try
    Return dbo_RMCodeList
End Function

我的目标是根据类型使用 RMCode 检索或填充组合框。因此,我相应地使用了 strSelectSQL。请帮我将 Category 的值传递给这个函数,使它变成动态的。 Type 的值是从表示/UI 层上的另一个组合框中选择的,因此应根据所选的 Category 填充 Code 字段。

提前致谢 CL

【问题讨论】:

除了回答您的问题之外,您还应该对代码进行一些更改以使其更好。首先,您的数据访问层依赖于您的业务逻辑层是非常糟糕的。它应该永远是相反的。 DAL 创建并传递给 BLL 的对象应该在 DAL 中定义,或者在 BLL 和 DAL 都引用的单独项目中定义。 DAL 甚至不应该知道 BLL 的存在。 其次,在 Catch 块中包含 Throw ex 是不好的。如果你想重新抛出相同的异常,那么你应该使用Throw。这将重新抛出原始状态的异常,而您正在执行的操作将截断堆栈跟踪,使其看起来像是源自您的方法的异常。也就是说,您的 Catch 块完全没有意义。您只需提供CatchFinally 块之一,并且您已经有Finally,因此只需省略Catch 第三,如果你实际上并没有在Catch 块中做任何事情,而你的Finally 块除了处理对象什么都不做,那么你就不需要它。使用Using 语句创建可以被释放的对象,无论是否抛出异常,它们都会自动在End Using 语句处。 感谢和抱歉迟到的回复,jmcilhinney 的提示对我帮助很大。这是我在 N 层的第一次尝试。我仅从浏览网页开始遵循引用/依赖关系。它对项目的部署方式有什么影响吗?该项目将部署在客户端机器和服务器上。请建议或将我指向更具体的链接,在那里我可以获得更多帮助。再次感谢和抱歉。 CL 【参考方案1】:

例如

Private Function List(type As String) As List(Of Thing)
    '...

    Dim command As New SqlCommand("SELECT * FROM MyTable WHERE @Type IS NULL OR Type = @Type")

    command.Parameters.Add("@Type",
                           SqlDbType.NVarChar,
                           50).Value = If(String.IsNullOrEmpty(type),
                                          CObj(DBNull.Value),
                                          type)

    '...
End Function

这使得过滤器是可选的。如果传入Nothing 或空的String,则SQL 参数为NULL 并且每条记录都匹配,否则结果集将按传入的值过滤。

【讨论】:

以上是关于数据访问层使用参数填充组合框的主要内容,如果未能解决你的问题,请参考以下文章

使用组合列访问数据库填充组合框

使用访问表名称填充组合框

VB.NET 仅从一个字段访问填充组合框

访问 VBA - 使用 VBA 的 SQL 语句使用文本框组合框值在表单上填充列表框 OR

访问查询/组合框

组合框中的数据未反映在访问报告中