唐淑玲
大連職業(yè)技術(shù)學(xué)院
VB系統(tǒng)開發(fā)中數(shù)據(jù)轉(zhuǎn)換技術(shù)的研究與實現(xiàn)
唐淑玲
大連職業(yè)技術(shù)學(xué)院
當(dāng)前各系統(tǒng)數(shù)據(jù)之間的轉(zhuǎn)換已成為各類用戶所關(guān)心的問題,文章以大連職業(yè)技術(shù)學(xué)院實踐教學(xué)及其設(shè)備實時管理系統(tǒng)開發(fā)為背景,簡要敘述了VB訪問數(shù)據(jù)庫的特點,主要探討了如何利用VB實現(xiàn)Excel數(shù)據(jù)與Access數(shù)據(jù)之間的相互轉(zhuǎn)換,具有較強的實用性,減少了工作量,從而進一步推動了數(shù)據(jù)庫技術(shù)和辦公自動化技術(shù)的有機結(jié)合。
數(shù)據(jù)庫;VB;EXCEL;ACCESS;ADO技術(shù);數(shù)據(jù)轉(zhuǎn)換
課題《實踐教學(xué)及其設(shè)備實時管理系統(tǒng)研究》是2009年度遼寧省教育科學(xué)規(guī)劃立項課題,該課題以實踐教學(xué)資源的科學(xué)合理規(guī)劃、實施和管理為研究內(nèi)容,以實踐教學(xué)設(shè)備管理為研究對象,其主要目標(biāo)是充分利用現(xiàn)有的軟硬件資源,提高已有設(shè)備的利用率,強化高職學(xué)生的職業(yè)技能訓(xùn)練。
在對該系統(tǒng)進行規(guī)劃時,我們考慮到實訓(xùn)設(shè)備的原始資料、各實訓(xùn)車間的基本資料、實習(xí)教學(xué)計劃、各實訓(xùn)室的教學(xué)時間安排等原始資料大多數(shù)是以Excel文件形式存在的。為了充分利用原始數(shù)據(jù),減少數(shù)據(jù)錄入的麻煩,實現(xiàn)數(shù)據(jù)共享,我們設(shè)計了一個數(shù)據(jù)導(dǎo)入導(dǎo)出模塊,主要是將實訓(xùn)計劃、實習(xí)時間安排等Excel文件導(dǎo)入到系統(tǒng)數(shù)據(jù)庫中來,然后將系統(tǒng)處理完成的數(shù)據(jù)資料再導(dǎo)出到Excel文件中去,以方便輸出格式靈活的各種數(shù)據(jù)報表。為實現(xiàn)這一功能,我們決定在Visual Basic6.0、Microsoft Access2003及Excel2003環(huán)境下進行系統(tǒng)開發(fā)。
在VB中實現(xiàn)Excel與Access之間的數(shù)據(jù)轉(zhuǎn)換,依靠的是ADO技術(shù)。ADO(Activex Data Object)對象是DAO/RDO的后繼產(chǎn)物,很多開發(fā)工具都支持這個對象,比如Visual Basic、ASP。它是Microsoft公司專門為適應(yīng)網(wǎng)絡(luò)數(shù)據(jù)庫開發(fā)和客戶端需求而推出的一種跨平臺遠(yuǎn)程數(shù)據(jù)庫訪問技術(shù)。ADO擴展了DAO和RDO所使用的對象模型,它包含較少的對象、更多的屬性、方法和事件,這使得ADO對象更容易使用。ADO通過OLEDB所提供的高性能數(shù)據(jù)訪問方法,可以方便快速地對各種數(shù)據(jù)進行訪問和操作。ADO可訪問的數(shù)據(jù)源包括關(guān)系或非關(guān)系型數(shù)據(jù)庫、電子郵件和文件系統(tǒng)、文本和圖形、自定義業(yè)務(wù)對象,比如SQL-Server、Access、數(shù)據(jù)庫,Excel、word文檔等。
在VB中,使用ADO訪問數(shù)據(jù)主要有兩種方式,一種是非編程訪問方式,使用ADO Data控件方式,通過對控件的綁定來訪問數(shù)據(jù)庫中的數(shù)據(jù);另一種是ADO對象模型編程訪問方式,通過定義對象和編寫代碼來實現(xiàn)對數(shù)據(jù)的訪問。
使用ADO Data控件在連接數(shù)據(jù)庫時,不需要創(chuàng)建連接對象和記錄集對象,直接設(shè)置相關(guān)屬性就可以了,簡化了編程,但在功能上有所限制,對數(shù)據(jù)庫的連接在程序運行時難以改變,在訪問大型數(shù)據(jù)庫時效率比較低。如果通過對象模型編程方式連接數(shù)據(jù)庫時,則對數(shù)據(jù)庫的操作非常靈活,效率上也會大大提高。本系統(tǒng)采用的是編程方式。
3.1.1 界面設(shè)計
主窗體上主要包括一個標(biāo)簽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”系統(tǒng)庫。
公共變量及模塊設(shè)置如下:
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.1 打開Excel文件的窗體設(shè)計,如圖2所示。
圖2 打開Excel文件窗體
3.2.1.1 該窗體包括的主要控件有:文本框控件(text1)用于顯示所選文件路徑;圖像控件(Image1)用于打開對話框;對話框控件(cdl1)、組合框控件(combo1)用于顯示表的名稱;網(wǎng)格控件(dg1)用于顯示Excel表中的記錄;命令按鈕(cmd1)用于調(diào)用下一個窗體。
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文件的窗體設(shè)計,如圖3所示。
圖3 打開Access文件窗體
3.2.2.1 該窗體包括的主要控件有:文本框控件(text1)用于顯示所選文件路徑;圖像控件(Image1)用于打開對話框;對話框控件(cdl2)、組合框(com1)用于顯示表的名稱; 網(wǎng)格控件(msg1)用于顯示Access數(shù)據(jù)庫中表的結(jié)構(gòu)信息(字段名稱、字段大小、字段類型):命令按鈕(cmd1)用于執(zhí)行“導(dǎo)入”命令。
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 = "數(shù)據(jù)導(dǎo)入完畢!"
rs.Update
MsgBox "已成功導(dǎo)入" & rst.RecordCount & "條記錄!",vblnformation, "溫馨提示"
Cmd2.Caption = "關(guān)閉"
Else
Form3.Caption = "數(shù)據(jù)正在導(dǎo)入,請稍候........"
End If
Loop
Else
MsgBox "Excel表數(shù)據(jù)字段數(shù)大于Access表數(shù)據(jù)字段數(shù)!",vbExclamation, " 溫馨提示"
End If
rs.Close
rst.Close
Set rs = Nothing
Set rst = Nothing
Cmd1.Enabled = False
End Sub
3.3.1 界面設(shè)計,如圖4所示。
圖4 Access數(shù)據(jù)轉(zhuǎn)換成Excel數(shù)據(jù)窗體
3.3.2 該窗體包括的主要控件有:文本控件(text1)用于顯示所選文件路徑;圖像控件(image1)用于打開對話框;對話框控件(cmdg1)、組合框(combo1)用于顯示表的名稱;列表框控件(1ist1)用于顯示Access數(shù)據(jù)庫中表的字段名稱;命令按鈕(cmd1)用于執(zhí)行“導(dǎo)出” 命令。
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 & "導(dǎo)出數(shù)據(jù).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
從上面的研究中可以看出,利用VB實現(xiàn)Excel數(shù)據(jù)與Access數(shù)據(jù)之間的相互轉(zhuǎn)換,代碼簡單,容易實現(xiàn),減少了工作量。Access數(shù)據(jù)轉(zhuǎn)換成Excel數(shù)據(jù)時,可通過列表框控件選取需要導(dǎo)出的信息; Excel數(shù)據(jù)轉(zhuǎn)換成Access數(shù)據(jù)時,Excel表中的字段順序要和Access表中的字段順序一致,不能更改Access表中字段的順序。
10.3969/j.issn.1001-8972.2011.04.047
本文是省級立項課題《實踐教學(xué)及其設(shè)備實時管理系統(tǒng)研究》研究論文課題審批單位:遼寧省教育科學(xué)規(guī)劃領(lǐng)導(dǎo)小組辦公室
課題批準(zhǔn)號:JG09DB288
唐淑玲(1972—),女,遼寧大連人,大連職業(yè)技術(shù)學(xué)院,講師,研究方向為計算機應(yīng)用。