首页 > 解决方案 > 从 sql 模块将 SQL 查询结果放入活动用户窗体上的对象中

问题描述

我在一个项目中有几个用户窗体,每个用户窗体都有不同的用户窗体名称,但我为对象使用统一的名称。例如,每个需要使用 SQL 查询的表单都有一个名为“团队”的对象,并使用相同的查询来拉取团队列表。每个表单在其代码中也有相同的查询,“with”语句更改为反映表单名称。我想做的只是在一个名为 SQL 或类似的模块中只有一个查询实例。这是我当前使用的查询类型的示例。

Sub GetTeams()
Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Server_Name = "SDL02-VM25"
Database_Name = "PIA"
SQLStr = "select distinct[team] from dbo.[Master Staffing List]  ORDER BY [team]"
Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & vbNullString
rs.Open SQLStr, Cn, adOpenStatic
With MasterStaffing.Team
.Clear
Do
.AddItem rs![Team]
rs.MoveNext
Loop Until rs.EOF
End With
rs.Close
Cn.Close
Set rs = Nothing
Set Cn = Nothing
Exit Sub
End Sub

我可以将“With MasterStaffing.Team”替换为引用当前处于活动状态的任何形式的内容吗?每个使用该查询的表单都会有一个名为 Team 的对象,因此唯一真正需要更改的是表单引用。这可以做到吗?

标签: sqlexcelvba

解决方案


将要加载的控件作为参数传递给常规模块中的子组件:

例如:

LoadTeams Me.Team

子被调用:

Sub LoadTeams(ctrl as Object)

    Dim Cn As ADODB.Connection
    Dim Server_Name As String
    Dim Database_Name As String
    Dim SQLStr As String
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    Server_Name = "SDL02-VM25"
    Database_Name = "PIA"
    SQLStr = "select distinct[team] from dbo.[Master Staffing List]  ORDER BY [team]"
    Set Cn = New ADODB.Connection
    Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & _
             Database_Name & vbNullString
    rs.Open SQLStr, Cn, adOpenStatic
    With ctrl
        .Clear
        Do
            .AddItem rs![Team]
            rs.MoveNext
        Loop Until rs.EOF
    End With
    rs.Close
    Cn.Close
    Set rs = Nothing
    Set Cn = Nothing

End Sub

如果您想进一步改进您的代码,请将数据库连接和查询分解为一个单独的函数,该函数接受 SQL 字符串并返回一个打开的记录集。


推荐阅读