Presentation is loading. Please wait.

Presentation is loading. Please wait.

第十七章 ADO .NET資料庫連線與存取.

Similar presentations


Presentation on theme: "第十七章 ADO .NET資料庫連線與存取."— Presentation transcript:

1 第十七章 ADO .NET資料庫連線與存取

2 17.1 如何引用ADO .NET命名空間 由上一章我們知道,在 .NET Framework的架構中是由所使用資料庫(來源)來決定使用SQL .NET Data Provider或是OLE DB .NET Data Provider。由於這兩者 .NET Data Provider分屬不同的命名空間(Namespace),因此,必須使用Imports敘述來引用對應ADO .NET的命名空間,這樣才能在撰寫程式時,能使用較簡潔的ADO .NET物件來存取資料庫。至於ADO .NET包括那些命名空間可以如下圖,透過功能表的【檢視(V)/物件瀏覽器(J)】來查詢

3

4 下面只列出上圖中ADO .NET常用的相關命名空間說明:
1. System.Data 是ADO .NET命名空間的核心,大部分是由構成ADO .NET架構的類別所組合而成的。這些類別是Managed應用程式用來存取資料的主要方法。它定義了Tables、Rows、Columns、Constraints和 DataSet所代表的型別。由此可知DataSet類別是位於System.Data命名空間中,因此在撰寫程式時若有使用到DataSet類別,必須在程式的最開頭使用Imports敘述來引用此命名空間,其寫法如下:

5 2. System.Data.OleDb 這個命名空間定義了允許您連接到OLE DB這類型的資料來源、接受 SQL查詢和透過Fill 方法將資料填入DataSet中。這些資料來源包括Access、Excel、SQL Server 7.0以上版本的資料庫…等。若在程式中使用這類型的資料庫,必須在程式的最開頭使用Imports敘述引用此命名空間,其寫法如下: 在OLE DB .NET Data Provider下,所使用的ADO .NET物件名稱的前面必須加上OleDb,如:OleDbConnection、OleDbCommand、OleDbDataReader…等。

6 3. System.Data.SqlClient 這個命名空間允許您連接到SQL Server 7.0(含)以上版本的資料庫,使用這類型可以直接和SQL Server連接。若在程式中使用這類型的資料庫,必須在程式的最開頭使用Imports敘述含入此命名空間,其寫法如下: 在SQL .NET Data Provider下,所使用的ADO .NET物件名稱的前面必須加上Sql,如:SqlConnection、SqlCommand、SqlDataReader…等。

7 下表即是ADO .NET在各所屬命名空間中各物件命名對照表:

8 17.2 使用Connection物件開啟、關閉資料庫的連接
ADO .NET所提供的Connection物件,主要是用來與資料庫來源之間建立連接。Connection物件提供下列兩種常用方法: 1.Open方法:用來開啟與資料庫的連接。 2.Close方法:用來關閉與資料庫的連接。 接著介紹ADO .NET架構下,如何引用ADO .NET命名空間、開啟與關閉所提供兩種不同資料來源連接的程式片段:

9 Case 1 引用System.Data.OleDb命名空間(適用Access、Excel…等資料庫)
 引用命名空間: Imports System.Data Imports System.Data.OleDb  宣告OleDbConnection連接物件: Dim myConnection As OleDbConnection  宣告一個名稱為connStr的字串變數,用來存放資料庫的連線字串,並指定資料庫所在的真實路徑: Dim connStr As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & 資料庫真實路徑

10  建立OleDbConnection物件並指定其資料庫的連接字串: myConnection = New OleDbConnection( connStr )
 使用Open方法開啟與資料庫的連接: myConnection.Open()  完成資料庫存取後再使用Close方法關閉與資料庫的連接: myConnection.Close() 以上完整程式寫法如下:

11 註:第3-5行可以合併成下列一行敘述:

12 Case 2 引用System.Data.SqlClient命名空間(適用SQL Server 7.0以上版本的資料庫)
操作方式和 Case 1 類似,先宣告SqlConnection物件,再建立SqlConnection物件並指定其連接的資料庫,最後使用Open方法開啟與資料庫的連接、使用Close方法關閉與資料庫連接。但SqlConnection及OleDbConnection物件的資料庫連線字串寫法不一樣。

13 以下是SqlConnection物件連接字串的參數設定:
server:可指定資料庫的伺服器名稱、IP位址、localhost(代表本機)。 database:SQL Server資料庫的名稱。 uid:資料庫連接帳號,sa使用SQL表示資料庫管理者帳號。 pwd:資料庫連接密碼。 若uid與pwd都不加,則表示使用目前登入系統的Windows帳號來連接SQL Server,如果在ASP .NET網頁(Web Form)中,則是使用「ASP.NET」這個帳號。另外各項參數名稱大小寫不分。

14 17.3 使用DataReader物件讀取資料表記錄
上一節已經介紹過如何開啟與關閉資料庫的連接,本節將陸續介紹對已開啟的連接資料庫,如何透過ADO .NET架構內的Command及DataReader物件來讀取資料庫內的資料。 Command物件 Command物件可以讓您執行SQL資料庫命令,以傳送和修改資料、執行預存程序(Stotred Procedure)、並且傳送或擷取參數資訊。所以,Command物件透過SQL命令可從資料來源擷取資料,也可將異動過的資料傳回資料來源。此物件提供下列兩種方法來存取資料庫的內容:

15 1.ExecuteReader方法 執行Command物件中所指定SQL 語法的Select命令,建立一個DataReader物件以進行資料的瀏覽。
2.ExecuteNonQuery方法 使用Command物件的ExecuteNonQuery方法,可以新增、刪除、修改資料庫中的資料,也就是說執行SQL語法中的Insert、Delete、Update命令。

16 DataReader物件 使用DataReader物件可以由資料庫中順向(Forward-only)逐筆讀取資料流中的資料列,由於並不是一次將所有資料傳向用戶端的記憶體中,因此能提升應用程式的效能和降低系統的負荷量,使得執行速度快且不佔用記憶體太多的資源。DataReader物件讀取資料方式是先透過Connection物件和資料庫連接,再經由Command物件的ExecuteReader方法執行SQL Select查詢命令擷取出欲查詢的資料,再透過DataReader物件中所提供的屬性和方法,將擷取的資料以唯讀方式由記錄指標所指的資料列順向逐筆處理,將資料放入記憶體或直接顯示在表單上。但要注意在DataReader開啟時間,必須和資料庫一直保持連接,此時Connection只能供DataReader使用,必須等到DataReader關閉後,才能允許執行Connection的任何命令。下圖即是DataReader物件讀取資料庫記錄的流程。

17

18 至於在程式中如何建立DataReader物件,其寫法如下:
Case 1 引用System.Data.OleDb命名空間(適用Access、Excel…等資料庫)  宣告myDataReader、myCommand分別屬於OleDbDataReader、OleDbCommand物件。寫法如下: Dim myCommand As OleDbCommand Dim myDataReader As OleDbDataReader  建立myCommand屬於OleDbCommand物件,並設定所要執行的SQL命令。寫法如下:(關於SQL命令請參閱17.5節) myCommand = New OleDbCommand (“SQL命令”, myConnection)  使用OleDbCommand物件的ExecuteReader方法,執行所指定的SQL查詢命令建立myDataReader物件,只要透過myDataReader物件所提供的方法及屬性即可進行資料的瀏覽。寫法如下: myDataReader = myCommand.ExecuteReader()

19

20 Case 2 引用System.Data.SqlClient命名空間(適用SQL Server 7.0以上版本的資料庫)

21 DataReader常用的屬性與方法 透過Command物件的ExecuteReader方法執行SQL的查詢命令即可建立DataReader物件,DataReader物件內所存放的是查詢結果的資料串流,你可使用下表DataReader物件所提供的屬性與方法來逐一取得每筆記錄或相關欄位的資料:

22

23

24 17.3.4 如何使用DataReader讀取查詢結果
當你想透過DataReader物件來讀取由資料庫中所擷取出的查詢結果,可以使用重複結構來檢查記錄指標是否已經指到EOF檔案結尾符號,若記錄指標尚未指到EOF表示資料未讀完,便可利用上表DataReader所提供的方法和屬性,順向逐一取得每個欄位的名稱和該欄位內所存放的資料;若記錄指標指到EOF表示資料已經讀取完畢,便可結束讀取動作。

25 1. 如何透過DataReader物件取得資料列(記錄)的欄位名稱
利用FieldCount屬性取得欄位總數,再將此傳回值減1取得欄位註標的最大值,再利用For…Next配合GetName方法分別取得各欄位的名稱,並將欄位名稱顯示在表單的TextBox1文字方塊控制項上面。

26 2. 如何透過DataReader物件來顯示各資料列欄位內的資料。
有下列兩種方式,第一種方式的使用時機是當需要顯示所有欄位時使用,第二種方式是當僅顯示部分欄位內容時使用:  透過Do While…Loop敘述判斷記錄指標是否指到EOF檔案結尾符號?若記錄指標尚未指到EOF,表示資料列尚未讀完,此時透過For…Next敘述配合Item屬性,將記錄指標所指到的資料列(記錄)各欄位內容,顯示在表單的TextBox1控制項上面。

27  利用Do While…Loop及Read方法判斷記錄指標是否指到EOF(檔案結尾符號),若沒有指到EOF,則將目前指標所指向的記錄從資料庫讀出來並放到DataReader物件中,再使用Item屬性讀取某一欄位的資料,並顯示在TextBox1控制項物件內。

28

29 【執行結果】 將書附光碟ch17資料夾下的DataReader1子資料夾複製到你的電腦,再將DataReader資料夾內所有檔案的唯讀屬性取消,然後執行 [DataReader1\bin\Debug\DataReader1.exe] 執行檔,結果出現下圖表單:

30 Step1.進入VB 2005的整合開發環境,新增一個Windows應用程式專案。其專案命名為「DataReader1」,記得將專案進行存檔。
Step2.請將書附光碟ch17資料夾下的ScoreDb.mdb 資料庫複製到目前製作專案的 [DataReader1\bin\Debug] 資料夾下,然後再將ScoreDb.mdb的唯讀屬性取消。 Step3.建立如下所示之表單:

31 Step4.引用ADO .NET的命名空間 執行功能表的【檢視(V)/程式碼(C)】開啟「檢視程式碼」視窗,然後在程式的最開頭必須引用(Imports)對應的ADO .NET命名空間。因為我們使用Access資料庫,所以請在程式的最開頭引用(Imports)System.Data.OleDb,在下面虛框處即是指定要撰寫的程式碼:

32 Step5.完整程式碼如下。

33

34 【說明】 1.「DataReader1」範例是引用System.Data.OleDb命名空間,所以此範例中的ADO .NET物件名稱之前都必須加上OleDb。 2.第6行:設定資料庫的連接字串及資料庫所在之真實路徑。 3.第7行:將可查詢SCORE資料表所有記錄的SQL字串指定給selectcmd字串變數。 4.第8行:宣告OleDbConnection類別的conn物件,宣告OleDbDataReader類別的reader物件,宣告OleDbCommand類別的cmd物件。 5.第9行:建立conn物件並指定connStr連接字串。 6.第10行:使用conn物件的Open方法來開啟連接的資料庫。

35 7.第11行:建立cmd物件,並設定所要執行的SQL語法及conn物件。
8.第12行:使用cmd物件的ExecuteReader方法執行SQL語法建立查詢結果的reader物件。 9.第13-15行:使用For…Next逐一取得SCORE資料表的欄位名稱並放入txtShow控制項物件內。 10.第17-22行:使用巢狀重覆結構配合reader物件的FieldCount及Item屬性逐一取得SCORE資料表的欄位資料,並放入txtShow控制項物件內。 11.第23行:使用conn物件的Close方法關閉資料庫的連線。 12.Item屬性也可以指定欄位名稱,範例「ch17\DataReader2」就是使用此種寫法:

36 本例可將Item改用GetValue,但要注意GetVaue後面接的參數不能指定欄位名稱。例如範例「ch17\DataRedaer3」就是使用這種寫法:

37 17.4 使用DataSet物件讀取資料表記錄 17.4.1 DataSet物件
DataSet物件可說是ADO .NET的主角,它像是一個記憶體中的資料庫,它採用離線存取資料庫的方式。例如:資料庫應用程式與SQL Server資料庫分別安裝在不同的主機上,當資料庫應用程式向SQL Server資料庫要求取得資料時,SQL Server資料庫會將所要擷取的全部資料傳送到執行資料庫應用程式所在電腦的記憶體(DataSet)中,此時可與資料庫中斷連線。當DataSet中的資料更新完畢後,再重新和SQL Server資料庫進行連線,將資料全部一次更新到SQL Server資料庫中。因此DataSet執行效率佳,適用於多用戶端資料存取,但此種方式須耗費較多的記憶體空間。在DataSet中可以包含一個以上的DataTable物件,DataTable物件相當於主記憶體中的一個資料表。

38 DataAdapter物件 DataAdapter物件是資料庫和DataSet之間溝通的橋樑。DataAdapter物件使用Command物件執行SQL命令,將由資料庫所擷取的資料送到DataSet,此時便可使用DataTable物件來存取資料表,將DataSet裡面的資料經過處理後再送回資料庫。下圖即是DataAdapter物件架構:

39

40 如何使用DataAdapter物件 使用下列步驟可產生名稱為「成績單」與「股票行情表」的DataTable物件。 Step1.建立名稱為myDataSet 的DataSet物件以及宣告myAdapter是一個DataAdapter物件。 Step2.建立myAdapter物件並指定所要執行的SQL命令及指定欲連接的資料庫

41 Step3.使用DataAdapter物件的Fill方法,將查詢資料的結果放到DataSet物件中。此時DataSet物件中即會產生一個DataTable物件,該DataTable物件會以資料表的方式存放查詢資料的結果,所以只要透過DataTable物件即可取得SQL命令所查詢的資料。

42 【完整程式片段】

43 上述程式在DataSet物件中產生了「成績單」及「股票行情表」的DataTable物件。你也可以透過DataSet物件所提供的Tables集合物件(由DataTable物件所構成),來指定要取用那一個DataTable物件。 上述程式也可改用表格編號來取得DataTable物件,Tables集合物件的註標起始值為0。

44 透過下面程式來取得DataTable的總數或DataTable名稱。
若DataTable物件指定給DataGridView控制項的DataSource屬性,則目前表單上DataGridView控制項內會顯示該DataTable物件中的所有資料,如下程式:

45 下圖即是DataSet物件與DataTable物件兩者間的關係:

46

47 【執行結果】 將書附光碟ch17資料夾下的DataSet1子資料夾複製到你的電腦,再將DataSet1子資料夾內所有檔案的唯讀屬性取消。 執行 [DataSet1\bin\Debug\DataSet1.exe] 執行檔開啟本例表單,如下圖成績單、股票行情表、碁峰圖書這三個DataTable物件名稱都加到ComboBox控制項中,DataGridView控制項預設顯示碁峰圖書DataTable物件之內容。選取ComboBox控制項之DataTable物件名稱,然後再按 鈕,此時DataGridView控制項即會顯示所選取的DataTalbe物件之所有資料。

48

49 註:DB.mdb資料庫中包含BOOK、SCORE、STOCK三個資料表。

50 Step1.進入VB 2005的整合開發環境,新增一個Windows應用程式專案。其專案命名為「DataSet1」,記得將專案進行存檔。接著再將書附光碟ch17資料夾下的DB.mdb複製到目前製作DataSet1專案的bin\Debug資料夾下,然後再將DB.mdb唯讀屬性取消。 Step2.建立如下所示之表單:

51 Step3.撰寫如下程式碼:

52

53 【說明】 1.本範例建立OleDbDataAdapter類別的myAdapter物件,myAdapter物件共執行三次SQL 語法的Select命令,並使用myAdapter物件的Fill方法將查詢的結果存放到myDataSet物件(DataSet),並產生三個DataTable物件,其名稱為「成績單」、「股票行情表」和「碁峰圖書」。 2.第5行:由於本例在其他程序中會重複使用到「成績單」、「股票行情表」和「碁峰圖書」這三個DataTable物件,所以我們必須將myDataSet設成全域物件。 3.第10行:宣告OleDbConnection類別的conn物件,宣告OleDbDataAdapter類別的myAdapter物件。 4.第14行:建立myAdapter物件,並指定SQL命令及conn資料庫連接物件。 5.第13-21行:使用myAdapter物件的Fill方法將查詢的結果放到myDataSet物件中的各個DataTable物件。

54 6.第22-24行:使用重覆結構逐一取得myDataSet物件的DataTable物件名稱並加到cboTable清單控制項中。
7.第26行:DataGridView1控制項的DataSource屬性設為DataTable集合物件第三個DataTable物件,該DataTable物件為「碁峰圖書」資料表,所以表單一執行時DataGridView1控制項即顯示「碁峰圖書」的內容。 8.第31行:透過cboTable清單控制項來取得某一個DataTable物件,然後再指定給DataGridView1控制項的DataSource屬性,使DataGridView1顯示cboTable清單控制項對應的DataTable物件。 9.本例也可直接在Tables集合物件中指定資料表的名稱,因此本例第22-24行程式可改成下面寫法:(完整範例參閱書附光碟 [ch17\ DataSet2] 範例)

55 17.4.4 如何使用DataTable物件來取得資料
在前面曾提及DataTable物件有如記憶體中的資料表。因此,只要透過下列屬性,即可取得名稱為myDataTable的DataTable物件中的資料: 1.取得DataTable的欄位數目 myDataTable.Columns.Count 2.取得DataTable的第j個的欄位名稱 (註標起始值為0) myDataTable.Columns(j).ColumnName 3.取得DataTable的資料總筆數 myDataTable.Rows.Count 4.取得DataTable的第i列某一個欄位的資料內容 myDataTable.Rows(i).Item(“欄位名稱”) 5.取得DataTable的第i列第j欄的資料內容,註標起始值為0 myDataTable.Rows(i).Item(j)

56 DataTable物件的架構如下圖所示:

57 17.4.5 如何使用DataTable顯示查詢結果的所有記錄
1.取得DataTable物件的欄位名稱,可使用以下的方法: 使用Columns.Count減1取得欄位的最大註標值,然後再利用For…Next配合ColumnName來取得第i欄的欄位名稱,並放入txtShow文字方塊內。

58 2.取得DataTable物件的欄位資料,有下列兩種方法:
方法一 使用巢狀迴圈來逐一取得DataTable物件第i列第j欄的資料,並放入txtShow文字方塊內,其寫法如下:

59 方法二 使用巢狀迴圈來逐一取得DataTable物件第i列某一個欄位的資料,並放入txtShow文字方塊內。其寫法如下:

60

61

62 Step1.啟動VB 2005的整合環境,新增一個Windows應用程式,其專案命名為「DataTable1」,再將書附光碟ch17資料夾下的SCOREDB.mdb複製到目前製作的DataTable1專案bin\Debug資料夾下,然後再將SCOREDB.mdb的唯讀屬性取消。 Step2.建立如下所示之表單:

63 Step3.撰寫如下程式碼:

64

65 【說明】 1.第7-14行:建立conn物件連接SCOREDB.mdb資料庫,建立myAdapter物件取得SCORE資料表,並將SCORE資料表所有記錄填入myDataSet的DataTable物件。 2.第15行:建立DataTable,其物件名稱為myDataTable。 3.第16-18行:使用For迴圈逐一取得資料表(DataTable物件)的欄位名稱,並指定給txtShow文字方塊。 4.第20-25行:使用巢狀For迴圈逐一取得資料表(DataTable物件)的欄位資料。Item屬性也可以指定欄位名稱,所以本例的第20-25行程式也可以改寫為如下程式碼,例如書附光碟中「ch17\DataTable2」範例程式就是使用下面寫法:

66

67 17.5 SQL語法與Command物件 SQL(Structured Query Language 結構化查詢語言)是一套標準的資料庫管理與存取語言,它使用接近人類英文口語的方式來存取資料庫,而一般常見的 SQL Server資料庫 (如微軟的 Microsoft SQL Server 2000) 都支援 SQL語法,就連 Access 資料庫也可以使用 SQL 語法來存取。因此 SQL 成為目前各類型資料庫中最為通用的資料庫存取語言。以下將介紹SQL常用的語法:

68 Select查詢命令 SQL語法中的Select命令可根據Where子句所設定的條件式,對資料庫進行資料的查詢或排序工作,其語法如下: 【說明】 1.別名:是欄位名稱的替代名稱,欄位名稱是供SQL Server辨識欄位用的。別名是給使用者看的。若省略別名,則欄位名稱就是別名。 2.Select後面接的欄位名稱1,欄位名稱2,….欄位名稱N是設定資料表中的那些欄位的內容要做輸出,欄位名稱間必須以逗號加以區隔。譬如:下列寫法表示只輸出SCROE資料表中的name、chi、eng三個欄位的所有記錄: Select name ,chi , eng From SCORE

69 3. From後面所連接的是資料表名稱,代表所要查詢的資料表。譬如:將STOCK資料表的全部欄位的所有記錄全部輸出,其寫法為: Select
3.From後面所連接的是資料表名稱,代表所要查詢的資料表。譬如:將STOCK資料表的全部欄位的所有記錄全部輸出,其寫法為: Select * From STOCK 4.如果只要將STOCK資料表的最前面五筆記錄所有欄位輸出,其語法如下: Select Top 5 * From STOCK

70 5.若查詢的資料是有條件的篩選,就必須加上Where子句。接在Where子句後面的必須是一個條件式,它會將符合條件的記錄輸出。我們可以使用關係運算子如(=、<、>、<>…)等來設定所要查詢的條件式,多個關係運算式連在一起就必須加上邏輯運算子(And、Or、Not) 來設定多個查詢;如果省略Where子句,將傳回所有記錄。例如以下Select語法可以用來查詢MEMBER資料表中符合id_no帳號欄位的資料是 ”A001” 而且pass密碼欄位的資料是 ”6036” : Select * From MEMBER Where id_no = ‘A001’ And pass =’6036’ 6.Order By後面所連接的欄位名稱為排序的依據,若省略Desc參數則輸出的資料由小排到大做遞增排序;若加上Desc參數,表示將輸出的資料由大排到小做遞減排序,若省略Order By將不做排序。譬如:欲將PRODUCT資料表中的id_no欄位內容由大到小排序輸出,其寫法如下: Select * From PRODUCT Order By id_no Desc

71 使用SQL語法的注意事項 當要透過Command或DataAdapter物件來執行SQL語法時,通常會在表單中的文字方塊控制項(若其名稱為txtName)內,鍵入條件資料來進行查詢,其撰寫方式如下:

72 【說明】 1.上述程式txtName.Text表示表單中在文字方塊txtName所輸入的資料,也就是所要在資料庫中搜尋的姓名條件(單引號括住的資料被SQL語法視為字串,如果未被單引號包括住的資料將被視為數字)。譬如:若txtName.Text的值為”王小明”(字串),則SQL語法轉換過程如下:“Select * From Member Where name =’”& txtName.Text & “’”雙引號是用來表示VB的字串,加底線處轉成王小明“Select * From Member Where name =’”& “王小明” & “’”“Select * From Member Where name =’ 王小明 ’“單引號是用來表示SQL命令中的字串值。灰底處做字串合併

73

74 2.由上圖SQL語法轉換過程可知,單引號包括住的資料會被SQL視為字串,雙引號包括住的資料會被VB視為字串,這樣看起來是不是清楚多呢?簡單地說雙引號是給VB解譯的,而單引號是給SQL解譯。

75 【執行結果】 1.將書附光碟ch17資料夾下的Command1子資料夾複製到你的電腦,再將Command1資料夾內所有檔案唯讀屬性取消,然後執行 [Command1\ bin\Debug\Command1.exe] 程式檔,結果出現如下圖畫面

76

77 2.按 鈕後會結束程式,按 鈕會出現如下圖的對話方塊,你可在對話方塊輸入要查詢的學生成績並按 鈕即可。

78 3.若資料表己經有該位學生,如左下圖文字方塊會顯示該學生的成績資料;否則如右下圖在文字方塊顯示「找不到這個學生的成績!」的訊息。

79 Step1.啟動VB 2005的整合環境,新增一個Windows應用程式,其專案命名為「Command1」,再將書附光碟ch17資料夾下的SCOREDB.mdb複製到目前製作的Command1專案bin\Debug資料夾下,然後再將SCOREDB.mdb的唯讀屬性取消。 Step2.建立如下所示之表單:

80 Step3.選寫如下程式碼:

81

82 【說明】 1.第8行:利用InputBox函式來取得使用者輸入學生姓名,並指定給selectName變數。 2.第9行:將查詢的SQL語法與查詢條件selectName做字串合併。 3.第11-15行:建立OleDbDataReader類別之物件,其物件名稱為myReader。 4.第15行:使用cmd的ExecuteReader()方法傳回查詢結果的myReader物件。 5.第16-24行:判斷DataReader記錄指標是否指到檔案結尾(EOF)。若記錄指標未指到檔案結尾,則執行第17-21行,將學生成績顯示在txtShow文字方塊內;否則執行第23行,則txtShow文字方塊顯示「找不到這個學生的成績!」的訊息。

83 注意 在範例Command1.sln對話方塊內輸入含有「’」(單引號)符號時,然後再按下 鈕,此時程式執行時會出現錯誤。例如:下圖是輸入「Jack’wu」所出現的執行結果。

84

85 這是因為在『jack’wu』字串中加了一個單引號,還記得嗎?我們曾經介紹過SQL會將單引號括住的資料視為字串,而雙引號括住的資料,則被VB 2005視為字串處理,譬如下列SQL語法:

86 上述SQL語法執行時,會將Jack視為字串(因為Jack被單引號括住),而wu’的資料因為前面少了一個單引號而發生錯誤,此種情形該如何解決呢?在SQL語法中將連續兩個單引號「’’」視為一個單引號,而VB 2005則將連續兩個雙引號「””」視為一個雙引號,所以我們可使用String字串類別的Replace方法將字串中的一個單引號取代為兩個單引號:請將範例Command1.sln的第9行程式: 修改為下列敘述即可,例如範例Command2.sln就是使用這種方式。 上述語法是將使用者所輸入的資料selectName,有單引號的部分使用兩個單引號來取代,程式經過修改後,當你輸入有單引號的資料時,便不會發生錯誤了。

87 Insert新增命令 如果要將用戶端表單所輸入的資料,新增到伺服器端的資料庫中,可使用SQL語法的Insert Into敘述來做新增一筆資料到該資料表的最後面,其語法如下:

88 【說明】 上述SQL語法在指定資料表中新增一筆記錄,該筆記錄內將新增[資料1]放入[欄位名稱1]內、新增[資料2]放入[欄位名稱2] …新增[資料N]放入[欄位名稱N]中…以此類推,根據我們所對應的欄位名稱來做新增資料的動作。下面範例程式,在PRODUCT資料表內新增一筆記錄,將prod_id變數(為字串須加單引號)對應到id_no欄位、prod_name變數(為字串須加單引號)對應到name欄位(字串)、prod_price變數(為數值不用加單引號)對應到price欄位:

89 Delete刪除命令 SQL提供了Delete敘述讓我們可以刪除所指定的資料,其語法如下: 根據指定的資料表,找出符合Where條件的資料並刪除。例如下列語法用來刪除PRODUCT資料表中id_no欄位內容為 ”A123” 的資料

90 Update更新命令 當資料庫內某個資料表的某筆資料內容需要做修改時,可以透過SQL所提供的UpDate命令來修改指定的欄位資料,其語法如下: 【說明】 1.Set是將資料指定給特定的欄位。 2.Where根據所設定的條件式,修改指定欄位資料。下列敘述是指定修改PRODUCT資料表中條件為id_no(欄位)等於 ’B123’ (因為字串所以加單引號)的資料,將該筆記錄的name(欄位)資料修改為’主機板’。price欄位中資料修改為4000。其寫法如下:

91 17.5.6 如何使用Command物件及SQL語法更新資料庫
當撰寫好新增(Insert)、刪除(Delete)、修改(Update)資料的SQL語法,此時你可以透過Command物件的ExecuteNonQuery方法來異動資料庫的資料。其寫法如下:

92

93 【執行結果】 1.將書附光碟ch17資料夾下的Command3子資料夾複制到你的電腦,再將Command3資料夾內所有檔案的唯讀屬性取消,然後執行 [Command3\bin\Debug\Command3.exe] 程式後,出現如下圖之畫面,表單的DataGridView控制項顯示PERSON資料表的所有記錄。

94 2.在姓名、電話、職稱、薪資文字方塊輸入資料並按 或 、 鈕,可新增、修改、刪除資料;修改及刪除資料是以姓名欄位為依據。
Step1.啟動VB 2005的整合環境,新增一個Windows應用程式,其專案命名為「Command3」,再將書附光碟ch17資料夾下的SCOREDB.mdb複製到目前製作的Command3專案bin\Debug資料夾下,然後再將SCOREDB.mdb的唯讀屬性取消。 Step2.建立如下所示之表單:

95

96 Step3.撰寫如下程式碼:

97

98

99

100

101 【說明】 1.第5-16行:為ShowPerson程序;該程序功能可讓DataGridView1控制項顯示PERSON資料表所有記錄。 2.第61-63行:GetSqlStr函式可將字串中含有「’」單引號的部份改成「’’」兩個單引號,該函式的使用方法如下: 新字串變數 = GetSqlStr(字串變數或字串資料) 3.第19行:呼叫ShowPerson程序,使DataGridView1控制項顯示Person資料表所有記錄。 4.第25行:將新增資料的SQL語法指定給insertCmd字串變數。在這個SQL語法中使用GetSqlStr函式將輸入資料中有「’」部份改為「’’」。 5.第29行:建立Command類別的cmd物件,並指定insertCmd字串變數(新增資料的SQL語法)及conn資料庫連接物件。

102 6.第30行:使用cmd物件的ExecuteNonQuery方法來更新資料庫。
7.第38行:將修改資料的SQL語法指定給updateCmd。 8.第51行:將刪除資料的SQL語法指定給delCmd。 9.PERSON資料的「學號」欄位類型設為「自動編號」,所以當新增一筆資料記錄時,該欄位的資料會自動新增。

103 注意  我們常使用表單讓用戶端新增、查詢、刪除、修改伺服器端的資料,但輸入表單的資料和資料庫的欄位類型必須符合且欄位不能為空白,否則會發生不可預測的錯誤。  你只要將Access設計檢視的「允許零字串長度」修改為「是」,則該欄位新增空白資料也不會發生錯誤。如下圖所示

104 如何使用具名參數及SQL語法 我們也可以使用含有具名參數的SQL語法。使用含有具名參數之SQL語法執行效果比執行SQL字串還要好,而且不必將參數中有「’」單引號部份改為「’’」雙引號。以下是使用具名參數SQL語法之步驟: @salary。

105 Step2.建立Command物件並指定所要執行的新增、刪除、修改資料之SQL語法及Connection物件。
@position,

106 Step4.將資料指定給具名參數。如下寫法,將 ”王彼得” 指定給@name,”技術副總” 指定給@position,”04-12345678” 指定給@tel,50000指定給@salary。
Step5.使用Command物件的ExecuteNonQuery方法執行新增、修改、刪除之SQL語法,使資料庫更新

107 上述步驟,完整程式片段如下:

108 上述程式的第3-6行語法,必須指定其Parameters參數之資料型別,而下表是引用System. Data
上述程式的第3-6行語法,必須指定其Parameters參數之資料型別,而下表是引用System.Data.SqlClient及System.Data.OleDb的Parameters參數之常用資料型別。

109 下面程式為範例Command4的完整程式碼。範例Command4表單物件的佈置與範例Command3相同,以下程式粗體字部份是Command4與Command3不同的地方,在這個範例我們使用含有具名參數的新增、刪除、修改之SQL語法,因此本例不需要將使用者輸入的資料有「’」部份改為「’’」。

110

111

112

113

114


Download ppt "第十七章 ADO .NET資料庫連線與存取."

Similar presentations


Ads by Google