關鍵詞:作者羅姍
眾所周知,VB.NET自身並不具備對數據庫進行操作的功能,它對數據庫的處理是通過.NET FrameWork SDK中面向數據庫編程的類庫和微軟的MDAC來實現的。其中,ADO.NET又是.NET FrameWork SDK中重要的組成部分。要了解VB.NET的數據庫編程,首先要明白ADO.NET的工作原理以及相關的對象、方法、屬性。本文將結合具體實例為你簡單介紹ADO.NET數據庫訪問對象以及VB.NET數據庫編程基本方法。
一、ADO.NET數據庫訪問對象
(一)ADO.NET簡介
ADO.NET是由微軟Microsoft ActiveX Data Object(ADO)升級發展而來的。是在.NET中創建分布式數據共享程序的開發接口。ADO.NET的數據存取API提供兩種數據訪問方式,分別用來識別並處理兩種類型的數據源,即SQL Server7.0(及更高的版本)和可以通過OLE DB進行訪問的其他數據源。為此ADO.NET中包含了兩個類庫,System.Data.SQL庫可以直接連接到SQL Server的數據,System.Data.ADO庫可以用於其他通過OLE DB進行訪問的數據源。如Access數據。
(二)ADO.NET的名稱空間
ADO.NET是圍繞System.Data基本名稱空間設計,其他名稱空間都是從System.Data派生而來。它們使得ADO.NET不僅訪問DataBase中的數據,而且可以訪問支持OLE DB的數據源。
當我們討論ADO.NET時,實際討論的是System.Data和System.Data.OleDb名稱空間。這兩個空間的所有類幾乎都可以支持所有類型的數據源中的數據。這里我們討論與后文實例有關的類。即OleDbconnection、OleDbDataAdapter、DataSet和DataView。
上面列舉的類中沒有OleDb前綴的,派生自System.Data空間,有此前綴的派生自System.Data.OleDb空間。在使用中,如果要引用OleDb前綴的類,必須導入System.Data.OleDb名稱空間。語法如下:
Imports System.Data.OleDb
使用沒有此前綴的類必須導入System.Data名稱空間。語法如下:
Imports System.Data
1.OleDbConnection類
OleDbConnection類提供了一個數據源連接。這個類的構造函數接受一個可選參數,稱為連接字符串。
(1)連接字符串:
連接字符串本身由下表中列出的參數構成。(
圖)
我們來看一下如何在連接字符串上使用參數來初始化一個連接對象。
Dim objconnecttion as OleDbConnection=New OleDbConnection(″Provider=SQLOLEDB;″&″DataSource=localhost;Initial Catalog=pubs;″&″UserID=liuguo;Password=1234;″)
上面的連接字符串使用SQLOLEDB提供者訪問SQL Server數據庫。Data Source參數指定數據庫位於本地機器上,Initial Catalog參數表示我們要訪問的數據庫名稱是“pubs”。
(2)打開和關閉數據庫:
一旦用上面的方法初始化了一個連接對象,就可以調用OleDbConnection類的任何方法來操作數據。其中打開與關閉數據庫方法是任何操作的基本環節。
打開數據庫:objConnection.Open()
關閉數據庫:objConnection.Close()
OleDbConnection類的其他方法與屬性請查閱相關手冊。
2.OleDbDataAdapter類
OleDbDataAdapter類可以在所有OLE DB數據源中讀寫數據,並且可以設置為包含要執行的SQL語句或者存儲過程名。OleDbDataAdapter類並不真正存儲任何數據,而是作為DataSet類和數據庫之間的橋梁。
(1)SelectCommand屬性:
要從數據庫中讀取數據,必須首先設置OleDbDataAdapter類的SelectCommand屬性。該屬性用來指定選取哪些數據以及如何選取數據。
(2)Fill方法:
Fill方法用來完成向DataSet對象中填充由OleDbDataAdapter對象從數據庫中檢索的數據。其語法如下:
Fill(DataSet,String)
其中,DataSet參數用於指定一個有效的DataSet對象,將用數據進行填充;String參數指定了用於表映射的表名稱。
(3)DataView類:
DataView類一般用於從DataSet類中排序、過濾、查找、編輯和導航數據。與DataSet一樣其內部數據使用的是DataTable對象。DataView類是DataTable對象的一個自定義視圖。同時DataView中的數據又獨立於DataSet中DataTable包含的數據,所以可以對數據進行操作而又不會影響DataSet中的數據。其主要方法與屬性如下:
Sort方法:對DataView包含的數據進行排序。語法如下:
objDataView.Sort = ″排序條件″
Find方法:在DataView搜索指定的數據行。語法如下:
rec=objDataView.Find(″指定條件″)
注意:Find方法查找不區分大小寫;如果找到一個匹配數據,Find方法將返回其在DataView中記錄位置,否則返回-1。
有關DataView的其他方法與屬性請查閱相關手冊。
(三)ADO.NET的核心組件
ADO.NET的核心組件主要包括:
Connections:連接管理數據庫事務。
Commands:向數據庫發送的操作命令。
DataReaders:直接讀取流數據。
DataSets和DataSetCommands:處理內存鏡像數據。
ADO.NET首先用Connections對象在Web頁面和數據庫之間建立連接,然后通過Commands向數據庫提供者發出操作命令,使操作結果以流數據的形式返回連接。再通過DataReaders快速讀取流數據,保存數據到DataSets對象。最后再由DataSetCommands對象對數據進行集中訪問和操作。
1.Connections對象
.NET框架中共提供了兩個Connections對象:SQLConnection和ADOConnection。應用Connections對象時,先用Connections對象建立連接,然后調用Open方法來打開連接。通常建立鏈接時,要提供一些信息,如數據庫所在位置、數據庫名稱、用戶賬號、密碼等相關信息,Connection對象提供了一些常用屬性用來進行此類設置。
(
圖)
SQLConnection的具體操作方法是:
Dim myConnection as string = ″server=localhost;uid=liuguo;pwd=12345;database=northwind″
Dim myConn As OleDbConnection = New OleDbConnection(myConnection)
ADOConnection的具體操作方法是:
Dim myConnection As string = ″localhost;uid=liuguo;pwd=12345;Intial catalog=Northwind;″
Dim myConn As OleDbConnetion = New OleDbConnection(myConnection)
MyConn.Open()
2.Commands對象
當鏈接到數據庫之后,可以使用Command對象對數據庫進行操作,如進行數據添加、刪除、修改等操作。一個命令(Command)可以用典型的SQL語句來表達,包括執行選擇查詢(Select Query)來返回記錄集,執行行動查詢(Action Query)來更新(增加、編輯或刪除)數據庫的記錄,或者創建並修改數據庫的表結構。當然命令(Command)也可以傳遞參數並返回值。Command可以被明確的界定,或者調用數據庫中的存儲過程。
Dim objCmd as New OleDbCommand(″SELECT * From users″, objConn)
以上語句建立Command,根據習慣,也可以使用以下方法:
Dim objCmd as New OleDbCommand()
objCmd.Connection = objConn
objCmd.CommandText = ″SELECT * FROM users″
3.DataReaders對象
DataReaders是專門用來讀取數據的對象,這個對象除了讀數據以外,不能做其他任何數據庫操作。
Dim objReader as OleDbDataReader
objReader = objCmd.ExecuteReader
While objReader.Read
Response.Write(objReader.GetString(0) & ″
″=
″=
End While
4.DataSet對象
DataSet是ADO.NET的核心。DataSet是一個存在於內存中的數據庫,也就是說它是離線的,並沒有同數據庫建立即時的連線。在ADO.NET中,DataSet是專門用來處理從數據保存體(Data Store)中讀出的數據。不管底層的數據庫是SQL Server還是ADO,DataSet的行為都是一致的。可以使用相同的方式來操作從不同數據來源取得的數據。
在DataSet中可以包含任意數量的DataTable(數據表),且每個DataTable對應一個數據庫的數據表(Table)或視圖(View)。一般來說,一個對應DataTable對象的數據表就是一堆數據行(DataRow)與列(DataColumn)的集合。DataTable會負責維護每一筆數據行保留它的初始狀態(Original State)和當前的狀態(Current State),以解決多人同時修改數據時引發的沖突問題。
DataSet是XML與ADO結合的產物,它的一個重要的特點是與數據庫或SQL無關。它只是簡單地對數據表進行操作,交換數據或是將數據綁定到用戶界面上。
如以下這個例子:
Dim ds1 As New DataSet()
Dim dtable As new DataTable(″people″)
With dtable.Columns
.Add(″FName″, System.Type.GetType(″System.String″))
.Add(″LName″, System.Type.GetType(″System.String″))
.Add(″UID″, System.Type.GetType(″System.Int32″))
End With
dtable.Columns(″UID″).AutoIncrement = True
ds1.Tables.Add(dtable)
dim pkey() as DataColumn = {ds1.Tables(″people″).Columns(″UID″)}
ds1.Tables(″people″).PrimaryKey = pkey
以上語句稍微有點復雜,我們來簡單分析一下。
前半部分我們建立了一個DataSet和一個叫People的DataTable,然后,我們為這個DataTable加入了三個列並將“UID”列設為自動遞增。最后,將這個DataTable加入到了DataSet。最后我們定義一個叫pkey()的主鍵,將其指向People。
二、數據的綁定
VB.NET沒有自己的類庫,它依托的是.NET FrameWork SDK中的類庫,雖然在.NET FrameWrok SDK中並沒有提供在VB中的的DbLabel、DbComboBox等數據庫組件,但.NET FrameWork SDK中提供了一種數據綁定技術,可以把打開的數據表中的某個或者某些字段綁定到在命名空間System.Window.Forms中定義的WinForm組件(如TextBox組件、ComboBox組件、Label組件等)中的某些屬性上,從而提供這些組件顯示出數據表中的記錄信息,也就實現了DbTextBox、DbComboBox等組件。
(一)數據綁定和Windows窗體基礎知識
數據綁定指的是一個過程,即在運行時自動為包含數據的結構中的一個或多個窗體控件設置屬性的過程。具體而言,是指Windows窗體使用ADO.NET進行數據綁定的過程。使用數據綁定,你無需顯式編寫實例化連接和創建數據集的代碼(而使用非綁定窗體則必須這樣做),與Windows窗體相關聯的向導將為你編寫必要的ADO.NET代碼。
Windows窗體使用戶可以輕松綁定到幾乎所有包含數據的結構。這表示用戶可以使用ADO.NET綁定到傳統的數據存儲區(如存儲在Access或SQL Server表中的數據),也可以綁定到從文件讀取的、包含在其他控件的或存儲在陣列中的數據結果。將窗體綁定到數據后,就可以將窗體上的控件綁定到特定的數據元素。最傳統的數據綁定包括將文本框控件(TextBox)的Text屬性綁定到數據源的列,還可以綁定Image控件的圖形、控件的背景或窗體上任意控件的其他任意屬性。
Windows窗體可以進行兩種類型的數據綁定:簡單數據綁定允許將控件綁定到單個數據元素;復雜數據綁定允許將多個數據元素綁定到一個控件。
(二)數據與控件的綁定
在VB.NET中要向控件綁定一個數據源,就必須為該控件設置DataBinding屬性。該屬性可以訪問ControlBindingsCollection類,該類對每一個控件的綁定進行管理,並且具有很多屬性和方法。
Add方法為控件創建一個綁定並將它加到ControlBindingsCollection中。Add方法有3個參數語法如下:
Object.DataBindings.Add(propertyname,datasource,datamember)
其中,Object表示窗體上的有效控件;Propertyname參數表示被綁定控件的屬性;Datasource參數表示被綁定的數據源,可以是任何包含數據的有效對象如DataSet,DataView或者DataTable等;Datamember參數代表被綁定給控件的數據源中的數據字段。
1.綁定前的准備工作
(1)創建一個名為db1的Access數據庫,數據表Student的結構如
圖所示:
並在表中增加以下幾條記錄。如
圖所示。
(2)創建和配置數據集:
創建項目,就可以創建和配置窗體所基於的數據集了。數據集是內存中包含表、關系和約束的緩存,其中的每個表均為列和行的集合。數據集能夠識別其原始狀態和當前狀態,因此可以跟蹤發生的變化。數據集中的數據被視為可更新數據。步驟如下:
新建一個名為myDataTest的vb.net項目,將表單的Name屬性改為:“frmtest”;Text屬性設為“數據綁定舉例”。
在表單中增加一個OleDbDataAdapter控件。這時會自動彈出“數據適配器配置向導”對話框。點擊“下一步”選擇“新建連接”將彈出相應的對話框,選擇“Microsoft Jet 4.0 OLE DB Provider”選項,點擊“Next”按鈕,設定數據源。在這里設置好你的數據源后點擊“OK”按鈕。
在打開的對話框中選擇你的數據連接,設置完畢后點擊“下一步”按鈕創建SQL查詢語句。在SQL生成器輸入中輸入以下語句,並點擊“完成”。此時就完成與數據源的連接工作。
SELECT StuID, StuName, StuSex, StuBorn, StuCore FROM student
在窗體的組件欄中將顯示名為OleDbConnection1的OleDbConnection對象和名為OleDbDataAdapter1的OleDbDataAdapter對象。其中,OleDbConnection1對象包含有關如何訪問選定數據庫的信息。OleDbDataAdapter1對象包含一個查詢,它定義了要訪問的數據庫中的表和列。
(3)生成數據集類:
點擊“數據→生成數據集”菜單命令,此時將出現“生成數據庫”對話框。在“新建”框中myDataSet作為要創建的新數據集的名稱。確保選中“將此數據集添加到設計器”選項。點擊 “確定”按鈕。這樣即可生成數據集。
完成上述步驟,在窗體的組件欄上將顯示一個新的控件myDataSet1。此控件是myDataSet.xsd文件的一個引用,該文件也被添加到“解決方案資源管理器” 窗口中。
到此,准備工作結束。我們就可以將數據集綁定給控件來顯示數據集中所包含的數據了。
2.綁定到DataGrid控件
(1)在窗體中增加一個DataGrid控件,調整其大小與窗體相符。並對應以下設置修改其相關屬性:
DataSource屬性為myDataSet1;Datamember屬性為student。
完成上述步驟,即將數據集綁定到數據網格控件中了。只需再完成一個步驟,就可以看到數據網格控件中顯示的數據了。
(2)雖然數據網格控件已被綁定到數據集上,但加載窗體時並不會自動填充數據集。加載窗體時,請使用窗體的Load事件過程,在數據網格控件中填充數據。代碼如下:
Private Sub frmtest_Load( ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'加載數據網格控件
MyDataSet1.Clear()
OleDbDataAdapter1.Fill(mydataset1,″student″)
End Sub
在Load事件過程中,首先需要清除數據集,然后用先前創建的OleDbDataAdapter1對象的Fill方法填充數據集。需要將表名傳遞給第二個參數,因為數據網格控件將使用第二個參數檢索以前在DataMember屬性中指定的正確DataMember (student)。
(3)現在,我們可以來看看我們的成果了,試運行一下程序。
在“解決方案資源管理器”窗口中,右擊項目名稱,從快捷菜單中選擇“屬性”命令,在打開的對話框中點擊“啟動對象”組合框並從列表中選擇“frmtest”選項。然后點擊“確定”按鈕。最后按下F5鍵即可運行此項目。
3.綁定到TextBox控件
在上面我們介紹的實例窗體frmtest上刪除DataGrid控件,並清除frmtest_Load中的代碼。按照
圖所示設計程序界面。
上圖中各控件相關屬性是:(
圖)
(其余的控件,我們將在下面的內容中用到。)
界面創建完成以后,我們就可以把數據集綁定到每個TextBox控件上了。步驟如下:
(1)選擇要綁定的TextBox控件。按下F4鍵查看其“屬性” 窗口。點擊展開“DataBindings”屬性,在“DataBindings” 中選擇Text屬性。
(2)打開組合框並將各個文本框綁定到相應的字段。如需要將“TxtStuID”文本框綁定到StuID字段,請點擊myDataSet1上的“+”號,再點擊 student上的“+”號,然后選擇StuID字段。
(3)按照上述方法把其他幾個文本框綁定到相應的字段上。
需要說明的是:雖然已綁定各個字段但還必須編寫代碼才能在首次加載窗體時用數據填充窗體。代碼如下:
Private Sub frmtest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MyDataSet1.Clear()
OleDbDataAdapter1.Fill(MyDataSet1, ″student″)
End Sub
按下F5鍵試運行一下程序。仔細觀察一下運行結果我們就會發現,程序在實現時自動用數據集中的第一條記錄來填充各件控件。
(三)用代碼實現數據綁定
上面我們着重探討了控件與數集據綁定的向導模式。這種模式雖然實現方法簡單,但是卻不靈活,可移植性較差。為此,我們為大家介紹如何用代碼來實現數據綁定。用代碼實現數據綁定的優點在於靈活自由,代碼移植方便。
為了便於更好的理解,我們仍然選用“TextBox”控件作為實例來介紹。
1.綁定到TextBox控件
(1)界面設計:
新建一個項目,按照
圖的方法設置程序界面,再增加一個Button控件,將其“Text“屬性設為“TextBox數據綁定”。
(2)代碼實現:
'指定程序中引用的名稱空間:在代碼窗中輸入:
Imports System.Drawing
Imports System.Windows.Forms
Imports System.ComponentModel
Imports System
Imports System.Data.OleDb
Imports System.Data
'首先定義全局變量myDataSet及GetConnected()方法,代碼如下:
Public Class Form1
Inherits Form
Private WithEvents Button1 As Button
Private TextBox1 As TextBox
……(省略部分自動生成代碼)
Private myDataSet As DataSet
Private components As System.ComponentModel.Container
Public Sub New()
MyBase.New()
GetConnected() '這個過程是用於建立連接,打開數據庫
InitializeComponent()
End Sub
'清除在程序中使用過的資源
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
……(省略部分自動生成代碼)
End Sub
'
'為GetConnected()方法增加代碼,用來打開數據表,返回數據集。
Public Sub GetConnected()
'創建一個 OleDbConnection
Dim ConnectionString As String = ″ Provider = Microsoft.Jet.OLEDB.4.0; Data Source = e:\My Documents\db1.mdb″
Dim myConn As OleDbConnection = New OleDbConnection()
myConn.ConnectionString = ConnectionString
Dim strCom As String = ″ SELECT * FROM student ″
'創建一個 DataSet
myDataSet = New DataSet()
myConn.Open()
'用 OleDbDataAdapter 得到一個數據集
Dim myCommand As OleDbDataAdapter = New OleDbDataAdapter(strCom, myConn)
'把Dataset綁定student數據表
myCommand.Fill(myDataSet, ″student″)
'關閉此OleDbConnection
myConn.Close()
End Sub
'初始化窗體中的組件
Private Sub InitializeComponent()
……(省略部分自動生成代碼)
End Sub
'將各個文本框控件綁定到數據庫的各個字段。
Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
TxtStuID.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuID″))
TxtStuName.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuName″))
TxtStuSex.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuSex″))
TxtStuBorn.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuBorn″))
TxtStuCore.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuCore″))
End Sub
End Class
Module Module1
Sub Main()
Application.Run(New Form1())
End SubEnd Module
編譯后運行程序,看看是不是與上面介紹的實例運行結果相同。
在上面的代碼中,我們新建了一個GetConnected()過程,用於建立連接,打開數據庫。在用代碼實現數據綁定或者對數據庫進行任何操作前,就必須要先建立連接,打開數據庫,程序運行結束后再關閉數據連接。
在Button1_Click過程中,我們把“TextBox”控件綁定到數據集myDataSet中“student”的各個字段上。
程序運行后,點擊“TextBox數據綁定”按紐,程序就會用myDataSet中“student”中的數據來自動填充文本框。
2.綁定到Label控件
有了上面的內容做基礎,再來討論如何把數據集綁定到Label控件上就顯得很簡單了。把數據綁定到Label控件的方法與綁定到TextBox控件的方法大同小異。此處不再詳細講解,只給出代碼實現綁定到Label控件的核心部分代碼。
Private Sub Button1_Click (ByVal sender As Object , _
ByVal e As System.EventArgs ) Handles Button1.Click
'把student表的StuName字段綁定到Label1的Text屬性上。
Label1.DataBindings.Add ( New Binding ( ″Text″ , Me.myDataSet , ″student.StuName″ ) )
End Sub
3.綁定到ComboBox控件
上面介紹的是對組件的簡單數據綁定,對組件的復雜數據綁定和它有所區別,也有所相同,具體如下:
(1)要對ComboBox組件實現數據綁定,首先也是要打開數據表,得到數據集。這和上面TextBox組件的代碼大致一樣,在此略過。
(2)實現數據綁定:
設定了ComboBox組件的三個屬性就可以實現數據綁定了,這三個屬性是“DataSource”、“DisplayMember”、“ValueMember”。其中DataSource表示指定的數據集;DisplayMember表示ComboBox組件顯示的字段值;ValueMember表示ComboBox組件選擇后的值。這三個屬性的具體使用方法如下:
ComboBox1.DataSource = Me.myDataSet
ComboBox1.DisplayMember = ″studnet.StuName″
ComboBox1.ValueMember = ″ studnet.StuName ″
下面我們就來看看把數據集綁定到ComboBox控件的核心代碼:
Private Sub Button1_Click ( ByVal sender As Object , _
ByVal e As System.EventArgs ) Handles Button1.Click
ComboBox1.DataSource = Me.myDataSet
ComboBox1.DisplayMember = ″student.StuName″
ComboBox1.ValueMember = ″ student.StuName ″
End Sub
注意:對ComboBox控件進行數據綁定的方法同樣適用於ListBox控件,因此關於LisBox控件數據綁定方法本文將不再介紹。需要者請參閱ComboBox相關內容。
三、數據庫簡單操作
前面介紹了ADO.NET基礎,以及ADO.NET與Windows窗體控件的綁定方法。但是,對於數據庫編程我們更想了解的還是如何增加記錄,刪除記錄,更新記錄等數據庫記錄的操作方法。這里我們將以一個具體的實例為大家介紹這些操作方法。
在圖3中,有btnFirst(第一個記錄),btnEnd(最后一條記錄),btnAdd(增加記錄),btnDel(刪除記錄),btnEdit(修改記錄)控件。
用代碼形式打開數據並在frmtest_load中把數據綁定給TextBox控件。此處給出源代碼:
'打開數據庫
Public Sub OpenData()
'創建一個 OleDbConnection
Dim ConnectionString As String = ″ Provider = Microsoft.Jet.OLEDB.4.0; Data Source = e:\My Documents\db1.mdb″
Dim myConn As OleDbConnection = New OleDbConnection()
myConn.ConnectionString = ConnectionString
Dim strCom As String = ″ SELECT * FROM student ″
'創建一個 DataSet
myDataSet = New DataSet()
myConn.Open()
'用 OleDbDataAdapter 得到一個數據集
Dim myCommand As OleDbDataAdapter = New OleDbDataAdapter(strCom, myConn)
'把Dataset綁定student數據表
myCommand.Fill(myDataSet, ″student″)
'關閉此OleDbConnection
myConn.Close()
End Sub
'綁定數據到TextBox控件
Private Sub frmtest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
txtStuID.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuID″))
txtStuName.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuName″))
txtStuSex.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuSex″))
txtStuBorn.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuBorn″))
txtStuCore.DataBindings.Add(New Binding(″Text″, Me.myDataSet, ″student.StuCore″))
End Sub
完成以上步驟后,我們就可以通過編程對數據庫進行各作操作了。
1.實現對數據記錄的瀏覽
在完成對窗體中的WinForm組件進行綁定后,實現對數據記錄的瀏覽操作的關鍵就是要找到如何定位數據記錄指針的方法。而要實現這種處理就需要用到.NET FrameWork SDK中的名稱空間System.Windows.Froms中的BindingManagerBase類。
BindingManagerBase是一個抽象的類,主要用於管理同一數據表所有綁定對象。BindingManagerBase類中定義了二個屬性“position”和“Count”,第一個屬性是定義當前數據指針,而第二個屬性主要是得到當前數據集有多少記錄數目。在已經進行完數據綁定后,通過這兩個屬性配合使用,實現對數據記錄的瀏覽。
(1)向上翻閱一條記錄:
雙擊“上一條”按鈕,在代碼窗中輸入以下代碼:
Private Sub btnPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrevious_.Click
Me.BindingContext(myDataSet, ″student″).Position -= 1
End Sub
(2)向下翻閱一條記錄:
雙擊“下一條”按鈕在代碼窗中輸入以下代碼:
Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesbtnNext.Click
Me.BindingContext(myDataSet, ″student″).Position += 1
End Sub
(3)翻到最后一條記錄:
雙擊“最后一條記錄”按鈕,在代碼窗中輸入以下代碼:
Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
Me.BindingContext(myDataSet, ″student″).Position = Me.BindingContext(myDataSet, ″student″).Count - 1
End Sub
(4)翻閱到第一條記錄:
雙擊“第一條記錄”按鈕,在代碼窗中輸入以下代碼:
Private Sub btnFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirst.Click
Me.BindingContext(myDataSet, ″student″).Position = 0
End Sub
說明:為了代碼書寫方便,我們可以先定義一個BindingManagerBase對象myBind,如myBind = Me.BindingContext (myDataSet, ″student″ ),於是以上各句代碼均可以簡寫成:
向上翻閱一條記錄:myBind.Position = myBind.Position - 1
向下翻閱一條記錄:myBind.Position = myBind.Position + 1
翻閱到最后一條記錄:myBind.Position=myBind.count - 1
翻閱到第一條記錄:myBind.Position = 0
2.刪除數據記錄
雙擊“刪除記錄”按鈕,在代碼窗中輸入以下代碼:
Private Sub btnDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDel.Click
Dim ConnectionString As String = ″ Provider = Microsoft.Jet.OLEDB.4.0; Data Source = e:\My Documents\db1.mdb″
Dim myConn As OleDbConnection = New OleDbConnection()
myConn.ConnectionString = ConnectionString
myConn.Open()
Dim strDele As String = ″DELETE From student WHERE StuID = '″ + txtStuID.Text + ″ '″
Dim myCommand As OleDbCommand = New OleDbCommand(strDele, myConn)
myCommand.ExecuteNonQuery() myDataSet.Tables(″student″).Rows(Me.BindingContext(myDataSet, ″student″).Position).Delete()
myDataSet.Tables(″student″).AcceptChanges()
10.myConn.Close()
End Sub
前面四行代碼我們已經非常熟悉,目的是建立與數據據的連接並打開數據庫。第6行代碼我們建立一個SQL查詢,用來查詢數據表中StuID字段值等於TxtStuID.Text輸入值的所有記錄。並在第7行代碼中將查詢結果建立一個新的OleDbCommand對象,用來指定要刪除的記錄。第8行代碼是從數據庫中刪除指定的記錄,第9行代碼是從myDataSet中刪除記錄。前者是物理上刪除記錄,如果去掉第8行代碼運行程序你就會發現,記錄只是在當前操作中被刪除了,在數據庫中依然存在。
其中第6行代碼中定義的SQL查詢條件讀者可以根據需要自行指定。需要說明的是,由於我們在創建數據表時,指定StuID字段的類型為Text類型,因此在書寫SQL語名時要在“=”號前加上單引號,具體格式請參照第6行代碼。如果StuID字段類型為數字型,那么第6行正確寫法應該為:
Dim strDele As String = ″DELETE From student WHERE StuID = ″ + txtStuID.Text
3.修改數據記錄
修改數據的方法有很多,本文中我們將以采用SQL語言來修改數據記錄為例詳細介紹一下如何修改數據記錄。下面我們先看看程序代碼:
Dim ConnectionString As String = ″ Provider = Microsoft.Jet.OLEDB.4.0; Data Source = e:\My Documents\db1.mdb″
Dim myConn As OleDbConnection = New OleDbConnection()
myConn.ConnectionString = ConnectionString
myConn.Open()
'以上代碼用來連接數據源
myDataSet.Tables(″student″).Rows(Me.BindingContext(myDataSet, ″student″).Position).BeginEdit()
'利用SQL語句創建數據更新集合
Dim StrUpdate As String = ″Update student SET StuName='″ + txtStuName.Text + ″',StuSex='″ + txtStuSex.Text + ″',StuBorn='″ + txtStuBorn.Text + ″',StuCore='″ + txtStuCore.Text + ″' WHERE StuID='″ + txtStuID.Text + ″'″
'利用SQL結果創建新的OleDbCommand對象
Dim myCommand As OleDbCommand = New OleDbCommand(StrUpdate, myConn)
myCommand.ExecuteNonQuery()
myDataSet.Tables(″student″).Rows(Me.BindingContext(myDataSet, ″student″).Position).EndEdit()
myDataSet.Tables(″student″).AcceptChanges()
myConn.Close()
MsgBox(″數據修改完成!″)
上述代碼中我們采用SQL語言中的Update語名來更新記錄,對各個TextBox中的值修改后更新到數據庫。其中重要語句就是SQL語句的編寫。如果你有不明白的地方,請參閱SQL相關資料。代碼中我們同時還利用了BeginEdit()與EndEdit()方法,任何從數據的修改都必須在這兩個方法之間進行。前者是數據修改的入口,后者則是完成將數據寫入數據庫的工作。
4.增加數據記錄
增加數據記錄與修改數據在實現方法上有很多相同之處。在下面的實例中我們利用SQL的Insert語句在指定位置插入一條記錄,把更新到數據庫。如果你想在數據表最后增加一條記錄,只需要將數據記錄指針指向數據表末尾就行了。
Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
Dim ConnectionString As String = ″ Provider = Microsoft.Jet.OLEDB.4.0; Data Source = e:\My Documents\db1.mdb″
Dim myConn As OleDbConnection = New OleDbConnection()
myConn.ConnectionString = ConnectionString
myConn.Open()
Dim StrAdd As String = ″insert into student (Stuid,StuName,StuSex,StuBorn,StuCore) values('″ + txtStuID.Text + ″','″ + txtStuName.Text + ″','″ + txtStuSex.Text + ″','″ + txtStuBorn.Text + ″','″ + txtStuCore.Text + ″')″
Debug.Write(StrAdd)
Dim myCommand As OleDbCommand = New OleDbCommand(StrAdd, myConn)
myCommand.ExecuteNonQuery()
myConn.Close()
myDataSet.Tables(″student″).Rows(Me.BindingContext(myDataSet, ″student″).Position).BeginEdit()
myDataSet.Tables(″student″).Rows(Me.BindingContext(myDataSet, ″student″).Position).EndEdit()
myDataSet.Tables(″student″).AcceptChanges()
MsgBox(″數據增加完成!″)
End Sub
有了前面幾種基本操作方法的代碼分析后,這段代碼相信不難理解。大家需要關注的還是SQL語句是如何實現數據記錄增加的。這種方法具有一定的通行性。
完成上述設計后我們來看看整個程序的運行結果。按下F5鍵運行程序即可。
本文中所有代碼均在Windows XP+VB.NET環境下調試通過。