多数从事数据库编程人员都经历过,对新接触的数据库技术无论是低版本Foxbase、Access97-2000还是支持网络环境高版本的Sql Server2000和 Oracel等系统,都经过一个循循渐进、吃苦耐劳学习过程,达到知识技术从量变到质变的过程,才能把数据库编程水平提高一步。
本文介绍TreeView(树视图) 遍历SQL Server2000数据库的方法及实现过程,在这个过程中利用TreeView(树视图)控件的设置、定义、赋值将数据库的表名显示在TreeView(树视图)中,详见-[图1];同时提供数据库编程朋友们有一个对数据库加深理解、加深认识、大胆实践、举一反三的过程,
一、数据库字典信息
动态的数据库系统内部,均有负责监控各个表、过程存储的【创建-删除】及表中字段【编辑-增、删、改】变化信息的文件,笔者称为:数据库字典。细心的朋友会注意到:在Sql Server2000数据库下,凡打开一个数据库,就会发现一个名称:sysobjects的系统文件,它在我们创建一个表或删除一个表操作变化过程中,它会认真记录下,[包括文件分类:系统和用户]相关信息,其中以下两个字段对我们本文内容的介绍是个关键;字段名为:①.Name[定义:sysname,128-宽度,[属性]:不允许空] ②.Xtype[定义: Char,2-宽度,[属性]:不允许空]。请见-[图 2]下面是在SQLServe2000 查询窗口上,调用这个sysobjects文件显示的图例。
二、在VB6.0中实现TreeView(树视图)遍历数据库的方法
由于我们使用的Sql Server2000的数据库系统,主要是对‘表’ (二维表[列,行])进行操作;笔者采用的方法是用VB6.0通过ADO方式与SERVER2000数据库进行连接,打开[数据库字典sysobjects],取出Name字段的内容,同时,将内容装入树视图TreeView控件中,显示在窗体的左侧。具体步骤:
1>.窗体组成和布局
*.主要组成:
①. TreeView控件,名称:TreeView1; ②.ListView控件,名称:LV1
③CommandButton控件,名称:Command2; ④.ImageLIst控件, 名称:ImageList1
⑤.TextBox 控件,名称:Text1; ⑥.TextBox控件,名称:Text2
*.布局:
如图1所示,处于左、右两面的TreeView控件和ListView控件是分别存放数据库全部表名;数据库表的全部记录;窗体底部的两个文本框分别是显示数据库表的个数和打开表后记录的总数;命令按钮是执行TreeView(树视图)遍历数据库的按钮;ImageList控件是装入表名前的图片控件。
2>.数据库的连接
请看下列代码:
Private Sub Form_Load() '在窗体入口
If Not SqlOpenADOConnection(m_Cnn) Then Exit Sub
'用一条条件语句与Server2000数据库连接
SQL End Sub
*.bas ’在模块中响应窗体过程调用代码;
Option Explicit ' 一些 ADO 常数定义:
Public Const adOpenStatic = 3
Public Const adOpenKeyset = 1
Public Const adLockOptimistic = 3
Public Const adLockBatchOptimistic = 4
Public Function SqlOpenADOConnection(pCnn As Object) As Boolean
On Error GoTo ErrorHandler
Set pCnn = CreateObject("ADODB.Connection") ' 对数据库连接方式
pCnn.Open"UserID=sa;pwd=;driver={SQLServer};Server=User2;Database=Northwind;dsn=" SqlOpenADOConnection = True
Exit Function
…… '略
End Function
3>.变量定义和树视图TreeView控件的初始
请看下列代码:
*>.窗体的变量定义:
Dim Ssql1 As String
Dim nodx As Node
Dim SQl, Str1 As String '定义字符串
Dim K, P, Q As Integer '定义字符的长度
Dim No_01 As Integer
Private m_Cnn As Object ' ADODB连接
*>.初始TreeView控件
Private Sub Form_Load()
TreeView1.LineStyle = tvwTreeLines '在兄弟节点和父节点之间显示线
TreeView1.ImageList = ImageList1 '链接图像列
TreeView1.Style = tvwTreelinesPlusMinusPictureText
End Sub
4>.树视图TreeView遍历数据库的方法
命令按钮代码(以下的代码完成了图1左面树视图TreeView遍历数据库效果):
Private Sub Command2_Click()
Dim Rs_Table As New ADODB.Recordset
Dim i As Integer
Text1.Text = ""
TreeView1.Sorted = True
Set nodx = TreeView1.Nodes.Add(, , "数据库信息", "数据库信息", 1)
nodx.Text = "数据库信息"
nodx.Tag = "请双击文件夹"
nodx.Image = "close"
Rs_Table.CursorLocation = adUseClient
'取得到所有[用户级]表名
Rs_Table.Open "SELECT name From sysobjects WHERE xtype = 'u'", _
m_Cnn, adOpenDynamic, adLockReadOnly
Rs_Table.MoveFirst
No_01 = 0
Do While Not Rs_Table.EOF
No_01 = No_01 + 1
Str1 = CStr(No_01) + "-" + Rs_Table.Fields("name")
Set nodx = TreeView1.Nodes.Add(1, tvwChild, Str1 & " id", Str1, 1)
Text1.Text = CStr(No_01)
Rs_Table.MoveNext
Loop
Rs_Table.Close
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded = True '展开所有节点
Next i
Set Rs_Table = Nothing
End Sub
三、用ListView显示表记录的技巧
这里为了让数据库编程朋友们加深对SQLServer2000的理解与认识,在下面给出执行[用鼠标单击‘表名’],屏幕的右方ListView将显示表全部记录;在此调用的过程中,笔者将描述:【表的字段类型;字段宽度;字段实际宽度的格式,在代码(2).中间标有Debug.Print的两行列出】此段代码对研究数据库结构技术的朋友们有实用价值。请看下列代码:
(1). [用鼠标单击‘表名’]后的代码
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim RS As New ADODB.Recordset '定义数据集
Dim K, W, i As Integer
Ssql1 = ""
Ssql1 = Node.Text
K = Len(Ssql1)
W = 1
For W = 1 To K
If Mid(Ssql1, W, 1) = "-" Then
Ssql1 = Mid(Ssql1, W + 1, K - W)
Exit For
End If
Next W
'本循环为了剔除在TreeView中数据库表的编号及'-',适应表名调用。
If Ssql1 = "数据库信息" Then
'TreeView收起所有节点[单击--收起|双击--展开]
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded = False
Next i
Exit Sub
End If
Q = 0
If Len(Ssql1) > 0 Then
RS.Open Ssql1, m_Cnn
If RS.Fields.Count > 0 Then
listrec RS, LV1
RS.Close
End If
End If
Set RS = Nothing
End Sub
(2)。右方ListVie w将显示表全部记录的代码
Sub listrec(ByRef RS As Recordset, ByRef LV1 As ListView)
'将选中的记录集(含字段名)显示在ListView中
Dim head As ColumnHeader
Dim Item As ListItem
Dim i As Integer
K = 0 '初始化listview的某些属性
LV1.View = lvwReport
LV1.GridLines = True
LV1.LabelEdit = lvwManual
LV1.ListItems.Clear
LV1.ColumnHeaders.Clear
For i = 0 To RS.Fields.Count - 1 '处理ListView的表头-字段名
Set head = LV1.ColumnHeaders.Add
head.Text = RS.Fields(i).Name
Debug.Print CStr(i), head.Text, "A=", FieldType(RS.Fields(i).Type)
Debug.Print
CStr(i),"B=",RS.Fields(i).DefinedSize,"C-", RS.Fields(i).ActualSize
Next
While Not RS.EOF '装入该表的所有记录
Set Item = LV1.ListItems.Add
Item.Text = "" & RS.Fields(0).Value
For i = 1 To RS.Fields.Count - 1
Item.SubItems(i) = "" & RS.Fields(i).Value
Next
K = K + 1
RS.MoveNext
Wend
Text2.Text = ""
Text2.Text = CStr(K)
End Sub
四、小结
---- 1.从以上对TreeView(树视图)遍历数据库方法的介绍,仅起一个抛砖引玉作用,希望编程爱好者、朋友们多提宝贵意见,借【软件报】的技术平台多交流经验、互帮互学、共同提高。
---- 2.特别值得一提的是,文中提到的与数据库连接方式,采用了在应用软件的窗体装入时,以一个带参数的函数调用来实现的。我也是近期才开始这样连接数据库。觉得既方便又简练;摆脱了过去进入系统就打开数据库,退出时关闭数据库的方式,缺乏条理性,浪费语句不少,请大家多提宝贵意见。
---- 3.文中代码部分有Debug.print ……, FieldType(RS.Fields(i).Type)语句是一个过程调用,它的作用是将字段的类型代号转换为类型字符。(如:代号=3;INT)方便阅读。此段过程代码可在网上查询或与笔者联系提供。
---- 4.文中没有对TreeViee(树视图)和ListView的使用做过多的介绍;我想,编程的朋友,只要用实例串几次,来个举一反三、就会完全掌握。此处不做过多赘述。