APP下载

VB系统开发中数据转换技术的研究与实现

2011-10-12唐淑玲

中国科技信息 2011年4期
关键词:窗体字段控件

唐淑玲

大连职业技术学院

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—),女,辽宁大连人,大连职业技术学院,讲师,研究方向为计算机应用。

猜你喜欢

窗体字段控件
图书馆中文图书编目外包数据质量控制分析
基于.net的用户定义验证控件的应用分析
试谈Access 2007数据库在林业档案管理中的应用
基于Qt的多窗体快速并行图形绘制方法研究
关于.net控件数组的探讨
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述
关于CNMARC的3--字段改革的必要性与可行性研究
基于嵌入式MINIGUI控件子类化技术的深入研究与应用
WinCE.net下图形用户界面的开发