VB系统开发中数据转换技术的研究与实现
2011-10-12唐淑玲
唐淑玲
大连职业技术学院
VB系统开发中数据转换技术的研究与实现
唐淑玲
大连职业技术学院
当前各系统数据之间的转换已成为各类用户所关心的问题,文章以大连职业技术学院实践教学及其设备实时管理系统开发为背景,简要叙述了VB访问数据库的特点,主要探讨了如何利用VB实现Excel数据与Access数据之间的相互转换,具有较强的实用性,减少了工作量,从而进一步推动了数据库技术和办公自动化技术的有机结合。
数据库;VB;EXCEL;ACCESS;ADO技术;数据转换
1 前言
课题《实践教学及其设备实时管理系统研究》是2009年度辽宁省教育科学规划立项课题,该课题以实践教学资源的科学合理规划、实施和管理为研究内容,以实践教学设备管理为研究对象,其主要目标是充分利用现有的软硬件资源,提高已有设备的利用率,强化高职学生的职业技能训练。
在对该系统进行规划时,我们考虑到实训设备的原始资料、各实训车间的基本资料、实习教学计划、各实训室的教学时间安排等原始资料大多数是以Excel文件形式存在的。为了充分利用原始数据,减少数据录入的麻烦,实现数据共享,我们设计了一个数据导入导出模块,主要是将实训计划、实习时间安排等Excel文件导入到系统数据库中来,然后将系统处理完成的数据资料再导出到Excel文件中去,以方便输出格式灵活的各种数据报表。为实现这一功能,我们决定在Visual Basic6.0、Microsoft Access2003及Excel2003环境下进行系统开发。
2 数据转换关键技术
2.1 AD0技术
在VB中实现Excel与Access之间的数据转换,依靠的是ADO技术。ADO(Activex Data Object)对象是DAO/RDO的后继产物,很多开发工具都支持这个对象,比如Visual Basic、ASP。它是Microsoft公司专门为适应网络数据库开发和客户端需求而推出的一种跨平台远程数据库访问技术。ADO扩展了DAO和RDO所使用的对象模型,它包含较少的对象、更多的属性、方法和事件,这使得ADO对象更容易使用。ADO通过OLEDB所提供的高性能数据访问方法,可以方便快速地对各种数据进行访问和操作。ADO可访问的数据源包括关系或非关系型数据库、电子邮件和文件系统、文本和图形、自定义业务对象,比如SQL-Server、Access、数据库,Excel、word文档等。
2.2 使用ADO访问数据库的两种方式
在VB中,使用ADO访问数据主要有两种方式,一种是非编程访问方式,使用ADO Data控件方式,通过对控件的绑定来访问数据库中的数据;另一种是ADO对象模型编程访问方式,通过定义对象和编写代码来实现对数据的访问。
2.3 ADO两种访问方式比较
使用ADO Data控件在连接数据库时,不需要创建连接对象和记录集对象,直接设置相关属性就可以了,简化了编程,但在功能上有所限制,对数据库的连接在程序运行时难以改变,在访问大型数据库时效率比较低。如果通过对象模型编程方式连接数据库时,则对数据库的操作非常灵活,效率上也会大大提高。本系统采用的是编程方式。
3 数据转换方法与步骤
3.1 主窗体设计
3.1.1 界面设计
主窗体上主要包括一个标签label1和两个命令按钮command1、command2控件,如图1所示。
图1 主窗体
3.1.2 窗体主要代码
Private Sub Command1_Click()
Form2.Show
Me.Hide
End Sub
Private Sub Command2_Click()
Form4.Show
Me.Hide
End Sub
3.1.3 公共变量及模块
首先要引用“Microsoft ActiveX Data Objects2.6 Library” 和“Microsoft Excel 11.0 Object Library”系统库。
公共变量及模块设置如下:
Public fn As String
Public fn1 As String
Public fncount As Integer
Public fn1count As Integer
Public conn As New ADODB.Connection
Public cn As New ADODB.Connection
Public Sub mdbcon()
conn.Open "provider=microsoft.jet.oledb.4.0;data source=" & fn &";persist security info=false"
conn.CursorLocation =adUseClient
End Sub
Public Sub xlscon()
Set cn = New ADODB.Connection
With cn
.Provider = "microsoft.jet.oledb.4.0;"
.ConnectionString = "data source=" & fn1 & " ;" & "extended properties= excel 8.0;"
.CursorLocation = adUseClient
.Open
End With
End Sub
3.2 Excel数据转换成Access数据设计
3.2.1 打开Excel文件的窗体设计,如图2所示。
图2 打开Excel文件窗体
3.2.1.1 该窗体包括的主要控件有:文本框控件(text1)用于显示所选文件路径;图像控件(Image1)用于打开对话框;对话框控件(cdl1)、组合框控件(combo1)用于显示表的名称;网格控件(dg1)用于显示Excel表中的记录;命令按钮(cmd1)用于调用下一个窗体。
3.2.1.2 主要代码:
Private Sub Image1_Click()
Label3.Visible = False
combo1.Clear
Dim rsxls As New ADODB.Recordset
cdl1.Filter = "Excel文件(*.xls)|*.xls|所有文件(*.*)|*.*"
cdl1.CancelError = True
cdl1.DialogTitle = "打开Excel文件"
cdl1.ShowOpen
fn1 = cdl1.FileName
Text1.Text = cdl1.FileName
If cn.State = adStateOpen Then
conn.Close
End If
Call xlscon
If fn1 = "" Then
MsgBox "请重新选择Excel文件!", vbInformation + vbOKOnly,"温馨提示"
End If
Set rsxls = cn.OpenSchema(adSchemaTables)
Do Until rsxls.EOF
combo1.AddItem rsxls!table_name
rsxls.MoveNext
Loop
rsxls.Close
Set rsxls = Nothing
End Sub
Private Sub Combo1_Click()
Dim i As Integer
Set dg1.DataSource = Nothing
dg1.Refresh
Label3.Visible = True
Dim oRS As New ADODB.Recordset
oRS.Open "Select * from [" &combo1.Text & "]", cn, adOpenStatic,adLockOptimistic
oRS.Update
i = oRS.RecordCount
fn1count = oRS.Fields.Count
Label3.Caption = "共有" & i& "条记录"
Label4.Caption = "共有" & oRS.Fields.Count & "个字段"
Set dg1.DataSource = oRS
dg1.Refresh
Cmd1.Enabled = True
End Sub
Private Sub Cmd1_Click()
Form3.Show
Me.Hide
End Sub
3.2.2 打开Access文件的窗体设计,如图3所示。
图3 打开Access文件窗体
3.2.2.1 该窗体包括的主要控件有:文本框控件(text1)用于显示所选文件路径;图像控件(Image1)用于打开对话框;对话框控件(cdl2)、组合框(com1)用于显示表的名称; 网格控件(msg1)用于显示Access数据库中表的结构信息(字段名称、字段大小、字段类型):命令按钮(cmd1)用于执行“导入”命令。
3.2.2.2 主要代码:
Private Sub Image1_Click()
Dim rs As New ADODB.Recordset
cd1.Filter = "Access文件(*.mdb)|*.mdb|所有文件(*.*)|*.*"
cd1.CancelError = True
cd1.DialogTitle = "打开Access文件"
cd1.ShowOpen
fn = cd1.FileName
Text1.Text = fn
If fn = "" Then
MsgBox "请重新选择Access文件!", vblnformation + vbOKOnly
End If
If conn.State = adStateOpen Then
conn.Close
com1.Clear
End If
Call mdbcon
Set rs = conn.OpenSchema(adSchemaTables)
Do Until rs.EOF
If Left(rs!table_name, 4) <>"MSys" Then
com1.AddItem rs!table_name
End If
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Private Sub com1_Click()
Dim P As Integer
Dim sr As New ADODB.Recordset
sr.Open com1.Text, conn,adOpenKeyset, adLockOptimistic
Label3.Visible = True
Label3.Caption = "共有" & sr.Fields.Count & "个字段"
fncount = sr.Fields.Count
With msg1
.Rows = sr.Fields.Count + 1
For P = 1 To sr.Fields.Count
.TextMatrix(P, 1) = P
.TextMatrix(P, 2) = sr.Fields(P- 1).Name
.TextMatrix(P, 3) = sr.Fields(P- 1).Type
.TextMatrix(P, 4) = sr.Fields(P- 1).DefinedSize
Next P
End With
sr.Close
Set sr = Nothing
Cmd1.Enabled = True
End Sub
Private Sub Cmd2_Click()
Dim i As Integer
Dim S As Integer
Dim rst As New ADODB.Recordset
Dim rs As New ADODB.Recordset
If fnlcount > fncount Then
rst.Open "Select * from [" &Form2.combo1.Text & "]", cn,adOpenDynamic
rs.Open "select * from " &com1.Text & " ", conn,adOpenDynamic, adLockOptimistic
rs.MoveLast
i = rst.RecordCount
Do While Not rst.EOF
On Error Resume Next
rs.AddNew
For S = 0 To fn1count - 1
rs.Fields(S) = rst.Fields(S)
Next S
rs.MoveNext
rst.MoveNext
i = i - 1
If i = 0 Then
Form3.Caption = "数据导入完毕!"
rs.Update
MsgBox "已成功导入" & rst.RecordCount & "条记录!",vblnformation, "温馨提示"
Cmd2.Caption = "关闭"
Else
Form3.Caption = "数据正在导入,请稍候........"
End If
Loop
Else
MsgBox "Excel表数据字段数大于Access表数据字段数!",vbExclamation, " 温馨提示"
End If
rs.Close
rst.Close
Set rs = Nothing
Set rst = Nothing
Cmd1.Enabled = False
End Sub
3.3 Access数据转换成Excel数据设计
3.3.1 界面设计,如图4所示。
图4 Access数据转换成Excel数据窗体
3.3.2 该窗体包括的主要控件有:文本控件(text1)用于显示所选文件路径;图像控件(image1)用于打开对话框;对话框控件(cmdg1)、组合框(combo1)用于显示表的名称;列表框控件(1ist1)用于显示Access数据库中表的字段名称;命令按钮(cmd1)用于执行“导出” 命令。
3.3.3 主要代码:
Private Sub Image1_Click()
Dim rsl As New ADODB.Recordset
Cmdg1.Filter = "Access文件(*.mdb)|*.mdb|所有文件|*.*"
Cmdg1.CancelError = True
Cmdg1.DialogTitle = "打开Access文件"
Cmdg1.ShowOpen
fn = Cmdg1.FileName
Text1.Text = Cmdg1.FileName
If fn = "" Then
MsgBox "请重新选择Access文件!", vblnformation + vbOKOnly
End If
If conn.State = adStateOpen Then
conn.Close
Combo1.Clear
End If
Call mdbcon
Set rs1 = conn.OpenSchema(adSchemaTables)
Do Until rs1.EOF
If Left(rs1!table_name, 4) <>"MSys" Then
Combo1.AddItem rs1!table_name
End If
rs1.MoveNext
Loop
rs1.Close
Set rs1 = Nothing
End Sub
Private Sub Cmd1_Click()
Dim rst As New ADODB.Recordset
rst.Open "select " & Left(Trim(Text1.Text), Len(Trim(Text1.Text))- 1) & " from " & Combo1.Text &" ", conn, adOpenDynamic,adLockOptimistic
Dim xlsapp As Excel.Application
Dim xlsbook As Excel.Workbook
Dim xlsSheet As Excel.Worksheet
Dim i, j As Long
Set xlsapp = CreateObject("excel.application")
Set xlsbook = xlsapp.Workbooks.Add
Set xlsSheet = xlsbook.Worksheets(1)
On Error Resume Next
j = 1
Do Until rst.EOF
For i = 1 To rst.Fields.Count
xlsSheet Cells(j, i) = rst.Fields(i - 1)
Next i
rst.MoveNext
j = j + 1
Loop
xlsapp.Visible = True
xlsbook.SaveAs App.Path & "导出数据.xls"
Set xlsapp = Nothing
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing
Unload Me
Unload fm
End Sub
Private Sub Combo1_Click()
Dim i As Integer
Dim srs As New ADODB.Recordset
List1.Clear
srs.Open Combo1.Text, conn,adOpenKeyset, adLockOptimistic
i = srs.Fields.Count
For i = O To srs.Fields.Count- 1
List1.AddItem srs.Fields(i).Name
Next i
srs.Close
Set srs = Nothing
End Sub
4 结束语
从上面的研究中可以看出,利用VB实现Excel数据与Access数据之间的相互转换,代码简单,容易实现,减少了工作量。Access数据转换成Excel数据时,可通过列表框控件选取需要导出的信息; Excel数据转换成Access数据时,Excel表中的字段顺序要和Access表中的字段顺序一致,不能更改Access表中字段的顺序。
10.3969/j.issn.1001-8972.2011.04.047
本文是省级立项课题《实践教学及其设备实时管理系统研究》研究论文课题审批单位:辽宁省教育科学规划领导小组办公室
课题批准号:JG09DB288
唐淑玲(1972—),女,辽宁大连人,大连职业技术学院,讲师,研究方向为计算机应用。