12-1. 資料庫基礎觀念 (1). 使用 Access 建立資料庫及資料表 : (2)..NET 2005 讀取資料庫的部分, 雖然工具箱的控制項與.NET 2003 稍有不同, 但是核心程式碼, 還是維持與.NET 2003 相同的架構 (3). 但是.NET 2005 的 web 程式 (As

Similar documents
投影片 1

untitled

untitled

2 ADO.NET Internet 1.2

untitled

untitled

untitled

第 一 章 資料庫概念

Microsoft PowerPoint - VB14.ppt

(Microsoft PowerPoint -

ADO.NET 資料庫存取架構

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

基于ECO的UML模型驱动的数据库应用开发1.doc

投影片 1

一 新增 SQL Express 2008 資料庫 步驟一 : 首先, 利用 VB 新增一個 Windows Form 應用程式的專案, 專案名稱為 MyDB 專案名稱為 MyDB 步驟二 : 接下來, 請執行 VB 功能表上的 專案 / 加入新項目, 此時, 請在 加 入新項目 的對話方塊中, 選





2


!"# $! "##$! $ "%& % & #$# & ()% & "!! * "! * #! * * $! ((!"# "##$ + #++ * * * * * * * * * * + $," ("# +### "##$ $ + + & $ ### "%& % & #$# & ()% & " "





Microsoft PowerPoint - vb13.ppt

VB控件教程大全

教案模板4-2

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM

導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式

Chapter 00 導論

第一章 章标题-F2 上空24,下空24

Visual Basic D 3D


( )... 5 ( ) ( )

Chapter 16 集合

第七章

法 与 采 购 模 式, 不 仅 不 能 保 证 一 些 战 略 性 物 资 的 充 分 供 应, 很 容 易 造 成 供 应 风 险, 而 且 会 影 响 供 应 链 的 后 续 活 动 因 此, 必 须 对 当 前 的 物 资 分 类 加 以 改 革 2 集 中 采 购 供 应 商 准 入 门

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

多層次傳銷與獎金系統


Microsoft PowerPoint - course10.ppt

一 個 SQL Injection 實 例 的 啟 示 頁 2 / 6 因 此, 在 知 名 網 站 上 看 到 SQL Injection, 讓 人 驚 心, 卻 不 意 外 網 站 專 案 外 包 是 目 前 業 界 的 常 態, 而 在 價 格 取 勝 的 制 度 下, 低 價 得 標 的 S

untitled

目錄

untitled

Ⅰ Ⅱ Ⅲ Ⅳ

Microsoft PowerPoint - ASP_NET_08

untitled

ASP.NET实现下拉框二级联动组件

i

3 Driver do Microsoft Access (*.mdb) hisdata IFIX 1.4

<4D F736F F D20C9CFBAA3CAD0BCC6CBE3BBFAB5C8BCB6BFBCCAD4C8FDBCB6BFBCCAD4B4F3B8D95FBDA8D2E9B8E55F5F E646F63>

幻灯片 1

14-1 西 亞 的 自 然 環 境 第 14 章 西 亞 重 要 特 徵 : 乾 燥 氣 候 高 原 地 形 一 以 高 原 為 主 體 的 地 形 地 形 分 區 地 形 主 體 地 形 特 徵 1 世 界 最 大 半 島 古 老 地 台 與 2 古 老 地 台 : 因 紅 海 陷

<463A5CC2A4B6ABD1A7D4BA5CBDCCD1A7D6B8C4CFD7DC5CA1B C B3CCD0F2C9E8BCC6A1B7BFCEB3CCD6B8C4CF2E646F63>

麻 煩 的, 中 國 歷 來 是 一 個 產 能 非 常 大 的 國 家, 中 國 的 建 築 工 人 就 有 八 千 萬, 所 以 一 旦 通 貨 緊 縮 以 後, 第 一, 整 個 產 業 波 動, 產 能 過 剩, 第 二, 失 業 率 大 幅 度 提 高, 國 家 就 會 變 得 動 蕩,

Flexsim: (Open DataBase Connectivity, ODBC)

ActiveX Control

使用手冊

(DMO) 1 1 Microsoft Windows SQL Server 2005 SQL Server Analysis ServicesNotification Services SQL Server 8 SQL Server IP SQL Server 2005 SQL Server 20

VB程序设计教程

目錄 C ontents Chapter MTA Chapter Chapter


ACI pdf

投稿類別:資訊類

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1


Microsoft Office SharePoint Server MOSS Web SharePoint Web SharePoint 22 Web SharePoint Web Web SharePoint Web Web f Lists.asmx Web Web CAML f

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

Chapter 1: Introduction

附件3:

7 DataSet DataSet TableColumnDataSet DataSet NOTE DataSet DataAdapterDataSetDataAdapter DataSet DataSetDataSetDataSet NorthwindDataSet DataSet Dim Nor

1-6 Access 2016 實力養成暨評量解題秘笈 102. 書籍與作者 Step1 按 建立 索引標籤 資料表 群組的 資料表設計 按鈕 Step2 由上而下分別建立下列欄位並設定資料類型 : 欄位名稱 : ID, 資料類型 : 自動編號 欄位名稱 : BName, 資料類型 :

(Microsoft Word - \261M\303D\246\250\252G\263\370\247i.doc)

Visual C# 2010 與 UML 開發實戰 C# 第 5 章物件導向基礎 C# C# 第 6 章資料與變數 C# 第 7 章判斷式與迴圈 C# 第 8 章陣列與集合 C# 第 9 章偵錯與例外狀況處理 Visual Studio 2010 C# try...catch ix

The golden pins of the PCI card can be oxidized after months or years

IsPostBack 2

學 科 100% ( 為 單 複 選 題, 每 題 2.5 分, 共 100 分 ) 1. 請 參 閱 附 圖 作 答 : (A) 選 項 A (B) 選 項 B (C) 選 項 C (D) 選 項 D Ans:D 2. 下 列 對 於 資 料 庫 正 規 化 (Normalization) 的 敘

穨ac3-4.PDF

Microsoft Word - 關聯性資料庫.doc

untitled

Microsoft Word - ASP2DB1002.doc

視窗程式設計

untitled

MVB-1001.DOC

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

untitled

AutoCAD 用戶如何使用 ArchiCAD

mv t ï Catch ex As Exception MessageBox.Show(" «t ï ") Finally ' myconnection.close() End Try SqlConnection(ByVal connectionstring As String) pâ nç á

3.1 SQL Server 2005 Analysis Services Unified Dimension Model (UDM) 3 ( Ad-Hoc) SQL Server 2005 E - R T-SQL(Star Schema) (Data Mart) (ETL) ( Ora

untitled

Photoshop CS3 影像創造力 基礎講堂 8 學習流程 學習重要性 學習難度 必學指令工具 實作應用範例 創造舞台燈光的漸層繪圖 延伸學習 雜訊與半透明漸層 8-1 Photoshop Photoshop 8 136

基于UML建模的管理管理信息系统项目案例导航——VB篇

<4D F736F F D20C0B3A5CEB57BA6A1B35DAD70B4C1A5BDB3F8A7692E646F63>

epub83-1

untitled

Microsoft PowerPoint - VB5

高 职 计 算 机 类 优 秀 教 材 书 目 * 序 号 书 号 (ISBN) 书 名 作 者 定 价 出 版 / 印 刷 日 期 ** 配 套 资 源 页 码 计 算 机 基 础 课 计 算 机 应 用 基 础 刘 升 贵 年 8 月

Transcription:

第十二章資料庫存取 目錄 12-1. 資料庫基礎觀念... 2 12-2. 程式設計如何與資料庫連結之步驟... 5 12-3. ADO.NET 物件模型... 6 12-4. 使用資料工具建立資料庫應用程式 1-- 連結資料庫並顯示資料於表單上.. 10 12-5. 範例練習 [exp12-2]: 使用資料工具來顯示資料庫中資料表內容... 12 12-6. 撰寫程式碼來讀取資料庫的資料... 22 12-7. 範例練習 [exp 12-3]: 自己撰寫程式碼來顯示資料庫內的紀錄... 25 12-8. 範例練習 [exp12-4]: 輸入查詢姓名字串 查詢單筆紀錄... 32 12-9. 範例練習 [exp12-4]:-2 接續前一題 : 將查詢的紀錄, 以 textbox 欄位來顯示... 34 12-10. 範例練習 [exp12-5]: 製作可以 新增 修改 刪除 查詢 的綜合性程式介面... 36 12-11. 範例練習 [exp12-6]: 製作可以結合 下拉式選單 來查循資料庫... 44 12-12. 範例練習 [exp12-7]: 先讀取資料庫, 然後將之存入 class 變數, 然後將之排序... 47

12-1. 資料庫基礎觀念 (1). 使用 Access 建立資料庫及資料表 : (2)..NET 2005 讀取資料庫的部分, 雖然工具箱的控制項與.NET 2003 稍有不同, 但是核心程式碼, 還是維持與.NET 2003 相同的架構 (3). 但是.NET 2005 的 web 程式 (Asp.NET), 就改變很多, 建議在 Web 程式要學習新的寫法 (4). 範例練習 :[EXP12-1] 建立 1 個 Access 資料庫資料表 A. 練習目標 : 利用 Microsoft Office 的 Access 來建立學生資料管理的資料 庫, 其資料庫的檔名設為 stu.mdb 在 stu.mdb 資料庫中, 建 立 person 學生基本資料和 score 考試成績資料表 並輸入 person 資料表的學生基本資料 B. 建立資料表的欄位 (a). 建立 stu.mdb 資料庫, (b). 建立 學生基本 資料表和 考試成績 資料表 (c). 學生基本 資料表 資料表名稱 :person 欄位名稱及資料類型 : stu_no ( 學號 ) :5 個字元 name ( 姓名 ) :5 個中文字 (10 個字元 ) sex ( 性別 ) tel :2 個字元 ( 聯絡電話 ):12 個字元 欄位屬性 : 項目 欄位名稱 資料類型 欄位大小 欄位 1: 學號 stu_no 文字 5 欄位 2: 姓名 name 文字 10 欄位 3: 性別 sex 文字 2 欄位 4: 聯絡電話 tel 文字 12 建立主索引的欄位, 如本資料表的主索引欄位為 stu_no 欄位 請移動滑鼠到 stu_no 欄位上按 滑鼠右鍵由出現的快顯功能表, 選取 主索引 選項,

此欄位當鍵值 (d). 考試成績 資料表名稱 各欄位名稱以及資料類型定義 : 資料表名稱 :score 欄位名稱及資料類型 : stu_no ( 學號 ) :5 個字元 chi ( 國文 ) : 單精確度 eng ( 英文 ) : 單精確度 math ( 數學 ) : 單精確度 考試成績 ( 資料表名稱 :score) 項目 欄位名稱 資料類型 欄位大小 欄位 1: 學號 stu_no 文字 5 欄位 2: 國文 chi 單精準數 欄位 3: 英語 eng 單精準數 欄位 4: 數學 math 單精準數 註 其中主索引欄位為 stu_no (e). 資料表的輸入 對 person( 學生基本資料表 ) 直接輸入學生資料記錄 stu_no ( 學號 ) name ( 姓名 ) sex ( 性別 ) tel ( 聯絡電話 ) 90001 林大山 男 0929-876542 90003 廖福人 男 (02)23456789 90002 陳榮味 男 0923-098765 90005 吳碧秀 女 0933-123456 90004 張淑芳 女 (02)21092342 : : : :

C. 預期結果畫面

12-2. 程式設計如何與資料庫連結之步驟 (1). 建立資料表 : (2). 輸入資料表的資料 : (3). 與資料庫建立連線 (4). 建立並設定可繫結資料庫的物件 (5). 撰寫相關 ADO.NET 的程式碼 (6). 執行所撰寫資料庫的應用程式

12-3.ADO.NET 物件模型 ADO.NET 實作了 資料服務者 所需的 3 項功能 (1).ADO.NET 物件模型一覽表 資料使用者資料服務者資料來源.NET 資料提供者 視窗程式 Connection SQL Server 網頁程式 Command Access 元件服務 DataAdapter 其他資料庫 DataSet DataReader A. 連線機制 (a). 在 ADO.NET 的物件模型中就是 Connection (b). 由每個.NET 資料提供者 (Data Provider) 各自提供不同的 Connection

B. 下達命令 : (a). 為物件模型中的 Command DataAdapter (b). 由每個.NET 資料提供者 Data Provider 各自提供不同的類別 (c).command : 提供一般的命令執行, 像是 Select Insert Update Delete 及預存程序 (Stored Procedure) (d).dataadapter: 除了提供執行命令之外, 它還有一個重要任務, 就是將資料填入 DataSet 之間, 以及離線資料 DataSet 寫回資料庫等複雜功能 C. 取得資料庫結果集 : 為物件模型中的 DataReader DataSet (a). DataReader : 從資料庫擷取唯讀順向 (Forward Only) 的資料流 每次從伺服器資料庫讀取一筆記錄, 之後該筆記錄就從資料庫伺服器的指標器釋放, 以降低伺服器資源的耗用 (b). DataSet 是一種離線式用戶端記憶體資料庫, 資料查詢的結果將存放在 DataSet 用戶端程式處理記錄時不再逐筆從資料庫存取, 而是從用戶端記憶體的 DataSet 取得 目的是可以降低伺服器資料的耗用 DataSet 之內可包含多個 DataTable, 這些 DataTable 亦可彼此相互關聯 (2)..NET 資料提供者 Data Provider A. 觀念 ADO.NET 是介於 應用程式 與 資料來源 之間的橋樑.NET Framework 在處理不同的 資料來源 時, 就定義了不同的 資料提供者 Data Provider

B..NET Framework 所提供的 資料提供者 Data Provider 種類, 有 2 種 (a).sql Server.NET 資料提供者 可支援 SQL Server 7.0 與 2000 以上的版本 它可以直接與 SQL Server 底層的 API 溝通, 故效能佳 屬於 System.Data.SqlClient 命名空間 (b).ole DB.NET 資料提供者.NET Framework 並不支援 例如 :Access Internet Publishing Indexing Service Exchange Sever 等資料來源的存取 屬於 System.Data.OleDb 命名空間 附註 : 早期常使用的 Microsoft ODBC 資料提供者.NET Framework 並不支援 要的人要另外下載 下載 Microsoft ODBC.NET 資料提供者 屬於 System.Data.Odbc 命名空間 參考 System.Data.Odbc.dll 元件 (c). 比較各種 資料提供者 Data Provider 所支援的物件模型.NET 資料提供者 SQL Server.NET 資料提供者 OLE DB.NET 資料提供者 Microsoft ODBC.NET 資料提供者 Connection sqlconnection OleDbConnection OdbcConnection Command sqlcommand OleDbCommand OdbcCommand DataAdapter sqldataadapter OleDbDataAdapter OdbcDataAdapter DataReader sqldatareader OleDbDataReader OdbcDataReader

(3). 利用 ADO.NET 物件模型取得資料的流程 (a). 根據查詢資料的條件 (b). 建立 Connection 物件 (c). 建立 DataAdapter 物件 (d). 透過 DataAdapter 物件從資料庫取回資料到 DataSet 物件中 ( 用戶端的記憶體資料庫 ) (e). 然後切斷連線 (f). 將 DataSet 的資料以資料繫結 (Data Binding) 的方式顯示在控制項上 ( 表單上的 TextBox, Lable )

12-4. 使用資料工具建立資料庫應用程式 1-- 連結資料庫並顯示資料於表單上 (1). 資料庫連結原理 A. 先要與資料庫取得連結後 B. 再下達 SQL 命令來進行資料庫的管理 ( 資料的新增 刪除 修改 關聯 ) C. 在使用程式來管理資料庫之前, 要先確定要使用那一組.NET Data Provider ( 資料提供者 ) 來存取資料庫, 所謂資料提供者指的是一組用來存取資料庫的物件, D. 在.NET Framework 中已經內建有兩組.NET Data Providers : SQL.NET Data Provider 其中 SQL.NET Data Provider 只能用來連接微軟的 SQL Server 7.0 版以上的資料庫 ; OLE DB.NET Data Provider 至於 OLE DB.NET Data Provider 則是透過 OLE DB 介面來存取各類型的資料庫如 :MSSQL, Oracle, Access, Dbase 等 本章先前所建立的 stu.mdb 資料庫也可使用 OLE DB.NET Data Provider 來進行存取 在 VB.NET 中, 可以使用 OLE DB.NET Data Provider 中的 OleDbConnection 物件來負責連結資料庫, 然後透過 OleDbCommand 物件執行相關的 SQL 命令如 :SELECT, DELETE, 等命令

E.OleDbDataAdapter 物件中則包含了四個 OleDbCommand 物件, 分別是 SelectCommand InsertCommand UpdateCommand DeleteCommand, DataAdapter SelectCommand 資料庫 InsertCommand UpdateCommand DeleteCommand DataSet

12-5. 範例練習 [exp12-2]: 使用資料工具來顯示資料庫中資料表內容 A. 練習目標 : 使用資料工具來顯示 stu.mdb 學生資料庫中 person 學生 基本資料表內容 B. 練習步驟 : C. 輸入 stu.mdb person 資料表 輸入每個人資料 D. 將 stu.mdb 資料庫複製到 chp13/ex13-2/bin 資料夾下 E. 建立 OleDbDataAdapter 物件 目的 :OleDbDataAdapter 物件 2 個功用 : (a). 連結到資料庫 產生 Connection 物件 (b). 對所要的資料表進行查詢 產生 OleDbDataAdapter 及 dataset 物件 (a). 按工具箱內工具群組鈕, (b). 再到 資料 群組中的工具上快按滑鼠二下 (c). 結果出現如下圖 資料配接器精靈 的對話方塊 請你先按鈕, (d). 再按鈕 2 1

(e). 出現下圖 資料連結內容 的對話方塊, 請你依下圖手指所示順 序操作, 在 提供者 標籤頁選取 Microsoft Jet 4.0 OLE DB Provider 1 2 3 4 觀念 : OleDbDataAdapter 工具是用來產生 OleDb DataAdapter 物件 以及對應的 OleDbConnection 與 OleDbCommand 物件 透過 OleDbConnection 物件可與指定的資料庫進行聯繫 ; 而使用 OleDb Command 物件可讀取或異動 DataSet 物件中資料, 譬如 : 透過 OleDbDataAdapter 物件的 Fill 方法將資料讀到 DataSet 中或是透過 Update 方法將 DataSet 物件的資料更新到指定的資料庫中 DataSet 其實只是一個記憶體中的資料暫存區, 而 DataSet 內的資料必須透過 DataAdapter 物件與資料庫做連繫

(f). 刪除 stu.mdb 前面檔案路徑, 再依下圖所示順序操作 1 按此鈕找尋 stu.mdb 資料庫所在的資料夾 建議你使用在 VB13\V13_4_1\bin 資料夾內的 stu.mdb 請刪掉文字方塊內 stu.mdb 檔案名稱前的路徑 當整個 V13_4_1 資料夾變更名稱或被搬移到別處時, 執行在 bin 資料夾的.exe 檔時仍可使用 stu.mdb 資料庫 2 4 3 5

(g). 設定要下達讀取 person 資料表中 stu_no( 學號 ) name( 姓名 ) tel( 連 絡電話 ) 等欄位資料的記錄的 SQL 指令敘述 : 在下圖先按鈕, 再按鈕 1 2 3

出現下圖 加入資料表 對話方塊, 選取 person 資料表, 按鈕後, 再按鈕 1 2 3 在 查詢產生器 對話方塊內, 勾取 person 資料表內的 stu_no 欄名, 並在 別名 欄位內鍵入 學號 當作 stu_no 的別名 選用 遞增 的排序方式 1 2 3

勾取 person 資料表內的 name 的 別名取為 姓名 ; tel 別名取為 聯絡電話, 完成後再依照手指圖示順序進行即可 1 自動產生 SQL 指令 2

產生 : SelectCommand InsertCommand UpdateCommand DeleteCommand 3 注意 若你所要查詢的資料表沒有設定主索引 (Primary Key), 則只會產生 SelectCommand 及 InsertCommand ; 此時將無法使用 Update Command DeleteCommnad 來更新資料庫 (h). 結果 在表單下方出現及控制項

F. 建立 DataSet 資料集 : (a). 選取控制項, 然後在屬性視窗正下方的 產生資料集 按一下, 如下圖所示操作 : 1 2 3 (b). 結果在表單下方出現 Name 屬性值為 DataSet11 控制項, 此控制項的

G. 建立 DataGrid 物件 (a). 目的 : 現在要 DataSet 物件內的資料顯現出來 (b). 原理 : 使用 DataGrid ( 資料連結方格 ) (c).p.s.: 在 VB.NET 中, 具有資料連結功能的控制項有 : 文字方塊 標籤 核取方塊 清單方塊 下拉式清單方塊 資料連結方格 (DataGrid) (d). 工具箱 Windows Form 拖曳到表單上 1 3 2 (e). 設定 DataGrid1 控制項所要連結的資料集 DataGrid1 的 DataSource 屬性值 DataSet11.Person 1 2 3 (f). 編輯程式碼 ************** f13_4_1 ************** 1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System. _ EventArgs) Handles MyBase.Load 2 DataGrid1.CaptionText = " 學生通訊錄 " 3 OleDbDataAdapter1.Fill(DataSet11) 4 End Sub 1. 1. 第 2 行 : 設定 DataGrid1 物件的標題文字 2. 第 3 行 :Fill 是將資料庫資料載入 DataSet11 物件的指令 2.

H. 完成結果

12-6. 撰寫程式碼來讀取資料庫的資料 (1). 觀念 : (a). 前面章節是使用 Visual Studio.NET 提供的資料庫應用工具來直接開發資料庫連結程式, 程式簡單速度又快, 這個過程都不需要讀者自行撰寫程式碼 (b). 不過有些時候當要設計比較複雜程式時, 就必須動到程式碼了, 所以在本節將介紹如何使用各種 ADO.NET 物件及設定其相關屬性來撰寫程式碼 (2). 程式碼撰寫 連結到資料庫的步驟 : A. 連結流程 資料庫首先透過 Connection 物件 連線到資料庫後 然後透過 DataAdapter 物件將查詢的資料傳送到 DataSet( 資料 集 ) 中 以 DataSet 資料表方式儲存在記憶體中 然後透過 DataGrid 控制項 `, 將指定的資料表以表格的方式顯 示在表單上, 提供使用者瀏覽 如果要資料更新, 則可以透過 Windows Form 的資料繫結 (DataBinding) 控制和 ADO.NET 資料提供者 (Data Provider) 來負 責處理 (3). 如何連線 建立 Connection 物件 A. 設計流程綱要 : 首先要先了解所要連結資料庫的種類 然後根據資料庫種類來選擇適合的.NET 資料提供者 (Data Provider) 在 Connection 物件的 ConnectionString 屬性上, 設定資料庫所 在位置 以及登入資料庫的帳號與密碼 B.Connection 物件種類 : SqlConnection 類別 : 屬於 System.Data.SqlClient 命名空間 OleDbConnection 類別 : 屬於 System.Data.OleDb 命名空間 C. 程式碼撰寫 連結到資料庫的 connection 步驟 : D. 步驟 1: 選擇適合的.NET 資料提供者, 並匯入該命名空間 (System.Data.OleDb) Imports System.Data Imports System.Data.OleDb

E. 步驟 2: 宣告相關的 Connection 物件 (OleDbConnection) Dim conn as New OleDbConnection() F. 步驟 3: 設定 Connection 物件的 ConnectionString 屬性值 conn.connectionstring = Provider=Microsoft.Jet.OleDB.4.0; Data Source=stu.mdb Access 的資料提供者 (Data Provider) 字串為 Microsoft.Jet.OleDB.4.0 參數 Provider 乃是設定 OLE DB 提供者字串 參數 Data Source 乃是設定 資料庫來源 參數之間的分隔符號 ; G. 步驟 4: 建立與資料庫之間的連線 ( 呼叫 Open 方法 ) conn.open H. 完成資料庫存後再使用 Close 方法關閉與資料庫的連線.... conn.close() 補充 : 到目前已經連接到資料庫了, 接者就可以利用 DataAdapter 來下達查詢指令, 以擷取資料到用戶端 比較各種 資料提供者 Data Provider 所支援的物件模型.NET 資料提供者 SQL Server.NET 資料提供者 OLE DB.NET 資料提供者 Microsoft ODBC.NET 資料提供者 Connection sqlconnection OleDbConnection OdbcConnection Command sqlcommand OleDbCommand OdbcCommand DataAdapter sqldataadapter OleDbDataAdapter OdbcDataAdapter DataReader sqldatareader OleDbDataReader OdbcDataReader 舉例而言, 如果要連接到 Access 資料庫 其所使用的資料提供者 Data Provider 是 OLE DB.NET 資料提供者 ( 屬於 System.Data.OleDb 命名空間 Imports System.Data.OleDb) 建立連結資料庫 Dim OLEDBcn as New OleDbConnection()

設定連結資料位置與檔名 OLEDBcn.ConnectionString= Provider=Microsoft.Jet.OleDB. 4.0; Data Source=C:\Access\student.mdb 開始連結 OLEDBcn.Open 用 DataAdapter 來下達查詢指令, 以擷取資料到用戶端 (4). 步驟 2: 程式碼撰寫 建立 DataAdpater 物件以執行 SQL 資料庫的搜尋指令 : (a). 步驟 1: 宣告 DataAdpter 物件變數 (b). 步驟 2: 在初始化 DataAdapter 物件時, 同時傳入 查詢指令, 以及連線命令 Dim OleDbda as New OleDbDataAdapter() OleDbda = New OleDbDataAdapter( select * from 基本資料 Order by 編號, conn) (5). 步驟 3: 使用 Fill 方法擷取資料到 DataSet, 並指定表格名稱 Fill 方法方能 : 將自動依據 DataAdapter 所設的連線物件連結 到資料庫, 然後擷取資料到指定的 DataSet 物件 也就是將查詢結果存放在用戶端記憶體 當查詢結果填入 DataSet 之後, 與資料庫之間的連線也將自動 關閉 結論 : DataAdapter 乃是查詢伺服器端的資料庫內容 ( 使用 Sql 語 法查詢 ) Fill 方法可以將伺服器端 DataAdapter 的查詢結果存到用 戶端記憶體的 DataSet 物件內 例如 : Dim ds As DataSet ds = New DataSet() OleDbDa.Fill (ds, 客戶 ) 宣告 ds 為 DataSet 物件 初始化 ds 物件 將服器端 DataAdapter 的查詢結果放到用戶端的 ds 物件的 DataTable 名稱

(6). 步驟 5: 在 Datagrid1 上顯示 Dataset1 內的查詢結果, 要註明是 dataset1 內的哪個表格 DataGrid1.DataSource = dataset11.tables("xy") 12-7. 範例練習 [exp 12-3]: 自己撰寫程式碼來顯示資料庫內的紀錄 A. 使用 C# Windows 視窗應用程式 來製作 B. 練習目標 : 完全不用系統工具來作 自己撰寫程式碼來顯示資料庫內的紀錄

C. 方法 :C# 自行撰寫程式來查詢資料庫的標準寫法 (a). 在最開頭引入 C# 資料庫連結的相關函式庫 using System.Data; using System.Data.OleDb; 在 VB.NET 中的寫法是 Imports System.Data Imports System.Data.OleDb (b).connection 連結到資料庫 // 宣告並設定連接字串 string str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; // 宣告並設定連接物件 conn OleDbConnection conn = new OleDbConnection(str1); // 進行連結資料庫 conn.open() 連結物件 OleDbConnection, 設定起始值值只要一個參數 ( 連 結字串 str) (c).oledbdataadapter 物件建立查詢結果 // 宣告並設定查詢 資料表 字串 string str2 = "select * from 1a"; // 宣告並設定資料表查詢物件 adapter1 OleDbDataAdapter adapter1 = new OleDbDataAdapter(str2,conn); 查詢物件 OleDbDataAdapter, 設定起始值要 2 個參數 ( 查詢 字串 str1, 連結物件 conn) (d). dataset11 物件置於暫時記憶體, 以存放查詢結果 // 宣告並設定終端機電腦記憶體的暫存物件 dataset1 DataSet dataset1 = new DataSet(); // 將伺服器資料庫的查詢結果 (adapter1) 存放並填滿到終端機的暫存物件 (dataset1) 上的表格 1ascroe adapter1.fill(dataset1, 1ascore ) 暫時記憶體表格物件 DataSet, 不需要設定起始值參數 (e). 在 datagrid 來顯示 dataset 上的資料 // 在視窗的 DataGrid1 上將查詢結果顯示出來 ( 指定 DataGrid1 的資料來源為 dataset1 上的表格 1ascroe ) DataGrid1.DataSource = dataset1.tables[ 1ascore ] C# 的寫法為 dataset1.tables[ ] VB.NET 的寫法為 dataset1.tables( ) (f). 關閉連線 conn.close()

D. 比較 :VB.NET 自行撰寫程式來查詢資料庫的標準寫法 (a). 在最開頭引入 VB.NET 資料庫連結的相關函式庫 Imports System.Data Imports System.Data.OleDb 在 C# 中的寫法是 using System.Data; using System.Data.OleDb; (b).connection 連結到資料庫 // 宣告並設定連接字串 Dim str As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= 員工基本資料.MDB") // 宣告並設定連接物件 conn Dim conn As OleDbConnection = New OleDbConnection(str) // 進行連結資料庫 conn.open() 連結物件 OleDbConnection, 設定起始值值只要一個參數 ( 連 結字串 str) (c).oledbdataadapter 物件建立查詢結果 // 宣告並設定查詢 資料表 字串 Dim str1 As String = "Select * from 基本資料 " // 宣告並設定資料表查詢物件 adapter1 Dim adapter1 As OleDbDataAdapter = New OleDbDataAdapter(str1, conn) 查詢物件 OleDbDataAdapter, 設定起始值要 2 個參數 ( 查詢 字串 str1, 連結物件 conn) (d). dataset11 物件置於暫時記憶體, 以存放查詢結果 // 宣告並設定終端機電腦記憶體的暫存物件 dataset1 Dim dataset1 As DataSet = New DataSet() // 將伺服器資料庫的查詢結果 (adapter1) 存放並填滿到終端機的暫存物件 (dataset1) 上的表格 1ascroe adapter1.fill(dataset1, 1ascore ) 暫時記憶體表格物件 DataSet, 不需要設定起始值參數 (e). 在 datagrid 來顯示 dataset 上的資料 // 在視窗的 DataGrid1 上將查詢結果顯示出來 ( 指定 DataGrid1 的資料來源為 dataset1 上的表格 1ascroe ) DataGrid1.DataSource = dataset1.tables( 1ascore ) C# 的寫法為 dataset1.tables[ ] VB.NET 的寫法為 dataset1.tables( )

(f). 關閉連線 conn.close()

E. 觀念 : 1. 為什麼有時候宣告的物件要用 New(Dim dataset11 As New DataSet()), 有的時候卻不需要 (Dim conn As OleDbConnection), 到底有什麼規則 呢? 2. 原理 : 比較 C++ C#.NET(VB.NET) 宣告類別 (Class) 物件的差異性 一般宣告 Student csie1b15; C++ 給定起始值宣告 Student csie1b15( 張三,65,95,95) ( 建立者函數 ) 一般宣告 Student csie1b15 = new Student(); C#.NET 給定起始值宣告 ( 建立者函數 ) Student csie1b15 = new Student( 張三,65,95,95); 一般宣告 Dim csie1b15 as Student = new Student() VB.NET 給定起始值宣告 ( 建立者函數 ) Dim csie1b15 as Student = new Student(( 張三,65,95,95) 3. 在.NET 中宣告類別物件 ( 物件導向 ) 變數的標準寫法 : 觀念 : 在 C#.NET VB.NET 中只要是比較複雜的物件 變數, 都是用物件導向的物件變數 (class) 來建立的, 所以要符合物件變數的宣告規定 不管 C#.NET VB.NET, 物件變數都要使用 = new student(), 向記憶體要求配置一個類別變數空間 只是如果如果可以設定起始值, 那最好設定之 (Dim conn As OleDbConnection = New OleDbConnection(str)) 但是如果不需要傳遞起始值的物件變數, 就不用設定起始值了 (Dim dataset1 As DataSet = New DataSet()) 4. 簡化寫法 : 宣告類別物件 ( 物件導向 ) 變數的簡化寫法 觀念 : 不過上述的物件變數寫法, 可以簡化成 方法一 : 分步驟來寫 Dim conn As OleDbConnection = New OleDbConnection(str) 步驟 1:Dim conn As OleDbConnection 步驟 2:conn = New OleDbConnection(str) 方法二 : 省略 = new DataSet() 寫法 Dim dataset1 As DataSet = New DataSet() 步驟 1:Dim dataset1 As New DataSet

F. 程式碼 : 先下載資料庫 :score.mdb 放到 D:\ chp9\ex9_3\bin\debug\ 目錄下 先建立一個 Label: 致遠資工 1A 成績單然後在表單上建立 datagrid1 物件 在最開頭引入 C# 資料庫連結的相關函式庫 using System.Data; using System.Data.OleDb; private void Form1_Load(object sender, System.EventArgs e) //connection 連結到資料庫 // 宣告並設定連接字串 string str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; // 宣告並設定連接物件 conn OleDbConnection conn = new OleDbConnection(str1); // 進行連結資料庫 conn.open(); //oledbdataadapter 物件建立資料表查詢結果 // 宣告並設定查詢 1a 資料表 字串 string str2 = "select * from 1a"; // 宣告並設定資料表查詢物件 adapter1 OleDbDataAdapter adapter1 = new OleDbDataAdapter(str2,conn); //dataset11 物件置於暫時記憶體, 以存放查詢結果 // 宣告並設定終端機電腦記憶體的暫存物件 dataset1 DataSet dataset1 = new DataSet(); // 將伺服器資料庫的查詢結果 (adapter1) 存放並填滿到終端機的暫存物件 (dataset1) 上的表格 1ascroe adapter1.fill(dataset1,"1ascore");

// 在 datagrid 來顯示 dataset 上的資料 datagrid1.datasource = dataset1.tables["1ascore"]; // 關閉連線 conn.close(); G. 注意 : 在 C#.NET 上寫資料庫連結的程式碼寫法時, 容易發生以下的錯誤 (a). 打錯字 : OledbDataAdapter(X) OleDbDataAdapter(O) OleDbDataAdatper(X) OleDbDataAdapter(O) Dataset(X) DataSet(O) 指定資料集合中表格要用 [], dataset11.tables("xy")(x) dataset1.tables["1ascore"](o) H. 比較 : 在 VB.NET 上的程式碼寫法 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'connection 連結到資料庫 Dim conn As New OleDbConnection conn.connectionstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=STU.MDB" conn.open() End Sub 'oledbdataadapter 物件建立查詢結果 Dim adapter1 As New OleDbDataAdapter adapter1 = New OleDbDataAdapter("select * from person order by stu_no", conn) 'dataset11 物件置於暫時記憶體, 以存放查詢結果 Dim dataset11 As New DataSet 'adapter1.fill(dataset11) adapter1.fill(dataset11, "xy") ' 在 datagrid 來顯示 dataset 上的資料 DataGrid1.DataSource = dataset11.tables("xy") ' 關閉連線 conn.close()

12-8. 範例練習 [exp12-4]: 輸入查詢姓名字串 查詢單筆紀錄 A. 使用 C# Windows 視窗應用程式 來製作 B. 練習目標 : 自己撰寫程式碼來顯示資料庫內的紀錄 輸入查詢姓名字串 查詢單筆紀錄 C. 關鍵技術 : (a).sql 查詢 特殊字串 語法 Select * from 1a where name = jack (b). 當有變數時的 SQL 查詢語法 (C#) Select * from 1a where name = + textbox1.text + (c). 當有變數時的 SQL 查詢語法 (VB.NET) Select * from 1a where name = & textbox1.text & D. 注意 : 在 C#.NET 上寫資料庫連結的程式碼寫法時, 容易發生以下的錯誤 (a). 打錯字 : OledbDataAdapter(X) OleDbDataAdapter(O) OleDbDataAdatper(X) OleDbDataAdapter(O) Dataset(X) DataSet(O) 指定資料集合中表格要用 [], dataset11.tables("xy")(x) dataset1.tables["1ascore"](o) E. 程式碼 : 先下載資料庫 :score.mdb 放到 D:\ chp9\ex9_4\bin\debug\ 目錄下

建立一個 Label: 致遠資工 1A 成績單查詢系統建立一個 Label: 輸入姓名建立一個 textbox, 一個按鈕 : 查詢然後在表單上建立 datagrid1 物件 在最開頭引入 C# 資料庫連結的相關函式庫 using System.Data; using System.Data.OleDb; private void button1_click(object sender, System.EventArgs e) // 連結資料庫 String str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; OleDbConnection conn = new OleDbConnection(str1); conn.open(); // 查詢資料表 String str2 = "select * from 1a where name = '" + textbox1.text + "'"; OleDbDataAdapter adapter1 = new OleDbDataAdapter(str2,conn); // 將查詢結果放到記憶體 dataset1 上 DataSet dataset1 = new DataSet(); adapter1.fill(dataset1,"1a"); // 將記憶體的資料集合存放到視窗畫面上的 DataGrid 上 datagrid1.datasource = dataset1.tables["1a"]; // 關閉資料庫的連結 conn.close();

12-9. 範例練習 [exp12-4]:-2 接續前一題 : 將查詢的紀錄, 以 textbox 欄位來顯示 A. 使用 C# Windows 視窗應用程式 來製作 B. 練習目標 : 將查詢的紀錄, 以 textbox 欄位來顯示 C. 關鍵技術 : (a). 如果不將查詢的結果以 DataGrid 顯示, 而是以單獨的每一個記錄顯示 ( 例如顯示在 TextBox) 方法 : 要先將查詢的 DataSet1.Table[ 1a ] 儲存到一個 DataTable 物件來, 如此即可使用表格的方式來指定某個特定位置 DataTable table1 = dataset1.tables["1a"]; table1.rows[0][0] table1.rows[0][1] table1.rows[0][2].... table1.rows[0][j] table1.rows[1][0] table1.rows[2][0].. table1.rows[i][0] table1.rows[i][j] (b).datatable 的資料總筆數 (i) table1.rows.count D. 程式碼 : 建立一個 Label: 致遠資工 1A 成績單查詢系統建立一個 Label: 輸入姓名

建立一個 textbox, 一個按鈕 : 查詢然後在表單上建立 5 個 textbox 在最開頭引入 C# 資料庫連結的相關函式庫 using System.Data; using System.Data.OleDb; private void button1_click(object sender, System.EventArgs e) // 連結資料庫 String str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; OleDbConnection conn = new OleDbConnection(str1); conn.open(); // 查詢資料表 String str2 = "select * from 1a where name = '" + textbox1.text + "'"; OleDbDataAdapter adapter1 = new OleDbDataAdapter(str2,conn); // 將查詢結果放到記憶體 dataset1 上 DataSet dataset1 = new DataSet(); adapter1.fill(dataset1,"1a"); // 將記憶體的資料集合存放到視窗畫面上的 textbox 上 // 宣告一個可以接收記憶體資料集合的資料表格 DataTable DataTable table1 = dataset1.tables["1a"]; textboxno.text = table1.rows[0][0].tostring(); textboxname.text = table1.rows[0][1].tostring(); textboxchi.text = table1.rows[0][2].tostring(); textboxeng.text = table1.rows[0][3].tostring(); textboxmath.text = table1.rows[0][4].tostring(); // 關閉資料庫的連結 conn.close();

12-10. 範例練習 [exp12-5]: 製作可以 新增 修改 刪除 查詢 的綜合性程式介面 A. 使用 C# Windows 視窗應用程式 來製作 B. 練習目標 : 製作可以 新增 修改 刪除 查詢 的綜合性程式介面 查詢功能

新增功能 刪除功能

修改功能 查詢 C. 關鍵技術 : (a).sql 查詢 某紀錄 語法 Select * from 1a where name = jack (b). 當有變數時的 SQL 查詢語法 (C#) Select * from 1a where name = + textbox1.text + (c). 當有變數時的 SQL 查詢語法 (VB.NET) Select * from 1a where name = & textbox1.text & 刪除 (a).sql 刪除 某紀錄 語法 delete * from 1a where name = jack (b). 當有變數時的 SQL 刪除詢語法 (C#) delete * from 1a where name = + textbox1.text + (c). 當有變數時的 SQL 刪除語法 (VB.NET) delete * from 1a where name = & textbox1.text &

新增 (d).sql 新增 某紀錄 語法 Insert Into 1a(name,chi)Values( jack,90) (e). 當有變數時的 SQL 新增語法 (C#) Insert Into 1a(name,chi)Values + textboxname.text +, + Int32.Parse(textBoxName.text) + ) ; (f). 當有變數時的 SQL 新增語法 (VB.NET) Insert Into 1a(name,chi)Values & textboxname.text &, & Int32.Parse(textBoxName.text) & ) ; 修改 (g).sql 修改 某紀錄 語法 Update 1a set name = jack, chi = 90 where id_no= 90001 (h). 當有變數時的 SQL 修改語法 (C#) Update 1a set name = '" + textboxname.text + "', chi = " + Int32.Parse(textBoxChi.Text) + " where id_no=' " + textboxno.text + "'"; D. 注意 2: 什麼時候要用單引號, 什麼時候不用加呢 字串 : 字串前後要加上 單引號 Values('" & txt_5_prjcode.text & "') 數值 : 數值前後要不用加, 但是所引用的 textbox.text 要先用 Int32.Parse 轉換成數值格式 Values(" & Int32.Parse (txt_5_period.text) & "') 日期 : 字串前後要加上 單引號, 所引用的 textbox.text 要先用 DateTime.Parse 轉換成日期格式

Values('" & DateTime.Parse(txt_5_BeginDay.Text) & "') E. 程式碼 : 先下載資料庫 :score.mdb 放到 D:\ chp9\ex9_3\bin\debug\ 目錄下 建立一個 Label: 致遠資工 1A 成績單 新增 修改 刪除 查詢 的綜合性程式介面系統建立一個 Label: 輸入姓名建立一個 textbox, 一個按鈕 : 查詢然後在表單上建立 datagrid1 物件然後在表單上建立 5 個 textbox 在最開頭引入 C# 資料庫連結的相關函式庫 using System.Data; using System.Data.OleDb; // 顯示一筆資料表內容 private void buttonsearch_click_1(object sender, System.EventArgs e) // 連結資料庫 String str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; OleDbConnection conn = new OleDbConnection(str1); conn.open(); // 查詢資料表 String str2 = "select * from 1a where name = '" + textboxsearch.text + "'"; OleDbDataAdapter adapter1 = new OleDbDataAdapter(str2,conn); // 將查詢結果放到記憶體 dataset1 上 DataSet dataset1 = new DataSet(); adapter1.fill(dataset1,"1a"); // 將記憶體的資料集合存放到視窗畫面上的 textbox 上 // 宣告一個可以接收記憶體資料集合的資料表格 DataTable DataTable table1 = dataset1.tables["1a"]; textboxno.text = table1.rows[0][0].tostring(); textboxname.text = table1.rows[0][1].tostring(); textboxchi.text = table1.rows[0][2].tostring();

textboxeng.text = table1.rows[0][3].tostring(); textboxmath.text = table1.rows[0][4].tostring(); // 關閉資料庫的連結 conn.close(); // 顯示全部資料表內容 private void buttonall_click(object sender, System.EventArgs e) // 連結資料庫 String str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; OleDbConnection conn = new OleDbConnection(str1); conn.open(); // 查詢資料表 String str2 = "select * from 1a"; OleDbDataAdapter adapter1 = new OleDbDataAdapter(str2,conn); // 將查詢結果放到記憶體 dataset1 上 DataSet dataset1 = new DataSet(); adapter1.fill(dataset1,"1a"); // 將記憶體的資料集合存放到視窗畫面上的 DataGrid 上 datagrid1.datasource = dataset1.tables["1a"]; // 關閉資料庫的連結 conn.close(); // 修改一筆資料內容 private void buttonedit_click(object sender, System.EventArgs e) // 連結資料庫 String str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; OleDbConnection conn = new OleDbConnection(str1); conn.open(); // 修改資料庫內的記錄 // 設定修改記錄的 SQL 語法及資料庫執行指令 OleDbCommand string str2 = "Update 1a set id_no = '" + textboxno.text + "', name

= '" + textboxname.text + "', chi = " + Int32.Parse(textBoxChi.Text) + ",eng =" + Int32.Parse(textBoxEng.Text) + ", math=" + Int32.Parse(textBoxMath.Text) + " where id_no= '" + textboxno.text + "'"; OleDbCommand cmd = new OleDbCommand(str2,conn); // 執行資料庫指令 OleDbCommand cmd.executenonquery(); // 關閉資料庫連接 conn.close(); // 顯示成功新增記錄的訊息 MessageBox.Show(" 成績修改一筆記錄了 "," 成功修改 ",MessageBoxButtons.OKCancel); // 新增一筆資料 private void buttonadd_click(object sender, System.EventArgs e) // 連結資料庫 String str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; OleDbConnection conn = new OleDbConnection(str1); conn.open(); // 新增記錄到資料庫內 // 設定新增記錄的 SQL 語法及資料庫執行指令 OleDbCommand string str2 = "Insert Into 1a(id_no,name,chi,eng,math)Values('" + textboxno.text + "','" + textboxname.text + "'," + Int32.Parse(textBoxChi.Text) + "," + Int32.Parse(textBoxEng.Text) + "," + Int32.Parse(textBoxMath.Text) + ")"; OleDbCommand cmd = new OleDbCommand(str2,conn); // 執行資料庫指令 OleDbCommand cmd.executenonquery(); // 關閉資料庫連接 conn.close(); // 顯示成功新增記錄的訊息 MessageBox.Show(" 成績新增一筆記錄了 "," 成功新增 ",MessageBoxButtons.OKCancel);

// 刪除一筆資料 private void buttondel_click(object sender, System.EventArgs e) // 連結資料庫 String str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; OleDbConnection conn = new OleDbConnection(str1); conn.open(); // 刪除資料庫內的記錄 // 設定刪除記錄的 SQL 語法及資料庫執行指令 OleDbCommand string str2 = "delete * from 1a where id_no= '" + textboxno.text + "'"; OleDbCommand cmd = new OleDbCommand(str2,conn); // 執行資料庫指令 OleDbCommand cmd.executenonquery(); // 關閉資料庫連接 conn.close(); // 顯示成功刪除記錄的訊息 MessageBox.Show(" 成績刪除一筆記錄了 "," 成功刪除 ",MessageBoxButtons.OKCancel);

12-11. 範例練習 [exp12-6]: 製作可以結合 下拉式選單 來查循資料庫 A. 使用 C# Windows 視窗應用程式 來製作 B. 練習目標 : 製作可以結合 下拉式選單 來查循資料庫 C. 關鍵技術 : (a). 宣告公用變數的方法 : 將變數寫在副程式外面即可 DataTable table1 = new DataTable(); (b). 如何將資料表 name 欄位的所有資料加到 combobox 上 combobox1.datasource = table1; combobox1.displaymember = "name"; (c). 當改變點選 combobox 的項目後, 所會執行的副程式 combobox1_selectedindexchanged (d). 如何辨別所點選 combobox 的項目是第幾個 ComboBox1.SelectedIndex (e). 如何將所點選 combobox 的項目對應到其他相同筆數的欄位上上 textboxno.text = table1.rows[combobox1.selectedindex][0].tostring();

textboxname.text = table1.rows[combobox1.selectedindex][1].tostring(); textboxchi.text = table1.rows[combobox1.selectedindex][2].tostring(); textboxeng.text = table1.rows[combobox1.selectedindex][3].tostring(); textboxmath.text = table1.rows[combobox1.selectedindex][4].tostring(); D. 程式碼 : 先下載資料庫 :score.mdb 放到 D:\ chp9\ex9_6\bin\debug\ 目錄下 ( 畫面可以另外開啟 Ex9_4 後, 複製該視窗的元件到此範例 ) 建立一個 Label: 致遠資工 1A 成績單查詢系統建立一個 Label: 選擇所要查詢的姓名建立一個下拉式選單 :combobox 然後在表單上建立 5 個 textbox 在最開頭引入 C# 資料庫連結的相關函式庫 using System.Data; using System.Data.OleDb; // 宣告公用變數 ( 方便下拉式選單的副程式也可以使用查循結果 ) DataTable table1 = new DataTable(); private void Form1_Load(object sender, System.EventArgs e) // 連結資料庫 String str1 = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=score.mdb"; OleDbConnection conn = new OleDbConnection(str1); conn.open(); // 查詢 1a 資料表 String str2 = "select * from 1a"; OleDbDataAdapter adapter1 = new OleDbDataAdapter(str2,conn); // 將查詢結果放到記憶體 dataset1 上 DataSet dataset1 = new DataSet(); adapter1.fill(dataset1,"1a"); // 將查詢傳送到公用的 DataTable table1 = dataset1.tables["1a"];

// 設定下拉式選單的資料來源, 與其所要顯示的欄位 combobox1.datasource = table1; combobox1.displaymember = "name"; // 關閉資料庫的連結 conn.close(); private void combobox1_selectedindexchanged(object sender, System.EventArgs e) // 在每個文字方塊顯示 下拉式選單 選擇後的該筆記錄各欄位資料 // 如何知道是選擇了下拉式選單中的第幾個呢? combobox1.selectedindex textboxno.text = table1.rows[combobox1.selectedindex][0].tostring(); textboxname.text = table1.rows[combobox1.selectedindex][1].tostring(); textboxchi.text = table1.rows[combobox1.selectedindex][2].tostring(); textboxeng.text = table1.rows[combobox1.selectedindex][3].tostring(); textboxmath.text = table1.rows[combobox1.selectedindex][4].tostring();

12-12. 範例練習 [exp12-7]: 先讀取資料庫, 然後將之存入 class 變數, 然後將之排序 A. 使用 C# Windows 視窗應用程式 來製作 B. 練習目標 : 先讀取資料庫, 然後將之存入 class 變數, 然後將之排序 C. 步驟 : 先製作畫面 複製貼上文字 下載讀入的資料原始檔 放到 \bin\debug 目錄內使用控制項來自動產生資料庫連接元件 bindingsource1 productdataset csiebindingsource 讀入資料檔案單行讀入 - 逗點分隔 - 迴圈讀入產品名稱價格數量依照價格排序依照數量排序 product.mdb (1). 拖曳工具箱 資料 bindingsource (2). 設定資料來源 :bindingsource1 屬性 DataSource 新增專案資料來源 選取資料庫 prodcut.mdb 結果產生 productdataset

csietableadapter (3). 產生資料查詢 DataAdapter 物件 : 拖曳 datagridview 到畫面 設定屬性 設定 DataSource bindingsource1 Csie (4). 瀏覽結果 (5). 刪除 datagridview1 (6). 結果 : 產生兩個查詢物件 csiebindingsource csietableadapter 自訂型態變數 class product 宣告 4 個產品陣列 將 4 個產品初始化 class product.. product[] a1 = new product[4]; a1[0] = new product(productdataset.csie[0][" 產品名稱 "].ToString(), int.parse(productdataset.csie[0][" 價格 "].ToString()), int.parse(productdataset.csie[0][" 數量 "].ToString()));. 如何將資料庫查詢出的變數取出 productdataset.csie[0][" 產品名稱 "] 儲存記憶體資料 table 將產品類別 a1 顯示在 listbox 上 反白選取 listbox 則可在 textbox 上查詢結果更改 textbox 的值, 即可更改到 class 變數上 排序 listbox1.items.clear(); for (int i = 0; i <= 3; i++) listbox1.items.add(a1[i].get_name()); textbox1.text = a1[listbox1.selectedindex].get_name(); textbox2.text = a1[listbox1.selectedindex].get_price().tostring(); textbox3.text = a1[listbox1.selectedindex].get_qty().tostring(); private void textbox1_textchanged(object sender, EventArgs e) a1[listbox1.selectedindex].set_name(textbox1.text);..

D. 關鍵技術 : (a). 如果不將查詢的結果以 DataGrid 顯示, 而是以單獨的每一個記錄顯示 ( 例如顯示在 TextBox) 方法 : 要先將查詢的 DataSet1.Table[ 1a ] 儲存到一個 DataTable 物件來, 如此即可使用表格的方式來指定某個特定位置 DataTable table1 = dataset1.tables["1a"]; table1.rows[0][0] table1.rows[0][1] table1.rows[0][2].... table1.rows[0][j] table1.rows[1][0] table1.rows[2][0].. table1.rows[i][0] table1.rows[i][j] (b).datatable 的資料總筆數 (i) table1.rows.count (c). 如何將所點選 combobox 的項目對應到其他相同筆數的欄位上上 textboxno.text = table1.rows[combobox1.selectedindex][0].tostring(); textboxname.text = table1.rows[combobox1.selectedindex][1].tostring(); textboxchi.text = table1.rows[combobox1.selectedindex][2].tostring(); textboxeng.text = table1.rows[combobox1.selectedindex][3].tostring(); textboxmath.text = table1.rows[combobox1.selectedindex][4].tostring();

E. 程式碼 : class product string name; int price; int qty; public product(string b1, int b2, int b3) // 有參數建構子函數 ( 建立起始值 ) name = b1; price = b2; qty = b3; public product() // 無參數建構子函數 ( 建立起始值 ) public string get_name() return name; public int get_price() return price; public int get_qty() return qty; public void set_name(string a1) name = a1; public void set_price(int a1) price = a1; public void set_qty(int a1) qty = a1; product[] a1 = new product[4]; private void button1_click(object sender, EventArgs e) //MessageBox.Show(productDataSet.csie[1][" 產品名稱 "].ToString()); // 第項產品 a1[0] = new product(productdataset.csie[0][" 產品名稱 "].ToString(), int.parse(productdataset.csie[0][" 價格 "].ToString()), int.parse(productdataset.csie[0][" 數量 "].ToString())); a1[1] = new product(productdataset.csie[1][" 產品名稱 "].ToString(), int.parse(productdataset.csie[1][" 價格 "].ToString()), int.parse(productdataset.csie[1][" 數量 "].ToString())); a1[2] = new product(productdataset.csie[2][" 產品名稱 "].ToString(), int.parse(productdataset.csie[2][" 價格 "].ToString()), int.parse(productdataset.csie[2][" 數

量 "].ToString())); a1[3] = new product(productdataset.csie[3][" 產品名稱 "].ToString(), int.parse(productdataset.csie[3][" 價格 "].ToString()), int.parse(productdataset.csie[3][" 數量 "].ToString())); //############################################## // 將產品類別 a1 顯示在 listbox 上 //############################################## listbox1.items.clear(); for (int i = 0; i <= 3; i++) listbox1.items.add(a1[i].get_name()); private void Form1_Load(object sender, EventArgs e) // TODO: 這行程式碼會將資料載入 'productdataset.csie' 資料表 您可以視需要進行移動或移除 this.csietableadapter.fill(this.productdataset.csie); private void listbox1_selectedindexchanged(object sender, EventArgs e) textbox1.text = a1[listbox1.selectedindex].get_name(); textbox2.text = a1[listbox1.selectedindex].get_price().tostring(); textbox3.text = a1[listbox1.selectedindex].get_qty().tostring(); private void textbox1_textchanged(object sender, EventArgs e) a1[listbox1.selectedindex].set_name(textbox1.text); private void textbox2_textchanged(object sender, EventArgs e) a1[listbox1.selectedindex].set_price(int.parse(textbox2.text)); private void textbox3_textchanged(object sender, EventArgs e) a1[listbox1.selectedindex].set_qty(int.parse(textbox3.text)); private void button3_click(object sender, EventArgs e) // 依價格排序 product temp = new product(); for (int i = 0; i <= 2; i++) for (int j = i + 1; j <= 3; j++) if (a1[i].get_price() > a1[j].get_price()) temp = a1[i]; a1[i] = a1[j]; a1[j] = temp;

//-------- 產品名稱到 ListBox 上 listbox1.items.clear(); for (int i = 0; i <= 3; i++) listbox1.items.add(a1[i].get_name()); private void button4_click(object sender, EventArgs e) // 依數量排序 product temp = new product(); for (int i = 0; i <= 2; i++) for (int j = i + 1; j <= 3; j++) if (a1[i].get_qty() > a1[j].get_qty()) temp = a1[i]; a1[i] = a1[j]; a1[j] = temp; //-------- 產品名稱到 ListBox 上 listbox1.items.clear(); for (int i = 0; i <= 3; i++) listbox1.items.add(a1[i].get_name());

Click below to find more Mipaper at www.lcis.com.tw Mipaper at www.lcis.com.tw