足球小将世界杯国语版1:【新提醒】[原创]ADO+SQL(非ADP方式链接),解决“组合框的行来源”的方法 - A...

来源:百度文库 编辑:九乡新闻网 时间:2024/05/17 08:57:35

[ADO/DAO] [原创]ADO+SQL(非ADP方式链接),解决“组合框的行来源”的方法 [复制链接]

鱼儿游游
  • 发短消息
  • 加为好友
鱼儿游游 当前离线
威望
0 点 
金钱
595 ¥ 
最后登录
2011-5-8 
注册时间
2008-8-10 
帖子
477 
精华
积分
1050 
阅读权限
70 
UID
137067 

金牌会员

金牌会员, 积分 1050, 距离下一级还需 1950 积分 1# 发表于 2011-1-3 03:50 |只看该作者 |倒序浏览 |打印 本帖最后由 鱼儿游游 于 2011-1-5 18:35 编辑

      [原创]ADO链接SQL Server 数据库(非ADP方式),解决“组合框和列表框的行来源”的方法。
       编写程序时,直接用ADO的方式链接SQL Server 数据库(非ADP方式),这样数据库就完全不存在表了,对于窗体直接把ADO记录集绑定到窗体,安全性自然大大加强,如此就只需要启动之后创建一个全局ADO.Connection变量,其它记录集就直接引用它就行了。但这样带来一个问题,就是用了这种方式之后,窗体的组合框和列表框的行来源就没有办法像平时那样设为SQL语句,系统会自动使用记录集进行填充。
       用以下方法,当记录集改变后,调用以下的过程(相当于动态使用),能很好地解决以上问题。

本帖隐藏的内容

'======================================================================
' 模块功能:设置组合框的行记录源
'
' 调用参数:objComboBox --- 组合框名称
'                  strSQL ------------- SQL语句               
' 注意事项:1、调用前先创建一个全局变量 adoCn 用于建立与SQL Server 的链接,并建立链接。
'                   2、在窗体上设好组合框的有关参数。
' 调用示例:
'       strSQL_1 = "SELECT UserId, UserName, Password,IsEnabled FROM USysUsers"
'       strSQL_2 = "SELECT * FROM USysUsers"
'       SetComboBox_RowSource Me.Combo_1, strSQL_1
'       SetComboBox_RowSource Me.Controls("Combo_2"), strSQL_2
'
'  作       者: 鱼儿游游
'  创建时间: 2010.11.5
'=======================================================================
Public Sub SetComboBox_RowSource(objComboBox As Object, ByVal strSQL As String)
   
    On Error GoTo Err_SetComboBox_RowSource
   
    Dim Rs As New ADODB.Recordset    '临时记录集
    Dim arrField() As String         '只能是字符串类型
    Dim strFieldList As String
    Dim strValueList As String
    Dim iPos1 As Integer
    Dim iPos2 As Integer
    Dim i As Integer
   
    Rs.Open strSQL, adoCn, 1, 1
   
    '取字段
    If InStr(1, strSQL, "*") = 0 Then
       '指定了字段表
       iPos1 = InStr(1, strSQL, "SELECT") + Len("SELECT")
       iPos2 = InStr(1, strSQL, "FROM")
       strFieldList = Mid(strSQL, iPos1 + 1, iPos2 - iPos1 - 1)
       arrField = Split(strFieldList, ",")
       For i = LBound(arrField) To UBound(arrField)
           arrField(i) = Trim(arrField(i))
       Next i
    Else
       '没有指定字段表,列出所有字段
       ReDim arrField(Rs.Fields.Count - 1)
       For i = 0 To Rs.Fields.Count - 1
          arrField(i) = Rs.Fields(i).Name
       Next
    End If
   
    '设置值列表
    With objComboBox
       .RowSource = ""
       .RowSourceType = "Value List"
       .ColumnCount = UBound(arrField) - LBound(arrField) + 1
       Do While Not Rs.EOF
           strValueList = ""
           For i = LBound(arrField) To UBound(arrField)
                strValueList = strValueList & Nz(Rs.Fields(arrField(i)).Value) & ";"
           Next i
           strValueList = Left(strValueList, Len(strValueList) - 1)  '此句好象不需要,效果一样
           .AddItem strValueList
           Rs.MoveNext
        Loop
    End With
     
Exit_SetComboBox_RowSource:
    '关闭记录集,并释放变量
    If rs.State <> adStateClosed Then rs.Close
    Set rs = Nothing
    Exit Sub
   
Err_SetComboBox_RowSource:
    '与数据库断开连接,则重新连接
    If cn.State = adStateClosed Then
         If SQLConnectToServer Then Resume
    End If
    Resume Exit_SetComboBox_RowSource
   
End Sub