vb中資料庫連接
1. VB如何連接SQL資料庫
一個用VB連接SQL資料庫連接的模塊2007年01月22日 星期一 下午 05:29下面是一個連接資料庫的模塊,大家可以使用它來連接SQL資料庫,使用起來比ADO控制項還簡單:
代碼如下:
Public rsNew As ADODB.Recordset
Public CnNew As ADODB.Connection
Public addFlag As Boolean
'連接資料庫
Public Function OpenCn() As Boolean
Dim Mag As String
On Error GoTo strErrMag
Set CnNew = New ADODB.Connection
CnNew.ConnectionTimeout = 25
CnNew.Provider = "sqloledb"
CnNew.Properties("data source").value = "" 'SQL伺服器的名
CnNew.Properties("initial catalog").value = "pubs"'庫名
CnNew.Properties("integrated security").value = "SSPI"'登陸類型
'con.Properties("user id").value = "sa"
'con.Properties("password").value = "wwww"
CnNew.Open
OpenCn = True
addFlag = True
Exit Function
strErrMag:
Mag = "資料庫末連接"
Call MsgBox(Mag, vbOKCancel, "錯誤:資料庫連接")
addFlag = False
End
End Function
Public Sub Clocn()
'閉關資料庫
On Error Resume Next
If CnNew.State <> adStateClosed Then CnNew.Close
Set CnNew = Nothing
End Sub
Public Function OpenRs(ByVal strSql As String) As Boolean
'連接資料庫記錄集
Dim Mag As String
Dim rpy As Boolean
On Error GoTo strErrMag
Set rsNew = New ADODB.Recordset
If addFlag = False Then rpy = OpenCn
With rsNew
.ActiveConnection = CnNew
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open strSql
End With
addFlag = True
OpenRs = True
Exit Function
strErrMag:
Mag = "資料庫數據集末連接"
Call MsgBox(Mag, vbOKOnly, "錯誤:資料庫連接")
OpenRs = False
End
End Function
Public Sub cloRs()
'閉關數據集
On Error Resume Next
If rsNew.State <> adStateClosed Then rsNew.Close
Set rsNew = Nothing
End Sub
只要在你的標准模塊中加入該代碼,你就可以使用其中的函數來連接數據源了。
2. VB如何連接到資料庫
VB有多種方法連接資料庫,不知道你想要怎麼連? 還有要連接到什麼樣的資料庫?
我這里給你提供個連接到Oracle的連接方法(利用oo4o).
Public OraDbSession As Object
Public OraDb As Object
Public myRs As Object
'連接資料庫(用戶名和密碼,資料庫名)
Function OraConn(UserID As String, Password As String, SouceName As String) As Boolean
On Error GoTo OraConn_Err
Set OraDbSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDb = OraDbSession.dbopendatabase(SouceName, UserID & "/" & Password, 0)
OraConn = True
Exit Function
OraConn_Err:
OraConn = False
MsgBox Error
End Function
'檢索(Select...)
Function BookFound() As Boolean
Dim SQL As String
SQL = "SELECT bookid FROM BOOK"
On Error GoTo BookFound_Err
'這里是調用上面那個函數
If Not OraConn("用戶名", "密碼", "資料庫名") Then
BookFound = False
Exit Function
Else
Set myRs = OraDb.dbcreatedynaset(SQL, 0)
End If
Do While Not myds.EOF
MsgBox myds.fields(0).Value
myds.MoveNext
Loop
myds.Close
Exit Function
BookFound_Err:
MsgBox Error
End Function
'更新/刪除/寫數據
Public Sub DateUp()
Dim sql As String
sql = "insert..."
'這里是調用上面那個函數
If OraConn("用戶名", "密碼", "資料庫名") Then
OraDb.executesql (sql)
End If
End Sub
3. 在VB中怎樣建立資料庫 然後再與資料庫連接
Visual Basic作為應用程序的開發「利器」也表現在資料庫應用程序的開發上,它良好的界面和強大的控制項功能使資料庫編程變得簡單多了。但即便如此,資料庫應用程序的開發仍然算得上是VB編程中的難點,這是因為你不僅要熟悉VB中關於資料庫編程方面的知識(當然這是十分簡單的)還要了解資料庫的知識。所以我們先介紹一下資料庫的基本知識,算是學習資料庫編程前的熱身運動吧!
一、熱身運動
首先需要聲明是,我們這里介紹的資料庫知識都是指的關系資料庫。所謂關系資料庫就是將數據表示為表的集合,通過建立簡單表之間的關系來定義結構的一種資料庫。
不管表在資料庫文件中的物理存儲方式如何,它都可以看作一組行和列,與電子表格的行和列類似。在關系資料庫中,行被稱為記錄,而列則被稱為欄位。下面是一個客戶表的例子。
表1 客戶表
客戶號 姓名 地址 城市 街道 郵編
1723 Doe John 1234 Ffth Avenue New York NY 1004
3391 Smith Mary 9876 Myrtle Lavee Bosten MA 6078
3765 Blasel Mortimer 2296j River Road peoria IL 7011
此表中每一行是一個記錄,它包含了特定客戶的所有信息,而每個記錄則包含了相同類型和數量的欄位:客戶號、姓名等等。
表 是一種按行與列排列的相關信息的邏輯組,類似於工作單表。
欄位 資料庫表中的每一列稱作一個欄位。表是由其包含的各種欄位定義的,每個欄位描述了它所含有的數據。創建一個資料庫時,須為每個欄位分配一個數據類型、最大長度和其它屬性。欄位可包含各種字元、數字甚至圖形。
記錄 各個客戶有關的信息存放在表的行,被稱為記錄。一般來說,資料庫表創建時任意兩個記錄都不能相同。
鍵鍵就是表中的某個欄位(或多個欄位),它(們)為快速檢索而被索引。鍵可以是唯一的,也可以是非唯一的,取決於它(們)是否允許重復。唯一鍵可以指定為主鍵,用來唯一標識表的每行。例如,在前面的例子中,客戶標識號 (客戶號) 是表的主鍵,因為客戶號唯一地標識了一個客戶。
關系 資料庫可以由多個表組成,表與表之間可以以不同的方式相互關聯。例如,客戶資料庫還可以有一個包含某個客戶的所有定單的表。它只用「客戶號」欄位來引用該定單的客戶,而不在定單表中的每項重復所有客戶信息,如下表所示:
表2 定貨表
定貨 客戶號 日期 內容 數量
14764 3391 2/23/94 27 $22.95
14932 3391 3/17/94 46 $9.57
15108 8765 2/15/96 27 $22.95
在這個表中,客戶號欄位引用了客戶表中的 客戶號欄位,從而把定單和客戶聯系起來了。可以看到,客戶 3391 (Mary Smith) 在 94 年 2 月 23 日訂購了 27 項,在 94 年 3 月 17 日訂購了 46 項。用來建立關系的鍵叫做外部鍵,因為它與「外部」表(客戶表)的主鍵關聯。
一對多和多對多關系 上表中的關系類型叫做一對多關系,因為一個客戶可以發出多個定單,而某個特定的定單只能是一個客戶所發。也可以建立多對多的關系。例如,列出所有可以銷售的項(存貨)的盤存表:
表3 盤存表
內容 描述 供應商 費用 盤存
27 Straw Hat Garden Supply Co. $14.00 50
46 Garden gloves Garden Supply Co. $4.50 75
102 hanging floral instries $6.00 137
從盤存表中,可以看到在客戶和存貨項之間存在多對多的關系。也就是說,一個客戶可以訂購多個存貨項,而一個存貨項又能夠被多個客戶訂購。多對多關系是通過兩個獨立的一對多關系來定義的,公共的「多」表包含了兩個其它表的外部鍵。在該例中,定貨s 表與 盤存 表(通過 「內容」)與 Customer 表(通過 客戶號)都相關聯。通過這三個表,我們可以看到,Mary Smith (客戶號 3391) 訂購了 Straw Hat (「內容」 27) 和Garden Gloves (「內容」 46),而 Mary Smith (客戶號 3391) 和 Mortimer Blaselflatz (客戶號 8765) 都訂購了Straw Hat (「內容」 27)。如果把客戶表和盤存表的相關欄位與定貨表的「定貨」欄位聯結起來,建立一個「關聯」表,那麼這個關系就更清楚了。
表4 關聯表:按客戶號和內容排序
定貨號 客戶號 姓名 內容 描述
14764 33391 Smith Mary 27 Straw Hat
14932 33391 Smith Mary 46 Garden Gloves
15168 8765 Blaselfatz Mortimer 27 Straw Hat
規范化 資料庫設計者的任務就是組織數據,而組織數據的方法,應能消除不必要的重復,並為所有必要信息提供快速查找路徑。為了達到這種目標而把信息分離到各種獨立的表中去的過程,叫作規范化。
規范化是用許多指定的規則和不同級別的範式來進行規范的復雜過程。該過程的研討已超出了本文的范圍。但是,大多數簡單資料庫的規范化可以用下面簡單的經驗規則來完成:包含重復信息的表必須分成獨立的幾個表來消除重復。
例如,使學生和課程對應的學生資料庫,包含了下表所示的信息。
表5
學生 課程 描述 教授
1 4 Introction to Physiology Dawson
2 3 Applied Basketweaing Carruth
3 1 Physics for Short-定貨 cooks Adms
4 2 Introction to Physiology Dawsons
如果有選學了十二門課程的 1000 個學生,每門課程的說明和教師將顯示100多次— 對選了那門課程的每個學生都要重復一次。要避免這種低效率,應當把表分成兩個獨立的表來規范化,一個用來表示學生,另一個用來表示課程,如表6,表7所示。
學生 課程
1 4
2 3
3 1
4 4
課程 描述 教授
1 Physics for Short-定貨 cooks Adms
2 Counterculture Sociology Beckely
3 Applied Basketweaing Carruth
4 Introction to Physiology Dawsons
表6
表7
現在表被規范化了,所以,要改變特定課程的課程描述或「數據」,只要改變一個記錄就可以了。
以上是關於資料庫的基本知識,這是學習資料庫編程所必須的。雖然資料庫技術作為一門學科,其深度和廣度不是這點篇幅能描述的,但作為入門和簡單資料庫編程應該是足夠了。
好了,下面我們就可以開始練練了。我們經常遇到資料庫系統是登記系統,不管你是在單位,或是參加什麼組織,登記是免不了的,而且它的結構比較簡單,我們就以一個登記系統為例吧。分析一下該系統所涉及到的數據。
二、磨刀不誤砍柴功
對於登記,要跟蹤的信息包括:
● 姓名 ● 性別
● 籍貫 ● 年齡
● 出生年月 ● 單位
● 地址 ● 郵政編碼
● 電話 ● 傳真
當然,可以簡單地創建一個表,使得上述的每個數據項對應一個欄位。
現在需要給表指派主鍵,用以唯一標識每一條記錄,在登記表中分別添加登記號作為唯一鍵,這樣就保證資料庫中的任兩條記錄都不同了。
對資料庫作出以上分析後,我們就可以開始建立資料庫了。
三、建營紮寨
在這里我們學習怎樣建立資料庫,首先需要確定要建立資料庫的類型。在Visual Basic中通過數據訪問控制項或數據訪問對象(DAO)可以訪問下列資料庫:
1. JET資料庫,即Microsoft Access
2. ISAM資料庫,如:dBase,FoxPro等
3. ODBC資料庫,凡是遵循ODBC標準的客戶/伺服器資料庫。如:Microsoft SQL Server、Oracle
一般來說,如果要開發個人的小型資料庫系統,用Access資料庫比較合適,要開發大、中型的資料庫系統用ODBC資料庫更為適宜。而dBase和 FoxPro資料庫由於已經過時,除非特別的情況,否則不要使用。在我們的例子中,當然選用Access資料庫了。建立Access資料庫有兩種方法:一是在Microsoft Access中建立資料庫。點擊「新建」按鈕就可以建立新的表了(如圖1)。這里我們主要介紹第二種方法:使用可視化數據管理器,不需要編程就可創建資料庫。可視化數據管理器是一個非常有用的應用程序,它是VB企業版和專業版附帶的,在目錄..DevStudiovbsamplesVisdata下,其界面如下圖。
點擊菜單「文件」項下「新建」子項「Microsoft ACCESS」子項的「版本7.0 MDB」項。在彈出窗口中輸入新建資料庫的名稱「登記」,出現下面圖3所示窗口:
要生成新的表,右鍵單擊資料庫窗口彈出菜單,然後選擇「新表」命令,在隨後出現的「表結構」對話框中建立所要的欄位。每次向表中加入新的欄位,單擊「增加欄位」按鈕,會出現圖4 的「增加欄位」對話框。
「增加欄位」對話框中的選項如表10所示,根據欄位的類型,有些選項是無效的,無法讀取。
在我們建立的登記資料庫中,各個欄位的類型如表11。
要注意的是,由於欄位登記號用來唯一標志記錄的,因此,它不能由用戶輸入。所以在定義該欄位時需要定義為Long數據類型,「自動生成欄位」項有效,並選中這一項。這樣當用戶每輸入一條新記錄時,系統就會在該欄位上自動輸入一個與其它記錄不同的值。
在ACCESS資料庫中,關鍵字是用索引實現的,作為編程人員在對表類型的記錄集編程時,只需調用索引名。在查詢時,Rushmore技術自動用索引信息優化查詢。完成表定義後,點擊「增加索引」按鈕,彈出如圖5所示窗口。
在窗口中右邊有三個選項,其意義如表 12。
添加索引對話框選項
完成之後如圖6。
當然,學會資料庫的建立也並非一朝一夕的事,讀者不妨多練習一下。下面你就可以運行VB開始我們的編程了。
四、千里相會
Visual Basic 資料庫應用程序有三個部分,如圖7所示。
用戶程序是程序員開發的,也是我們即將用VB來編寫的部分。資料庫引擎是資料庫驅動程序,使用它程序員可以用統一的格式訪問各種資料庫,不管這個資料庫是本地的 Visual Basic 資料庫,還是所支持的其它任何格式的資料庫格式,所使用的數據訪問對象和編程技術都是相同的。資料庫則是我們上面完成的部分。從這個結構可以看出用戶與正在訪問的特定資料庫無關。那我們在用VB編寫資料庫程序時,就需要使程序能夠訪問指定的資料庫。
如果是簡單的資料庫應用,可以使用 Data 控制項來執行大部分數據訪問操作,而根本不用編寫代碼。與 Data 控制項相捆綁的控制項自動顯示來自當前記錄的一個或多個欄位的數據。
DATA數據控制項
屬性
CONNECT屬性 指定打開的資料庫類型,並且包括參數,如用戶和口令等。
例如:
打開Access資料庫(預設)
CONNECT=「ACCESS」
打開ODBC資料庫
CONNECT=「ODBC;DATABASE=??;UID=??;PWD=??;DSN=??」
DATABASENAME屬性 確定數據控制項訪問哪一個資料庫。
對於多表資料庫它為具體的資料庫文件名,例如:ACCESS資料庫
DATABASENAME=「D:...DEMO.MDB"
對於單表資料庫它為具體的資料庫文件所在的目錄,而具體文件名放在RECORDSOURCE屬性中,例如:訪問FOXPRO資料庫文件D:FOXDEMO.DBF
DATABASENAME=「D:FOX」
RECORDSOURCE=「DEMO」不帶文件擴展名
RECORDSOURCE屬性
確定數據控制項的記錄集,即:所要訪問的數據內容。它可以是一個表名、存儲查詢名或SQL語句。例如:訪問Register表所有數據 :
RECORDSOURCE=「Register」訪問RC表中1973年以前出生的數據:
RECORDSOURCE=「SELECT *FROM Register WHERE [BIRTHDAY]<#1/1/1973#"
注意:當我們在運行時修改了該屬性後,需要調用REFRESH方法刷新記錄集。
方法
REFRESH方法 當我們在運行時修改了Record-
Source屬性後,需要調用該方法刷新記錄集。
UPDATERECORD方法 將綁定在數據控制項上的控制項的數據寫入資料庫中。即:當我們修改了數據後調用該方法確定修改。
CANCELUPDATE方法 將資料庫中的數據重新讀到綁定在數據控制項上的控制項中。即:當我們修改了數據後調用該方法放棄修改。
事件
VALIDATE事件 當我們移動記錄集記錄指針時發生。例如:我們將記錄集記錄指針從A移動到記錄B時當產生VALIDATE事件時,記錄指針仍在記錄A上。
Sub XXXX_Validate(Action As integer,Save As integer)
其中:
Action 指出如何產生了該事件,如:移動,增加,查詢等。
Save 表示是否保存已修改的數據。當我們修改了綁定在數據控制項的數據,又沒有UPDATERECORD,則移動指針時,Save=True。如果在事件中令Save=False,則放棄修改。
例如:
Sub XXXX_Validate(Action As integer,Save As integer)
If Save then
I= MsgBox("Dada changed,Save?",vbYesNo)
If I = vbNo then
Save = False
End if
End if
End Sub
Reposition事件 當我們移動記錄集指針時發生。例如:我們將記錄集記錄指針從A移動到記錄B 時,當產生Reposition事件時,記錄指針已移動到B上。
通常我們在該事件中顯示當前的指針位置。例如:
Sub XXXX_Reposition()
XXXX.Caption=??
XXXX.RecordSet.AbsolutePosition + 1
End Sub
了解了DATA控制項之後我們就可以連接資料庫了。現在我們可以編寫一個應用程序。因為雖然我們建立了Register資料庫,但是資料庫中卻沒有數據,我們程序的目的就是向資料庫中輸入數據。它的運行情況如圖8。
各個文本框正好對應著表Register的各個欄位,在文本框中輸入數據,點擊「增加」按鈕,就完成了一條記錄的輸入。我們看一下,DATA控制項是怎樣和資料庫連接起來的,各個文本框又是怎樣和DATA控制項捆綁起來的。
在DATA控制項的CONNECT屬性中,選中「ACCESS」項,在DatabaseName屬性中,輸入「C:TEMP登記.mdb」,在 RecordSource屬性中,選中「Register」,這樣就完成了資料庫與DATA控制項的連接,也就是完成了與應用程序的連接。
資料庫中各個欄位又是怎樣和文本框連接起來的呢?在VB中,我們可以將普通控制項綁定在數據控制項上,來完成自動地顯示、更新記錄集的數據。常用的可綁定的控制項有:Label,Text,checkBox,Image等。通過設置這些控制項的DataSource和DataField屬性來完成綁定。
DataSource 屬性 表示綁定到哪一個數據控制項上,程序中我們可能使用多個數據控制項。
DataField 屬性 表示綁定到記錄集的哪一個記錄上。
現在我們需要把Text1與表「登記」中的姓名欄位連接起來。完成DATA控制項的連接之後,在Text1控制項的DataSource屬性中,選中 「Data1」,在DataField屬性中,選中「姓名」值。用同樣的方法,將各個文本框分別綁定到對應的欄位上,就完成了文本框的捆綁。
下面我們編寫兩個按鈕命令,完成其相應的操作了。喂!別著急,還有一個重要的對象沒講呢!
當應用程序啟動時,Data 控制項被自動地初始化。如果 Connect、DatabaseName、Options、RecordSource、Exclusive、ReadOnly 和 RecordsetType 屬性是合法的, Microsoft Jet 資料庫引擎就會試圖創建一個新的基於這些屬性的 Recordset 記錄集對象。Recordset 對象可以表示表中的記錄或者作為查詢結果的記錄,使用 Recordset 對象可以在記錄一級上對資料庫中的數據進行處理。這在資料庫編程中是一個十分重要的,也是比較復雜的對象。
Recordset 對象有三種類型:表、動態集、快照,它們之間存在明顯的區別。
表類型的 Recordset 對象是指當前資料庫中的表在創建表類型的記錄集時,資料庫引擎打開的表。後續的數據操作都是直接對表進行的。只能對單個的表打開表類型的記錄集,而不能對聯接或者聯合查詢打開表類型的記錄集。與其它類型的 Recordset 對象相比,表類型的搜索與排序速度最快。
動態集類型的 Recordset 對象可以是本地的表,也可以是返回的行查詢結果。它實際上是對一個或者幾個表中的記錄的一系列引用。可用動態集從多個表中提取和更新數據,其中包括鏈接的其它資料庫中的表。動態集類型具有一種與眾不同的特點:不同資料庫的可更新聯接。利用這種特性,可以對不同類型的資料庫中的表進行可更新的聯接查詢。動態集和它的基本表可以互相更新。如果動態集中的記錄發生改變,同樣的變化也將在基本表中反映出來。在打開動態集的時候,如果其他的用戶修改了基本表,那麼動態集中也將反映出被修改過的記錄。動態集類型是最靈活的Recordset 類型,也是功能最強的。不過,它的搜索速度與其它操作的速度不及表類型的 Recordset。
快照類型的 Recordset 對象包含的數據是固定的,它反映了在產生快照的一瞬間資料庫的狀態。從 Microsoft Jet 數據源得到的快照是不可更新的,從開放資料庫互連 (ODBC) 數據源得到的某些快照是可以更新的,這取決於資料庫系統本身的能力。與動態集類型和表類型的 Recordset 對象相比,快照的處理開銷較少。因此,它執行查詢和返回數據的速度更快,特別是在使用 ODBC 數據源時。快照類型保存了表中所有記錄的完整復本,因此,如果記錄的個數很多,快照的性能將比動態集慢得多。為了確定快照與動態集哪一個更快,可以先以動態集方式打開記錄集,然後再以快照方式打開它。
具體使用什麼記錄集,取決於需要完成的任務:是要更改數據呢,還是簡單地查看數據。例如,如果必須對數據進行排序或者使用索引,可以使用表。因為表類型的 Recordset 對象是做了索引的,它定位數據的速度是最快的。如果希望能夠對查詢選定的一系列記錄進行更新,可以使用動態集。如果在特殊的情況下不能使用表類型的記錄集,或者只須對記錄進行掃描,那麼使用快照類型可能會快一些。
一般來說,盡可能地使用表類型的 Recordset 對象,它的性能通常總是最好的。
為選擇特定的 Recordset 類型,把 Data 控制項的RecordsetType屬性設成:
RecordSet記錄集屬性
BOF屬性 當記錄集記錄指針指向第一條記錄時返回True
EOF屬性 當記錄集記錄指針指向最後一條記錄時返回True
AbsloutePosition屬性 返回當前記錄集記錄指針,第一條記錄為0,是只讀屬性
Bookmark屬性 String類型,返回或設置當前記錄集記錄指針的書簽,是可讀寫屬性。每一條記錄都有自己唯一的書簽,它與記錄在記錄集中的順序無關。將Bookmark屬性存放到變數中,後面可以通過將該變數賦值給Bookmark屬性,並返回到這個記錄。
注意:程序中使用BookMark屬性重定位記錄指針,而不能使用Abslouteposition
NoMatch屬性 當我們使用Find方法查詢時如果未找到則返回True。常與BookMark屬性同時使用。
例如:查找[NAME]欄位中第一個姓李的人
Dim S As String
With XXXX.RecordSet
S = .BookMark
.FindFirst "[NAME] Like 』李*』"
if .NoMatch then
MsgBox "數據未找到「
.BookMark = S
End if
End With
記錄集方法
AddNew方法 向記錄集增加一條新記錄
Delete方法 從記錄集中將當前記錄刪除。在刪除後常使用MoveNext方法移動指針。
例如:
With XXXX.RecordSet
.Delete
.MoveNext
if .EOF then .MoveLast
End With
MoveXXXX方法
MoveFirst 將記錄集指針移動到第一條記錄上
MoveLast 將記錄集指針移動到最後一條記錄上
MovePrevious 將記錄集指針移動到前一條記錄上
MoveNext 將記錄集指針移動到下一條記錄上
FindXXXX方法
FindFirst在記錄集中查詢符合條件的第一條記錄
FindLast 在記錄集中查詢符合條件的最後一條記錄
FindPrevious 在記錄集中查詢符合條件的前一條記錄
FindNext 在記錄集中查詢符合條件的下一條記錄
好了,有了這么充分的知識了,編寫兩個按鈕命令簡直是小菜一碟,先來試一下,添一個「增加」命令按鈕吧。
Private Sub Command1_Click()
Data1.Recordset.AddNew
End Sub
哇!怎麼這么簡單,再看一下「刪除」命令按鈕
Private Sub Command2_Click()
Data1.Recordset.Delete
Data1.Recordset.AddNew
End Sub
就這樣行了嗎?運行程序吧,OK!一切正常,迫不及待地輸入一條記錄,點擊「增加」按鈕,怎麼?出問題了!因為你只有在進行了AddNew方法後才可以輸入數據,好吧,在窗口的初始化時就增加一條新記錄吧。
Private Sub Form_Initialize()
Data1.Recordset.AddNew
End Sub
輸入完了數據,我們打算退出程序,很自然的我們執行關閉窗口操作,就順利地結束了輸入工作。真的很順利嗎?打開資料庫,看看資料庫中的數據,我們發現剛才輸入的最後一條記錄沒有存入資料庫中。這個很好解釋,每當我們調用AddNew方法時,它就將輸入的記錄存入資料庫中,而當我們關閉窗口時,剛輸入的記錄並沒有保存到資料庫中,那麼在關閉窗口之前對DATA控制項進行一次刷新就可以將數據存入資料庫中了。
Private Sub Form_QueryUnload(Cancel As Inte ger, UnloadMode As Integer)
Data1.Refresh
End Sub
到了這里,我們似乎可以稍稍輕鬆了一點,這個窗口的功能差不多完成了。但是我不得不給你提出一個忠告:在資料庫系統中,應盡量將錯誤在應用級上處理。這句話看起來似乎有點抽象,實際上用在這個程序中就簡單多了。在表Register中,我們將出生日期定義為Date/Time類型,如果在程序運行時,在該欄位對應的文本框中輸入的不是Date/Time格式,在向資料庫提交數據時會出現什麼情況呢?資料庫會向用戶報告錯誤信息。然而這樣對應用程序並不好,這樣的錯誤應該由用戶程序處理,而不是交給資料庫去處理,所以在數據提交之前就應該檢查該欄位的輸入是否合法。
Private Sub Text3_LostFocus()
If IsDate(Text3.Text) Or Text3.Text = "" Then 』檢查是否輸入合法數據
Exit Sub
End If
MsgBox ("輸入錯誤,請輸入你出生的年月日!")
,將選取不合法的數據,以便重新輸入,並使控制焦點不動
Text3.SetFocus
Text3.SelStart = 0
Text3.SelLength = Len(Text3.Text)
End Sub
上面雖是應用程序處理錯誤的一個小例子,可是這種在應用級處理錯誤的思想是十分重要的。
五、尋尋覓覓
在資料庫管理系統中,輸入和查詢就象兩個孿生姐妹不可或缺,下面將介紹如何創建查詢窗口。查詢窗口的設計分為兩部分:查詢結果和查詢條件。查詢結果是指用戶所需要的數據,它包括根據查詢條件查詢出來的記錄,但並非表中每個欄位里的數據都需要提供給用戶。比如在我們這個例子中,登記表中的登記號的值是用戶不感興趣的,所以在查詢結果中,我們不希望顯示RegID欄位的值。查詢條件是用戶提出的查詢要求。比如在我們這個系統中,可以有姓名條件,當用戶想知道某個人的具體情況,他可以輸入此人的姓名,就查詢出此人各方面的情況;也可以有年齡條件,當用戶輸入某個年齡段,就會查詢出處於這個年齡段的所有人的信息。到底採用哪些查詢條件,這需要開發者根據用戶和系統的要求進行設計,其具體實現過程大都大同小異。為了節省篇幅,我們就僅以年齡為條件進行查詢。查詢窗口運行情況如圖9。
在這個程序中我們使用了一個控制項DBGrid,這個控制項用來顯示查詢結果,選中VB的「工程」菜單下的「部件……」項,在控制項標簽中,選中 「Microsoft Data Bound Grid Control 5.0」即可,在工具箱中就會出現DBGrid控制項的小圖標。其使用和其它控制項一樣。
為了和資料庫連接,DATA控制項是不可少的,回憶一下,該怎樣設置它的屬性,OK!同輸入窗口一樣,在CONNECT屬性中,選中「ACCESS」項。在 DatabaseName屬性中,輸入「C:TEMP登記.mdb」。在RecordSource屬性中,選中......嘿,嘿,這里稍微有點不同,如果按輸入窗口那樣的設置,查詢結果中就會包含登記號欄位了。在此屬性中我們應該輸入SQL語句:
select name as 姓名,sex as 性別,hometown as 籍貫,age as 年齡,birthday as 生日,company as 單位,address as 地址,zip as 郵編,telephone as 電話,fax as 傳真 from Register。別著急,盡管這條語句有點長,實際上卻比較簡單。這條語句的語法是:
SELECT 欄位名,欄位名,……FROM 表名 WHERE 條件;
對照語法,我們可以看出輸入的SQL語句的含義:從表Register中查詢姓名,性別,籍費,……欄位的值。只要在欄位列表中不選中登記號欄位,在查詢結果中,就不會顯示登記號的值了。如果你夠細心的話就會注意到我們所寫的SQL語句中在欄位列表中並不僅僅輸入欄位名,在其後面還增加了as……項,如 「name as 姓名」,這是為name欄位取一個別名「姓名」,以便在DBGrid控制項中顯示欄位名時,就會顯示「姓名」而不是「name」。
完成了DATA控制項屬性的設置就可以將DBGrid控制項捆綁到DATA控制項上,其方法同輸入窗口。對了,將「DataSource」屬性設置為 「DATA1」即可。現在不妨運行一下程序,真令人興奮,DBGrid顯示出表中所有的信息。可是怎樣顯示符合條件的數據呢?再看一看上面的SQL語法, WHERE段後可以輸入查詢條件,比如:需要年齡在20到30歲之間的人員信息,其語句為:Select name,... From register where age>20 and age<30;
我們只要根據用戶輸入的條件構成新的SQL語句,並利用DATA控制項的Refrensh方法刷新資料庫,就可以完成條件查詢了。
整個程序十分簡單,當用戶在文本框中輸入年齡段後,點按「查詢」命令,就會顯示符合條件的查詢結果。程序代碼如下:
Option Explicit
Const allinfo = "select name as 姓名,sex as 性別,hometown as 籍貫,age as 年齡,birthday as 生日,company as 單位,address as 地址,zip as 郵編,telephone as 電話,fax as 傳真 from 登記" 』定義不帶條件的SQL查詢語句
Private Sub Command1_Click()
Dim t1, m, n As String
』構造SQL語句的WHERE條件段
If IsNumeric(Text1.Text) Then
m = " age >" + Text1.Text
End If
If IsNumeric(Text2.Text) Then
n = " age < " + Text2.Text
End If
If m = "" And n = "" Then
t
4. VB如何連接網路資料庫
在工程里找到Microsoft ADO Data Control控制項,拖到窗體上,事件中這么寫:
Private Sub Coammand1_Click()
Adodc1.connectionstring="Driver={SQL Server};Server=伺服器IP;Uid=用戶名;Pwd=密碼;DataBse=資料庫名"
Adodc1.RecordSource="SELECT * FROM 表名 WHERE 條件專"
Adodc1.Refrsh
End Sub
要進行數據操屬作就這樣引用:
Adodc1.RecordSet.Fields("欄位名")這就是操作數據欄位
把Adodc1綁定到數據控制項那就是綁定數據源
5. vb中怎樣連接資料庫
可以用ODBC數據源,添加一個SQL的。然後用VB裡面的ADO部件和datagrid部件連接。先在拖出的adodc部件右鍵設置屬性,連接資料庫。再將datagrid連接到adodc就可以看到數據了。
6. vb怎麼連接資料庫寫入數據
'在使用前需要先安裝MySql的驅動,進行正確配置
'注意:必須給出正確的伺服器名、資料庫名、表名、資料庫連接的用戶名、密碼
Option Explicit
Dim Cnn As ADODB.Connection '定義ADO連接對象
Dim Records As ADODB.Recordset '定義ADO記錄集對象
'連接到資料庫
Function CnnOpen(ByVal ServerName As String, ByVal DBName As String, ByVal TblName As String, ByVal User As String, ByVal PWD As String) '伺服器名或IP、資料庫名、登錄用戶、密碼
Dim CnnStr As String '定義連接字元串
Set Cnn = CreateObject("ADODB.Connection") '創建ADO連接對象
Cnn.CommandTimeout = 15 '設置超時時間
CnnStr = "DRIVER={MySql ODBC 5.1 Driver};SERVER=" & ServerName & ";Database=" & DBName & ";Uid=" & User & ";Pwd=" & PWD & ";Stmt=set names GBK" '
Cnn.ConnectionString = CnnStr
Cnn.Open
End Function
'關閉連接
Function CnnClose()
If Cnn.State = 1 Then
Cnn.Close
End If
End Function
'把Excel寫入MySql中的資料庫
Function InsertToMySql(ByVal SheetName As String, ByVal TblName As String)
Dim SqlStr As String
Dim i, j As Integer
Dim Columns, Rows As Integer
Columns = VBAProject.func_public.GetTotalColumns(SheetName)
Rows = VBAProject.func_public.GetTotalRows(SheetName)
Set Records = CreateObject("ADODB.recordset")
'取得結果集並插入數據到資料庫
Set Records = CreateObject("ADODB.Recordset")
'以下語句提供了插入思路,我只是把單條記錄的插入方式改為循環,以把所有的記錄添加到表中
'rs.Open "insert into newtable values('" & ActiveSheet.Cells(i, 1).Value & "'," & "'" & ActiveSheet.Cells(i, 2).Value & "')", cnn, 0
For i = 2 To Rows
SqlStr = "INSERT INTO " & TblName & " values('" & Sheets(SheetName).Cells(i, 1).Value & "'" '注意:" values('",字母「v」之前是有空格的!!!
For j = 2 To Columns
SqlStr = SqlStr & ",'" & Sheets(SheetName).Cells(i, j).Value & "'"
Next
SqlStr = SqlStr & ")"
Set Records = Cnn.Execute(SqlStr) 'rs.Open SqlStr, cnn, 0 不能用這條語句實現!!!
Next
MsgBox "Insert!", vbOKOnly, "Excel To MySql"
End Function
'清除對象
Function ClearObj()
Set Cnn = Nothing
Set Records = Nothing
End Function
7. vb中資料庫連接的問題
Dim conn As New ADODB.Connection '連接對象
Dim rs As New ADODB.Recordset '記錄集對象
Private Sub Command1_Click()
'插入數據:
If rs.State <> adStateClosed Then '檢查記錄集狀態
rs.Close
End If
rs.Open "insert into T_user(name,age) values('" & txtname.Text & "'," & txtage & ")", conn, adOpenDynamic, adLockBatchOptimistic
If rs.State <> adStateClosed Then
rs.Close
End If
'更新DataGrid1數據
rs.Open "select * from T_user", conn, adOpenDynamic, adLockBatchOptimistic
Set DataGrid1.DataSource = rs
End Sub
Private Sub Form_Load()
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\hb\桌面\db1.mdb;Persist Security Info=False"
conn.CursorLocation = adUseClient '游標放在客戶端
rs.CursorLocation = adUseClient
rs.Open "select * from T_user", conn, adOpenDynamic, adLockBatchOptimistic
Set DataGrid1.DataSource = rs
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close '釋放
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub
8. vb中的資料庫連接
Public conn As New ADODB.Connection
Public ConnString As String
Public Sub CON()
ConnString = "provider=microsoft.jet.oledb.4.0;" & _
"data source=" & App.Path & "\資料庫名.mdb;Jet OLEDB:Database Password=123456"
If conn.state <> 1 Then
conn.Open (ConnString)
End If
End Sub
以上一般放在模塊里,用的時候調CON()就可以了
以下是你要在使用這個庫中某個表時寫的
Dim rs As New ADODB.Recordset
dim sql as string
sql="select * from 表" ;這個只要是SQL語句就可以
rs.Open sql, conn, adOpenKeyset, adLockPessimistic
執行上面寫的SQL語句
rs.fields(0);括弧里是欄位在表裡的位置,從0開始
或者rs.field("欄位名")也可以
最後別忘了關閉數據集
rs.close
9. vb中怎樣連接資料庫
什麼資料庫???
'** ----- 資料庫連接字元串模板 ---------------------------------------
'** ACCESS資料庫
'** iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
'** "Password=""密碼"";Data Source=資料庫名"
'**
'** SQL資料庫
'** iConcStr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _
'** "User ID=用戶名;Password=密碼;Initial Catalog=資料庫名;Data Source=SQL伺服器名"
10. 在VB中怎樣連接sql資料庫的具體操作
設置好數據源後就可以連接了。