BCB講座第十五講簡(jiǎn)單數(shù)據(jù)庫(kù)查詢操作_第1頁(yè)
BCB講座第十五講簡(jiǎn)單數(shù)據(jù)庫(kù)查詢操作_第2頁(yè)
BCB講座第十五講簡(jiǎn)單數(shù)據(jù)庫(kù)查詢操作_第3頁(yè)
BCB講座第十五講簡(jiǎn)單數(shù)據(jù)庫(kù)查詢操作_第4頁(yè)
BCB講座第十五講簡(jiǎn)單數(shù)據(jù)庫(kù)查詢操作_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、簡(jiǎn)單數(shù)據(jù)庫(kù)查詢操作上一講我們學(xué)習(xí)了數(shù)據(jù)庫(kù)編程的基礎(chǔ)知識(shí),并對(duì) MP3Collect 進(jìn)行了一番改造,使其具有數(shù)據(jù)庫(kù) 訪問能力。在本講中,我們首先設(shè)置三個(gè)數(shù)據(jù)庫(kù)元件 Query1、 DataSource1和 DBGrid1的屬性,接 下來學(xué)習(xí)如何通過 Query 控件實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)庫(kù)查詢操作。設(shè)置控件屬性Query1控件的用途是查詢數(shù)據(jù)庫(kù),獲取可以顯示在窗體中的數(shù)據(jù)。 Query 控件和 Table 控件一 樣,它們都是從 VCL 類 TDataSet (數(shù)據(jù)集元件中繼承來的,都代表數(shù)據(jù)庫(kù)中一組記錄的集合。不 同的是, Table 控件代表庫(kù)中實(shí)際存在的一個(gè)數(shù)據(jù)表對(duì)象, 而 Query 控件則代

2、表一次查詢的結(jié)果。 Query 控件支持通過 SQL 進(jìn)行查詢,因此比 Table 控件具有更大的靈活性,它可以同時(shí)訪問多個(gè)數(shù)據(jù)表, 可以靈活訪問數(shù)據(jù)表中的行和列,可以實(shí)現(xiàn)十分復(fù)雜的條件查詢。SQL 的全稱是結(jié)構(gòu)化查詢語言,它是一種標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)查詢語言,具有自己的關(guān)鍵字(SQL 中 的關(guān)鍵字是不分大小寫的, SELECT 和 Select 的作用是相同的和語法,典型的 SQL 查詢語句如下 所示:SELECT 字段名 FROM 數(shù)據(jù)表名 WHERE 條件子句 其中 SELECT 、 FROM 和 WHERE 都是 SQL 的關(guān)鍵字。 SELECT 代表查詢操作, “字段名”表示返 回的記錄集中

3、所包含的字段,字段名可以使用通配符 *,表示查詢的數(shù)據(jù)表中的所有字段, “數(shù)據(jù)表 名”表示在哪個(gè)數(shù)據(jù)表中進(jìn)行查詢, “條件子句”為查詢的條件。了解了 SQL 的基本語法后, 下面我們來設(shè)置 Query1控件的 SQL 屬性。 在對(duì)象監(jiān)視器中雙擊 Query1控件的 SQL 屬性(該屬性為 TStrings*類型 ,打開字符串列表編輯器,在其中輸入這樣兩句“ Select * From MP3Info”和“ Order by FileName ASC”。注意第二句要另起一行,這樣在后面的編程中可以 很方便地改變記錄的排序方式。這兩句合在一起的意思是獲取 MP3Info 數(shù)據(jù)表中的所有記錄,并以

4、FileName 字段為基準(zhǔn)按升序方式排序。除了指定 Query1控件的 SQL 屬性外,還要指定它在哪個(gè)數(shù)據(jù) 庫(kù)中進(jìn)行查詢,將其 Database 屬性設(shè)為別名 MP3Collect 。然后指定其 Active 屬性為 true ,其它屬性值 都接受缺省值。DataSource 控件從字面上可翻譯為數(shù)據(jù)源控件, 不過它與上一講介紹的 ODBC 數(shù)據(jù)源可不是一回 事。 DataSource 控件是一個(gè)中間控件,它位于數(shù)據(jù)集控件(如 Table 控件或 Query 控件和數(shù)據(jù)控制控 件(如 DBGrid 控件或 DBEdit 控件之間,是聯(lián)系兩類控件的橋梁。 DataSource 控件最重要的屬

5、性是 它的數(shù)據(jù)集屬性 DataSet ,在對(duì)象瀏覽器中點(diǎn)擊該屬性右側(cè)的下拉式列表框,可以看到其中列出了 Table1和 Query1,我們選中 Query1,表示 DataSource 控件從 Query1中獲取數(shù)據(jù)。DBGrid 控件是一種常用的數(shù)據(jù)控制元件,它以表格的方式顯示記錄,表格中的行表示記錄,而 列表示記錄的字段。 所有的數(shù)據(jù)控制元件都必須和某個(gè) DataSource 控件相關(guān)聯(lián), 才能獲取所需要的數(shù) 據(jù), 因此我們?cè)谶@里將 DBGrid1控件的 DataSource 屬性設(shè)為 DataSource1。 指定 DBGrid1的數(shù)據(jù)來源后, 我們可以看到 DBGrid1的表格中立即顯

6、示出相應(yīng)的記錄了。缺省情況下, DBGrid1會(huì)顯示數(shù)據(jù)集的全部字段,并以字段的名稱顯示在列標(biāo)題中,我們可以 在設(shè)計(jì)時(shí)通過 DBGrid 控件的列編輯器修改列的數(shù)目、 標(biāo)題以及布局等。 在對(duì)象瀏覽器中雙擊 Columns 屬性,打開列編輯器,此時(shí)列編輯器中的內(nèi)容還是空的,因此我們?cè)诹芯庉嬈髦悬c(diǎn)擊鼠標(biāo)右鍵,選 擇關(guān)聯(lián)菜單中的“ Add All Field”命令,先把數(shù)據(jù)集中的所有字段添加進(jìn)來。由于我們不希望將記錄 的編號(hào)顯示出來,所以要?jiǎng)h除其中的“ ID ”字段。接下來我們來設(shè)置各列的列標(biāo)題。首先選中“ FileName ”列,這時(shí)可以在對(duì)象瀏覽器中看到該 列的各種屬性,其中 FieldName

7、 屬性為“ FileName ”,表示該列顯示“ FileName ”字段的內(nèi)容,列對(duì) 象的 Title 屬性為復(fù)合屬性,展開 Title 屬性,將其中的 Caption 子屬性改為“文件名稱”,然后設(shè)置“ FileName ”列的列寬度,其缺省的 Width 屬性為 -1,表示根據(jù)字段的寬度自動(dòng)設(shè)置列寬度,我們可 以根據(jù)窗體的布局為其重新設(shè)置一個(gè)實(shí)際的值。按照同樣的方法,我們繼續(xù)把“ SongName ”、 “ SingerName ”的列標(biāo)題改為“歌曲名稱”和“歌手名稱”。設(shè)置好 DBGrid1控件的列對(duì)象的屬性后,接下來還要設(shè)置它的 Options 屬性,該屬性決定了顯示 記錄的方式。展

8、開 DBGrid1控件的 Options 屬性,可以看見其中有十多項(xiàng)選項(xiàng),將其中的 dgEditing 、 dgAlwaysShowEdit 和 dgMultiSelect 三個(gè)選項(xiàng)設(shè)為 false ,其余的選項(xiàng)都設(shè)為 true ,如此設(shè)置可以屏蔽在 DBGrid 中直接修改記錄以及同時(shí)選中多條記錄的功能。另外還可以設(shè)置 DBGrid1的 ReadOnly 屬性為 true ,使用戶不能在網(wǎng)格中進(jìn)行添加、修改、刪除記錄的操作。最后,設(shè)置 DBGrid1的 PopupMenu 屬 性為 PopupMenu1,為其指定關(guān)鍵菜單。現(xiàn)在所有元件的屬性都設(shè)置好了,下面我們來看看訪問數(shù)據(jù)庫(kù)的具體方法。為了

9、簡(jiǎn)潔起見,下 面的代碼中都沒有異常處理措施,讀者朋友可以根據(jù)第 13講的內(nèi)容自己添加相應(yīng)的異常處理代碼。 實(shí)現(xiàn)查詢功能Table 控件和 Query 控件都可以實(shí)現(xiàn)查詢,但 Table 不支持 SQL ,只能通過數(shù)據(jù)表中的索引實(shí)現(xiàn) 比較簡(jiǎn)單的檢索功能(在后面還會(huì)用到 Table 的查詢功能 ,因此心鈴決定用 Query1控件進(jìn)行查詢, 提供顯示在 DBGrid1中的數(shù)據(jù)。所有的查詢都是通過設(shè)置 Query1控件的 SQL 屬性來完成的。實(shí)現(xiàn)顯示所有記錄的 SQL 語句最 簡(jiǎn)單,即前面給出的 SQL 屬性。下面是 btnShowAllClick 事件處理函數(shù)的新代碼,其中給出了在運(yùn) 行時(shí)改變 Q

10、uery 控件 SQL 屬性的方法。void _fastcall TMainForm:btnShowAllClick(TObject *SenderQuery1-Close(;/先關(guān)閉上一次查詢Query1-SQL-Clear(;/清除原來的 SQL 語句Query1-SQL-Add(Select * from MP3Info;/添加一個(gè)字符串, SQL 屬性由多個(gè)字符串組合而 成Query1-SQL-Add(Order By FileName ASC;ColumnToSort=0;/記下當(dāng)前排序的基準(zhǔn)列為“ FileName ”m_IsAsc=1;/記下當(dāng)前排序的方式為升序方式Query1-

11、Open(; /設(shè)置好 SQL 屬性后,打開 Query1,獲取數(shù)據(jù)并自動(dòng)更新 DBGrid1在改變 Query1的 SQL 屬性之前,首先應(yīng)將上一次查詢關(guān)閉。 SQL 屬性是一個(gè) TStrings 對(duì)象指 針,它將多個(gè)字符串組成一個(gè)完整的 SQL 查詢語句,其中的 Order By 是 SQL 中的關(guān)鍵字,表示按 照某一個(gè)字段進(jìn)行排序, ASC 是排序方式關(guān)鍵字,表示升序方式。 ColumnToSort 和 m_IsAsc是 MainForm 類的成員變量, 用于保存排序的基準(zhǔn)列號(hào)和排序方式, 有關(guān)排序的內(nèi)容還要在下一節(jié)仔細(xì) 介紹。設(shè)置好 SQL 屬性后,調(diào)用 Query 控件的 Open(

12、方法,該方法會(huì)通過 BDE 引擎向數(shù)據(jù)庫(kù)進(jìn)行 一次查詢操作,獲取所需的數(shù)據(jù),并自動(dòng)更新 DBGrid1中顯示的數(shù)據(jù)。條件查詢操作需要使用 SQL 語句中的 WHERE 條件子句。 查詢的原理是依次讀取三個(gè)條件輸入 框的內(nèi)容,如果某一條件輸入框不為空,則添加一個(gè)查詢條件。這里使用的查詢條件的語法如下所 示:字段名 Like 帶通配符的字符串 其中 字段名 為要檢查的字段, LIKE 為 SQL 的關(guān)鍵字, 表示將字段內(nèi)容與 “帶通配符的字符串” 進(jìn)行比較,看是否符合給定的模式。 “帶通配符的字符串”需要用單引號(hào)包括起來,常用的通配符有 “ %” 、 “?”等。其中“ %”表示任意字符串。例如,下

13、面的 SQL 語句表示從 MP3Info 中取出所有 FileName 字段中包括“ MP3”字樣的記錄:SELECT * FROM MP3Info WHERE FileName Like %MP3%另外,在 MP3Collect 中,各個(gè)查詢條件之間是邏輯與的關(guān)系,因此多個(gè)查詢條件之間要用關(guān)鍵 字 AND 進(jìn)行連接, 表示只有符合所有查詢條件的記錄才是所需要的記錄。 下面是 btnFindClick 事件 處理函數(shù)的新代碼:void _fastcall TMainForm:btnFindClick(TObject *SenderQuery1-Close(;/首先關(guān)閉 Query1Query1

14、-SQL-Clear(;/清除原有的 SQL 語句Query1-SQL-Add(Select * from MP3Info;/表示從數(shù)據(jù)表中 MP3Info 中查詢/如果 edtFileName 不為空,則添加對(duì) FileName 字段的查詢,注意不要漏了其中的單引號(hào) if(!edtFileName-Text.IsEmpty(Query1-SQL-Add( where FileName Like %+edtFileName-Text+%;/如果 edtSongName 不為空,則添加對(duì) SongName 字段的查詢,由于整個(gè)條件子句中只有 /一個(gè) WHERE 關(guān)鍵字,多個(gè)條件之間需要用 AND

15、 關(guān)鍵字連接,所以要進(jìn)行一些特殊處理 if(!edtSongName-Text.IsEmpty(if(Query1-SQL-Count1/判斷是否已經(jīng)包含查詢條件了Query1-SQL-Add( and ;/如果是,則用 AND 連接本查詢條件elseQuery1-SQL-Add( where ;/否則用 WHERE 引出查詢條件Query1-SQL-Add(SongName Like %+edtSongName-Text+%;/添加一個(gè)查詢條件 /如果 edtSingerName 編輯框中不為空,則添加對(duì) SingerName 字段的查詢if(!edtSingerName-Text.IsEm

16、pty(if(Query1-SQL-Count1/判斷是否已經(jīng)包含查詢條件了Query1-SQL-Add( and ;/如果是,則用 AND 連接本查詢條件elseQuery1-SQL-Add( where ;/否則用 WHERE 引出查詢條件Query1-SQL-Add(SingerName Like %+edtSingerName-Text+%;/添加一個(gè)查詢條件 Query1-SQL-Add( Order By FileName ASC;/添加排序子句ColumnToSort=0;/記下當(dāng)前排序的基準(zhǔn)列為“ FileName ”m_IsAsc=1;/記下當(dāng)前排序的方式為升序方式Query

17、1-Open(;實(shí)現(xiàn)排序前面我們已經(jīng)用到了 SQL 語言的排序子句, 排序子句是由關(guān)鍵詞 Order By引出的, 其后跟一個(gè) 或多個(gè)字段,表示以某個(gè)字段為基準(zhǔn)進(jìn)行排序,如果有多個(gè)字段,則先按第一個(gè)字段進(jìn)行排序,如 果出現(xiàn)第一個(gè)字段的內(nèi)容相同,再按第二個(gè)字段排序,依此類推。另外還可以用 ASC (升序方式 和 DESC (降序方式規(guī)定其排序的方式。我們?cè)?TMainForm 中添加了一個(gè)成員變量 m_IsAsc,用于保存當(dāng)前排序的方式,注意應(yīng)在窗體 的初始化函數(shù) FormCreate 中將 m_IsAsc初始化為 1。下面是菜單命令 mnuSortByFileName 的命令處 理函數(shù):voi

18、d _fastcall TMainForm:mnuSortByFileNameClick(TObject *Senderif(ColumnToSort!=0/如果以前不是按 FileName 字段排序,則改為按 FileName 字段排序 Query1-Close(;Query1-SQL-Delete(Query1-SQL-Count-1;/清除原來的排序子句Query1-SQL-Add(Order By FileName ASC;/添加新的排序子句ColumnToSort=0;/記下當(dāng)前排序的基準(zhǔn)列為“ FileName ”m_IsAsc=1; /記下當(dāng)前排序的方式為升序方式Query1-Open(;else /否則切換排序的方式Query1-Close(;Query1-SQL-Delete(Query1-SQL-Count-1;if(m_IsAscQuery1-SQL-Add(Order By FileName DESC;/如果原來是升序,改為降序elseQuery1-SQL-Add(Order By FileName Asc;/如果原來是降序,改為升序m_IsAsc=1-m_IsAsc;/改變 m_IsAsc的值,反映排序方式的改變Query1-Open(;/打開 Query1另外兩個(gè)排

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論