Qt 5 開發(fā)及實例(第5版) 課件 第8章 Qt 5文件、目錄與數(shù)據(jù)庫操作_第1頁
Qt 5 開發(fā)及實例(第5版) 課件 第8章 Qt 5文件、目錄與數(shù)據(jù)庫操作_第2頁
Qt 5 開發(fā)及實例(第5版) 課件 第8章 Qt 5文件、目錄與數(shù)據(jù)庫操作_第3頁
Qt 5 開發(fā)及實例(第5版) 課件 第8章 Qt 5文件、目錄與數(shù)據(jù)庫操作_第4頁
Qt 5 開發(fā)及實例(第5版) 課件 第8章 Qt 5文件、目錄與數(shù)據(jù)庫操作_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

QT5開發(fā)及實例(第5版)第8章Qt5文件、目錄與數(shù)據(jù)庫操作——文件操作01文本文件操作實例1.QFile讀寫實例2.QTextStream讀寫實例文本文件操作實例1.QFile讀寫實例【例】(簡單)(CH801)在基于控制臺的Qt程序中使用QFile類讀寫文本文件。實現(xiàn)步驟如下。(1)創(chuàng)建Qt控制臺項目點擊QtCreator歡迎界面左側“CreateProject...”按鈕,或者選擇“文件”→“NewProject...”命令,在彈出“NewProject”窗口中點左欄“Projects”列表下的“Application(Qt)”,中間欄選“QtConsoleApplication”選項,單擊右下角“Choose...”按鈕,進入下一步,將項目命名為TextFile并選擇保存路徑。連續(xù)點兩次“下一步”按鈕,最后單擊“完成”按鈕。文本文件操作實例(2)編寫程序在源文件main.cpp中編寫代碼如下:#include<QCoreApplication>#include<QFile>#include<QtDebug>intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QFilefile("textFile1.txt"); //(a)if(file.open(QIODevice::ReadOnly)) //(b){charbuffer[2048];qint64lineLen=file.readLine(buffer,sizeof(buffer)); //(c)if(lineLen!=-1) //(d){qDebug()<<buffer;}}returna.exec();}文本文件操作實例(3)運行程序首先,選擇“構建”→“構建項目"TextFile"”菜單項,生成Debug目錄。然后,編輯本例所用的文本文件textFile1.txt(內(nèi)容“Welcometoyou!”),保存在項目Debug目錄下。最后,運行程序,輸出結果如圖。文本文件操作實例2.QTextStream讀寫實例【例】(簡單)(CH802)在基于控制臺的Qt程序中使用QTextStream類讀寫文本文件。實現(xiàn)步驟如下。(1)創(chuàng)建Qt控制臺項目項目名為TextFile2,創(chuàng)建操作步驟與上個實例完全一樣,不再贅述。(2)編寫程序在源文件main.cpp中編寫代碼如下:#include<QCoreApplication>#include<QFile>#include<QTextStream>intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QFiledata("data.txt");if(data.open(QFile::WriteOnly|QFile::Truncate)) //(a){QTextStreamout(&data);out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<90<<endl; //(b)}returna.exec();}文本文件操作實例說明:(a)if(data.open(QFile::WriteOnly|QFile::Truncate)):參數(shù)QFile::Truncate表示將原來文件中的內(nèi)容清空。輸出時將格式設為左對齊,占10個字符位置。(b)out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<90<<endl:用戶使用格式化函數(shù)和流操作符設置需要的輸出格式。其中,qSetFieldWidth()函數(shù)是設置字段寬度的格式化函數(shù)。除此之外,QTextStream還提供了其他一些格式化函數(shù),見表。函

數(shù)功能描述qSetFieldWidth(intwidth)設置字段寬度qSetPadChar(QCharch)設置填充字符qSetRealNumberPercision(intprecision)設置實數(shù)精度文本文件操作實例其中,left操作符是QTextStream定義的類似于<iostream>中的流操作符。QTextStream還提供了其他一些流操作符,見表。操

符作用描述bin設置讀寫的整數(shù)為二進制數(shù)oct設置讀寫的整數(shù)為八進制數(shù)dec設置讀寫的整數(shù)為十進制數(shù)hex設置讀寫的整數(shù)為十六進制數(shù)showbase強制顯示進制前綴,如十六進制(0x)、八進制(0)、二進制(0b)forcesign強制顯示符號(+,-)forcepoint強制顯示小數(shù)點noshowbase不顯示進制前綴noforcesign不顯示符號uppercasebase顯示大寫的進制前綴lowercasebase顯示小寫的進制前綴uppercasedigits用大寫字母表示lowercasedigits用小寫字母表示fixed用固定小數(shù)點表示scientific用科學計數(shù)法表示left左對齊right右對齊center居中endl換行flush清除緩沖文本文件操作實例(3)運行程序啟動此程序后,可以看到在項目的Debug目錄下自動生成了一個文本文件data.txt,打開后看到的內(nèi)容如圖。02二進制文件操作實例二進制文件操作實例【例】(簡單)(CH803)使用QDataStream讀寫二進制文件。以“直接編寫代碼”(即取消勾選“Generateform”復選框)方式創(chuàng)建Qt項目,項目名mainwindow,“ClassInformation”頁基類選“QMainWindow”。(1)頭文件mainwindow.h的代碼如下:#include<QMainWindow>classMainWindow:publicQMainWindow{Q_OBJECTpublic:MainWindow(QWidget*parent=0);~MainWindow();voidfileFun();};二進制文件操作實例(2)源文件mainwindow.cpp的代碼如下:#include"mainwindow.h"#include<QtDebug>#include<QFile>#include<QDataStream>#include<QDate>MainWindow::MainWindow(QWidget*parent):QMainWindow(parent){fileFun();}二進制文件操作實例函數(shù)fileFun()完成主要功能,其具體代碼如下:voidMainWindow::fileFun(){/*將二進制數(shù)據(jù)寫到數(shù)據(jù)流*/ //(a)QFilefile("binary.dat");file.open(QIODevice::WriteOnly|QIODevice::Truncate);QDataStreamout(&file); //將數(shù)據(jù)序列化out<<QString(tr("周何駿:")); //字符串序列化out<<QDate::fromString("1996/09/25","yyyy/MM/dd");out<<(qint32)23; //整數(shù)序列化file.close();/*從文件中讀取數(shù)據(jù)*/ //(b)file.setFileName("binary.dat");if(!file.open(QIODevice::ReadOnly)){qDebug()<<"error!";return;}QDataStreamin(&file); //從文件中讀出數(shù)據(jù)QStringname;QDatebirthday;qint32age;in>>name>>birthday>>age; //獲取字符串和整數(shù)qDebug()<<name<<birthday<<age;file.close();}二進制文件操作實例(3)運行結果如圖8.3所示。說明:(a)從QFilefile("binary.dat")到file.close()之間的代碼段:每一個條目都以定義的二進制格式寫入文件。Qt中的很多類型,包括QBrush、QColor、QDateTime、QFont、QPixmap、QString、QVariant等都可以寫入數(shù)據(jù)流。(b)從file.setFileName("binary.dat")到file.close()之間的代碼段:QDataStream類可以讀取任意的以QIODevice為基類的類生成對象產(chǎn)生的數(shù)據(jù),如QTcpSocket、QUdpSocket、QBuffer、QFile、QProcess等類的數(shù)據(jù)。QT5開發(fā)及實例(第5版)第8章Qt5文件、目錄與數(shù)據(jù)庫操作——目錄操作01文件大小及路徑獲取實例文件大小及路徑獲取實例【例】(難度一般)(CH804)得到一個文件的大小和所在的目錄路徑。創(chuàng)建Qt控制臺項目,項目名為dirProcess,前面已介紹過操作步驟,不再贅述。在源文件main.cpp中編寫代碼如下。運行輸出結果如圖。02文件系統(tǒng)瀏覽實例文件系統(tǒng)瀏覽實例【例】(難度一般)(CH805)文件系統(tǒng)的瀏覽。以“直接編寫代碼”(即取消勾選“Generateform”復選框)方式創(chuàng)建Qt項目,項目名FileView,“ClassInformation”頁基類選“QDialog”,類名命名為“FileView”。(1)頭文件fileview.h代碼如下:#include<QDialog>#include<QLineEdit>#include<QListWidget>#include<QVBoxLayout>#include<QDir>#include<QListWidgetItem>#include<QFileInfoList>classFileView:publicQDialog{Q_OBJECTpublic:FileView(QWidget*parent=0,Qt::WindowFlagsf=0);~FileView();

voidshowFileInfoList(QFileInfoListlist);publicslots:voidslotShow(QDirdir);voidslotDirShow(QListWidgetItem*item);private:QLineEdit*fileLineEdit;QListWidget*fileListWidget;QVBoxLayout*mainLayout;};文件系統(tǒng)瀏覽實例(2)源文件fileview.cpp代碼如下:#include"fileview.h"#include<QStringList>#include<QIcon>FileView::FileView(QWidget*parent,Qt::WindowFlagsf):QDialog(parent,f){setWindowTitle(tr("FileView"));fileLineEdit=newQLineEdit(tr("/"));fileListWidget=newQListWidget;mainLayout=newQVBoxLayout(this);mainLayout->addWidget(fileLineEdit);mainLayout->addWidget(fileListWidget);connect(fileLineEdit,SIGNAL(returnPressed()),this,SLOT(slotShow(QDir)));connect(fileListWidget,SIGNAL(itemDoubleClicked(QlistWidgetItem*)),this,SLOT(slotDirShow(QlistWidgetItem*)));QStringroot="/";QDirrootDir(root);QStringListstring;string<<"*";QFileInfoListlist=rootDir.entryInfoList(string);showFileInfoList(list);}文件系統(tǒng)瀏覽實例槽函數(shù)slotShow()實現(xiàn)了顯示目錄dir下的所有文件,代碼如下:voidFileView::slotShow(QDirdir){QStringListstring;string<<"*";QFileInfoListlist=dir.entryInfoList(string,QDir::AllEntries,QDir::DirsFirst); //(a)showFileInfoList(list); //(b)}說明:(a)QDir的entryInfoList()方法是按照某種過濾方式獲得目錄下的文件列表,其函數(shù)原型如下:QFileInfoListQDir::entryInfoList(constQStringList&nameFilters, //文件名的過濾方式Filtersfilters=NoFilter, //文件屬性過濾方式SortFlagssort=NoSort //列表的排序方式)const文件系統(tǒng)瀏覽實例其中,F(xiàn)ilters參數(shù)定義了一系列的過濾方式,包括目錄、文件、讀寫屬性等,具體見表。過濾方式作用描述QDir::Dirs按照過濾方式列出所有目錄QDir::AllDirs列出所有目錄,不考慮過濾方式QDir::Files只列出文件QDir::Drives列出磁盤驅(qū)動器(UNIX系統(tǒng)無效)QDir::NoSymLinks不列出符號連接(對不支持符號連接的操作系統(tǒng)無效)QDir::NoDotAndDotDot不列出“.”和“..”QDir::AllEntries列出目錄、文件和磁盤驅(qū)動器,相當于Dirs|Files|DrivesQDir::Readable列出所有具有“讀”屬性的文件和目錄QDir::Writable列出所有具有“寫”屬性的文件和目錄QDir::Executable列出所有具有“執(zhí)行”屬性的文件和目錄QDir::Modified只列出被修改過的文件(UNIX系統(tǒng)無效)QDir::Hidden列出隱藏文件(在UNIX系統(tǒng)下,隱藏文件的文件名以“.”開始)QDir::System列出系統(tǒng)文件(在UNIX系統(tǒng)下指FIFO、套接字和設備文件)QDir::CaseSensitive文件系統(tǒng)如果區(qū)分文件名大小寫,則按大小寫方式進行過濾文件系統(tǒng)瀏覽實例SortFlags參數(shù)定義了一系列排序方式,具體見表。排序方式作用描述QDir::Name按名稱排序QDir::Time按時間排序(修改時間)QDir::Size按文件大小排序QDir::Type按文件類型排序QDir::Unsorted不排序QDir::DirsFirst目錄優(yōu)先排序QDir::DirsLast目錄最后排序QDir::Reversed反序QDir::IgnoreCase忽略大小寫方式排序QDir::LocaleAware使用當前本地排序方式進行排序文件系統(tǒng)瀏覽實例(b)

函數(shù)showFileInfoList()實現(xiàn)了用戶可以雙擊瀏覽器中顯示的目錄進入下一級目錄,或單擊“..”返回上一級目錄,頂部的編輯框顯示當前所在的目錄路徑,列表中顯示該目錄下的所有文件。其具體代碼如下:voidFileView::showFileInfoList(QFileInfoListlist){fileListWidget->clear();for(unsignedinti=0;i<list.count();i++){QFileInfotmpFileInfo=list.at(i);if(tmpFileInfo.isDir()){QIconicon("dir.png");QStringfileName=tmpFileInfo.fileName();QListWidgetItem*tmp=newQListWidgetItem(icon,fileName);fileListWidget->addItem(tmp);}elseif(tmpFileInfo.isFile()){QIconicon("file.png");QStringfileName=tmpFileInfo.fileName();QListWidgetItem*tmp=newQListWidgetItem(icon,fileName);fileListWidget->addItem(tmp);}}}文件系統(tǒng)瀏覽實例槽函數(shù)slotDirShow()根據(jù)用戶的選擇顯示下一級目錄的所有文件,代碼如下:voidFileView::slotDirShow(QListWidgetItem*item){QStringstr=item->text(); //將下一級的目錄名保存在str中QDirdir; //定義一個QDir對象dir.setPath(fileLineEdit->text()); //設置QDir對象的路徑為當前目錄路徑dir.cd(str); //根據(jù)下一級目錄名重新設置QDir對象的路徑fileLineEdit->setText(dir.absolutePath());slotShow(dir); //顯示當前目錄下的所有文件}(3)運行結果如圖。03獲取文件信息實例獲取文件信息實例【例】(簡單)(CH806)利用QFileInfo類獲得文件信息,如圖。以“直接編寫代碼”(即取消勾選“Generateform”復選框)方式創(chuàng)建Qt項目,項目名FileInfo,“ClassInformation”頁基類選“QDialog”,類名命名為“FileInfo”。(1)頭文件fileinfo.h中聲明了用到的各種相關控件和函數(shù),其具體內(nèi)容。獲取文件信息實例(2)在源文件fileinfo.cpp中編寫代碼。其中,槽函數(shù)slotFile()完成通過標準文件對話框獲得所需要文件的文件名功能,代碼如下:voidFileInfo::slotFile(){QStringfileName=QFileDialog::getOpenFileName(this,"打開","/","files(*)");fileNameLineEdit->setText(fileName);}槽函數(shù)slotGet()通過QFileInfo獲得具體的文件信息,代碼如下。QT5開發(fā)及實例(第5版)第8章Qt5文件、目錄與數(shù)據(jù)庫操作——數(shù)據(jù)庫操作01數(shù)據(jù)庫與SQL基礎1.數(shù)據(jù)庫基本概念2.SELECT語句3.聚合函數(shù)4.插入INSERT語句5.刪除DELETE語句6.更新UPDATE語句數(shù)據(jù)庫與SQL基礎1.數(shù)據(jù)庫基本概念(1)數(shù)據(jù)和數(shù)據(jù)庫(DB)利用計算機進行數(shù)據(jù)處理,首先需要將信息以數(shù)據(jù)形式存儲到計算機中,因為數(shù)據(jù)是可以被計算機接收和處理的符號。根據(jù)所表示的信息特征不同,數(shù)據(jù)有不同的類別,如數(shù)字、文字、表格、圖形/圖像和聲音等。(2)數(shù)據(jù)庫管理系統(tǒng)(DBMS)數(shù)據(jù)庫管理系統(tǒng)(DataBaseManagementSystem,DBMS)是位于用戶應用程序和操作系統(tǒng)之間的數(shù)據(jù)庫管理系統(tǒng)軟件,其主要功能是組織、存儲和管理數(shù)據(jù),高效地訪問和維護數(shù)據(jù),即提供數(shù)據(jù)定義、數(shù)據(jù)操縱、數(shù)據(jù)控制和數(shù)據(jù)維護等功能。常用的數(shù)據(jù)庫管理系統(tǒng)有MySQL、SQLServer和Oracle等。在實際應用中,數(shù)據(jù)庫系統(tǒng)通常分為本地型和網(wǎng)絡型兩類。本地型數(shù)據(jù)庫系統(tǒng):是指只在本機運行、不與其他計算機交換數(shù)據(jù)的系統(tǒng)。網(wǎng)絡型數(shù)據(jù)庫系統(tǒng):是指能夠通過計算機網(wǎng)絡進行數(shù)據(jù)共享和交換的系統(tǒng),常用于構建較復雜的C/S或B/S結構的分布式應用系統(tǒng),大多數(shù)傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)均屬此類,如Oracle、SQLServer等。數(shù)據(jù)庫與SQL基礎(3)結構化查詢語言(SQL)結構化查詢語言(StructuredQueryLanguage,SQL)是用于關系數(shù)據(jù)庫操作的標準語言,最早由Boyce和Chambedin在1974年提出,稱為SEQUEL語言。SQL語言由以下三部分組成:數(shù)據(jù)定義語言(DataDescriptionLanguage,DDL),用于執(zhí)行數(shù)據(jù)庫定義的任務,對數(shù)據(jù)庫及數(shù)據(jù)庫中的各種對象進行創(chuàng)建、刪除和修改等操作。數(shù)據(jù)庫對象主要包括表、默認約束、規(guī)則、視圖、觸發(fā)器和存儲過程等。數(shù)據(jù)操縱語言(DataManipulationLanguage,DML),用于操縱數(shù)據(jù)庫中各種對象,檢索和修改數(shù)據(jù)。數(shù)據(jù)控制語言(DataControlLanguage,DCL),用于安全管理,確定哪些用戶可以查看或修改數(shù)據(jù)庫中的數(shù)據(jù)。數(shù)據(jù)庫與SQL基礎(4)表和視圖表(Table)是在日常工作和生活中經(jīng)常使用的一種表示數(shù)據(jù)及其關系的形式,也是關系數(shù)據(jù)庫最主要的數(shù)據(jù)庫對象,它是用來存儲和操作數(shù)據(jù)的一種邏輯結構。表由行和列組成,因此也稱為二維表。例如,如表為一個學生表。學

號姓

名專

業(yè)

名性

別出生時間170201王

一計算機男1998/10/01170202王

巍計算機女1999/02/08170302林

滔電子工程男1998/04/06170303江為中電子工程男2001/12/08數(shù)據(jù)庫與SQL基礎

表結構每個數(shù)據(jù)庫包含若干個表。每個表都具有自身特定的結構,稱為表的“型”。所謂表型是指組成表的各列的名稱及數(shù)據(jù)類型,也就是日常表格的“欄目信息”。

記錄每個表包含若干行數(shù)據(jù),它們是表的“值”,表中的一行稱為一個記錄(Record)。因此,表是記錄的有限集合。

字段每個記錄由若干個數(shù)據(jù)項構成,將構成記錄的每個數(shù)據(jù)項稱為字段(Field)。字段包含的屬性有字段名、字段數(shù)據(jù)類型、字段長度及是否為關鍵字等。其中,字段名是字段的標識,字段的數(shù)據(jù)類型可以是多樣的,如整型、實型、字符型、日期型或二進制型等。

關鍵字在學生表中,若不加以限制,則每條記錄的姓名、專業(yè)名、性別和出生時間這四個字段的值都有可能相同,但是學號字段的值對表中所有記錄來說則一定不同,即通過“學號”字段可以將表中的不同記錄區(qū)分開來。數(shù)據(jù)庫與SQL基礎2.SELECT語句在數(shù)據(jù)庫應用中,最常用的操作是查詢,同時查詢還是數(shù)據(jù)庫的其他操作(如統(tǒng)計、插入、刪除及修改)的基礎。SELECT語句是SQL語言的核心,其功能十分強大,與SQL子句結合,可完成各類復雜的查詢操作。完備的SELECT語句很復雜,其主要的子句如下:SELECT[DISTINCT][別名.]字段名或表達式[AS列標題] /*指定要選擇的列或行及其限定*/ //(a)FROM表名|視圖名 /*FROM子句*/[WHERE查詢條件] /*WHERE子句*/ //(b)[GROUPBY分組表達式] /*GROUPBY子句*/[ORDERBY排序表達式[ASC|DESC]] /*ORDERBY子句*/ //(c)數(shù)據(jù)庫與SQL基礎說明:(a)SELECT指出查詢結果中要顯示的字段名,以及字段名和函數(shù)組成的表達式等。可用DISTINCT去除重復的記錄行;[AS列標題]指定查詢結果顯示的列標題。當要顯示表中所有字段時,可用通配符“*”代替字段名列表。(b)WHERE子句定義了查詢條件。WHERE子句必須緊跟FROM子句,其查詢條件的常用格式為:{[NOT]<謂詞>|(<查詢條件>)}[{AND|OR}[NOT]{<謂詞>|(<查詢條件>)}]}[,...n]其中的“謂詞”為判定運算,結果為TRUE、FALSE或UNKNOWN,格式為:{表達式{=|<|<=|>|>=|<>|!=|!<|!>}表達式 /*比較運算*/|字符串表達式[NOT]LIKE字符串表達式[ESCAPE'轉(zhuǎn)義字符'] /*字符串模式匹配*/|表達式[NOT]BETWEEN表達式1AND表達式2 /*指定范圍*/|表達式IS[NOT]NULL /*是否空值判斷*/|表達式[NOT]IN(子查詢|表達式[,...n]) /*IN子句*/|表達式{=|<|<=|>|>=|<>|!=|!<|!>}{ALL|SOME|ANY}(子查詢) /*比較子查詢*/|EXIST(子查詢) /*EXIST子查詢*/}(c)GROUPBY子句和ORDERBY子句分別對查詢結果進行分組和排序。數(shù)據(jù)庫與SQL基礎下面用示例說明使用SQL語句對Student數(shù)據(jù)庫進行的各種查詢。(1)操作Student數(shù)據(jù)庫,查詢students表中每個同學的姓名和總學分:USEStudent;SELECTname,totalscoreFROMstudents;(2)查詢表中所有記錄。查詢students表中每個同學的所有信息:SELECT*FROMstudents;(3)條件查詢。查詢students表中總學分大于或等于120的同學的情況:SELECT*FROMstudentsWHEREtotalscore>=120;(4)多重條件查詢。查詢students表中所在系為“計算機”且總學分大于或等于120的同學的情況:SELECT*FROMstudentsWHEREdepartment='計算機'ANDtotalscore>=120;數(shù)據(jù)庫與SQL基礎(5)使用LIKE謂詞進行模式匹配。查詢students表中姓“王”且單名的學生情況:SELECT*FROMstudentsWHEREnameLIKE'王_';(6)用BETWEEN...AND指定查詢范圍。查詢students表中不在1999年出生的學生情況:SELECT*FROMstudents WHEREbirthdayNOTBETWEEN'1999-1-1'AND'1999-12-31';(7)空值比較。查詢總學分尚不確定的學生情況:SELECT*FROMstudents WHEREtotalscoreISNULL;(8)自然連接查詢。查找計算機系學生姓名及其“C程序設計”課程的考試分數(shù)情況:SLELCTname,grade FROMstudents,courses,grades, WHEREdepartment='計算機'ANDcoursename='C程序設計' ANDstudents.studentid=grades.studentid ANDcourses.courseid=grades.coursesid;數(shù)據(jù)庫與SQL基礎(9)IN子查詢。查找選修了課程號為101的學生情況:SELECT*FROMstudents WHEREstudentidIN( SELECTstudentid FROMcourses,students,grades WHEREcourseid='101' ANDstudents.studentid=grades.studentid ANDcourses.courseid=grades.coursesid );在執(zhí)行包含子查詢的SELECT語句時,系統(tǒng)首先執(zhí)行子查詢,產(chǎn)生一個結果表,再執(zhí)行外查詢。本例中,首先執(zhí)行子查詢:SELECTstudentidFROMcourses,students,gradesWHEREcourseid='101' ANDstudents.studentid=grades.studentid ANDcourses.courseid=grades.coursesid數(shù)據(jù)庫與SQL基礎(10)比較子查詢。這種子查詢可以認為是IN子查詢的擴展,它是表達式的值與子查詢的結果進行比較運算。查找課程號206的成績不低于課程號101的最低成績的學生學號:SELECTstudentidFROMgrades WHEREcourseid='206'ANDgrade!<ANY( SELECTgradeFROMgrades WHEREcourseid='101' );(11)EXISTS子查詢。EXISTS謂詞用于測試子查詢的結果集是否為空表,若子查詢的結果集不為空,則EXISTS返回TRUE,否則返回FALSE。EXISTS還可與NOT結合使用,即NOTEXISTS,其返回值與EXISTS剛好相反。查找選修206號課程的學生姓名:SELECTnameFROMstudents WHEREEXISTS( SELECT*FROMgrades WHEREstudentid=students.studentidANDcourseid='206' );數(shù)據(jù)庫與SQL基礎(12)查找選修了全部課程(即沒有一門課程不選修)的同學姓名:SELECTnameFROMstudents WHERENOTEXISTS( SELECT*FROMcourses WHERENOTEXISTS( SELECT*FROMgrades WHEREstudentid=students.studentid ANDcourseid=courses.courseid ) );數(shù)據(jù)庫與SQL基礎(13)查詢結果分組。將各課程成績按學號分組:SELECTstudentid,gradeFROMgrades GROUPBYstudentid;(14)查詢結果排序。將計算機系的學生按出生時間先后排序:SELECT*FROMstudents WHEREdepartment='計算機' ORDERBYbirthday;數(shù)據(jù)庫與SQL基礎3.聚合函數(shù)在對表數(shù)據(jù)進行檢索時,經(jīng)常需要對結果進行匯總或計算,如在學生成績數(shù)據(jù)庫中求某門功課的總成績、統(tǒng)計各分數(shù)段的人數(shù)等,SQL中的聚合函數(shù)可用于這類計算,返回單個計算結果。常用的聚合函數(shù)見表。函

數(shù)

名說

明AVG求組中值的平均值COUNT求組中項數(shù),返回int類型整數(shù)MAX求最大值MIN求最小值SUM返回表達式中所有值的和VAR返回給定表達式中所有值的統(tǒng)計方差數(shù)據(jù)庫與SQL基礎本例對students表執(zhí)行查詢,使用常用的聚合函數(shù)。(1)求選修課程101的學生的平均成績:SELECTAVG(grade)AS'課程101平均成績' FROMgrades WHEREcourseid='101';(2)求選修課程101的學生的最高分和最低分:SELECTMAX(grade)AS'課程101最高分',MIN(grade)AS'課程101最低分' FROMgrades WHEREcourseid='101';(3)求學生的總人數(shù):SELECTCOUNT(*)AS'學生總數(shù)'FROMstudents;數(shù)據(jù)庫與SQL基礎4.插入INSERT語句INSERT語句可插入一條或多條記錄至一個表中,它有兩種語法形式。語法形式1:INSERTINTO表名|視圖名[IN外部數(shù)據(jù)庫名(含路徑)](字段列表){DEFAULTVALUES|VALUES(DEFAULT|表達式列表)}語法形式2:INSERTINTO表名|視圖名[IN外部數(shù)據(jù)庫名(含路徑)]字段列表{SELECT...|EXECUTE...}其中,第1種形式將一個記錄或記錄的部分字段插入表或視圖中,默認情況下需要插入字段值的表達式列表項的個數(shù)應與記錄的字段個數(shù)一致;若在語句中明確指定了字段列表,則應與字段列表的字段個數(shù)相一致。第2種形式的INSERT語句插入來自SELECT語句或來自使用EXECUTE語句執(zhí)行的存儲過程的結果集。例如,用以下語句向students表插入一條記錄:INSERTINTOstudents VALUES('170206','羅亮',0,'1/30/1998',1,150);數(shù)據(jù)庫與SQL基礎5.刪除DELETE語句DELETE語句用于從一個或多個表中刪除記錄,語法格式如下:DELETEFROM表名1[,表名2...][WHERE...]例如,用以下語句從students表中刪除姓名為“羅亮”的記錄:DELETEFROMstudentsWHEREname='羅亮';6.更新UPDATE語句UPDATE語句用于更新表中的記錄,語法格式如下:UPDATE表名SET字段1=表達式1[,字段2=表達式2...][FROM表名1|視圖1[,表名2|視圖2...]][WHERE...]其中,SET子句后列出的是需要更新的字段,等號后面是要更新字段的新值表達式。例如,以下語句將計算機系學生的總分增加10:UPDATEstudentsSETtotalscore=totalscore+10WHEREdepartment='計算機';02QtSql數(shù)據(jù)庫模塊1.驅(qū)動層2.SQL接口層3.用戶接口層QtSql數(shù)據(jù)庫模塊1.驅(qū)動層驅(qū)動層實現(xiàn)了特定數(shù)據(jù)庫與SQL接口的底層橋接,QtSql使用驅(qū)動插件(driverplugins)與不同的數(shù)據(jù)庫接口通信。由于QtSql的應用程序接口是與具體數(shù)據(jù)庫無關的,故所有與數(shù)據(jù)庫相關的代碼均包含在這些驅(qū)動插件中。目前,Qt支持的數(shù)據(jù)庫驅(qū)動插件見表。驅(qū)動插件數(shù)據(jù)庫管理系統(tǒng)QDB2IBMDB2及其以上版本QIBASEBorlandInterBaseQMYSQLMySQLQOCIOracleCallInterfaceDriverQODBCOpenDatabaseConnectivity(ODBC)包括MicrosoftSQLServer和其他ODBC兼容數(shù)據(jù)庫QPSQLPostgreSQL版本6.x和7.xQSQLITESQLite版本3及以上版本QSQLITE2SQLite版本2QTDSSybaseAdaptiveServerQtSql數(shù)據(jù)庫模塊2.SQL接口層該層是對下面驅(qū)動層的封裝,提供簡易的SQL操作接口。其中最常用的類有兩個:QSqlDatabase用于創(chuàng)建基礎的數(shù)據(jù)庫連接對象,設置連接參數(shù)。QSqlQuery此類是給那些習慣于使用SQL語法的用戶訪問數(shù)據(jù)庫用的,它提供了一個能直接執(zhí)行任意SQL語句的接口并且可以很方便地遍歷執(zhí)行語句所返回的結果集,編程時用戶所要做的僅僅是創(chuàng)建一個QSqlQuery類的對象,然后調(diào)用QSqlQuery::exec()函數(shù)即可。QtSql數(shù)據(jù)庫模塊3.用戶接口層該層是Qt專門為大多數(shù)習慣使用較高層數(shù)據(jù)庫接口以避免寫SQL語句的用戶準備的,提供了3個用于訪問數(shù)據(jù)庫的高層類,即QSqlQueryModel、QSqlTableModel和QSqlRelationalTableModel(見表),它們無須使用SQL語句就可以進行數(shù)據(jù)庫操作,而且可以很容易地將結果以表格形式表示。類

名用

途QSqlQueryModel基于任意SQL語句的只讀模型QSqlTableModel基于單個表的讀寫模型QSqlRelationalTableModelQSqlTableModel的子類,增加了外鍵支持這3個類均從QAbstractTableModel類繼承,在不涉及數(shù)據(jù)的圖形表示時可以單獨使用以進行數(shù)據(jù)庫操作,也可以作為數(shù)據(jù)源將數(shù)據(jù)庫內(nèi)的數(shù)據(jù)在QListView或QTableView等基于視圖模式的Qt類中表示出來。03操作SQLite實例

操作SQLite實例SQLite是一種進程內(nèi)數(shù)據(jù)庫,它小巧靈活,概括起來具有以下特點。(1)SQLite的設計目的是實現(xiàn)嵌入式SQL數(shù)據(jù)庫引擎,它基于純C語言代碼,已經(jīng)應用在非常廣泛的領域內(nèi)。(2)SQLite在需要持久存儲時可以直接讀寫硬盤上的數(shù)據(jù)文件,在無須持久存儲時也可以將整個數(shù)據(jù)庫置于內(nèi)存中,兩者均不需要額外的服務器端進程,即SQLite是無須獨立運行的數(shù)據(jù)庫引擎。(3)開放源代碼,整套代碼少于3萬行,有良好的注釋和90%以上的測試覆蓋率。(4)少于250KB的內(nèi)存占用容量(gcc編譯情況下)。(5)支持視圖、觸發(fā)器和事務,支持嵌套SQL功能。(6)提供虛擬機用于處理SQL語句。(7)不需要配置,不需要安裝,也不需要管理員。(8)支持大部分ANSISQL92標準。(9)大部分應用的速度比目前常見的客戶端/服務器結構的數(shù)據(jù)庫快。(10)編程接口簡單易用。

操作SQLite實例【例】(難度中等)(CH807)在基于控制臺的Qt程序中使用SQLite完成批量數(shù)據(jù)的增加、刪除、更新和查詢操作并輸出。操作步驟如下。(1)創(chuàng)建Qt控制臺項目、引入數(shù)據(jù)庫支持模塊項目名為QSQLiteEx,步驟同前,不再贅述。在項目的配置文件QSQLiteE中添加配置:QT+=sqlQT+=network(2)編寫程序在源文件main.cpp中編寫代碼如下。

操作SQLite實例(3)運行程序,輸出結果如圖。04操作MySQL實例1.安裝MySQL2.創(chuàng)建數(shù)據(jù)庫3.編譯MySQL驅(qū)動4.創(chuàng)建Qt項目5.創(chuàng)建界面6.編程訪問MySQL操作MySQL實例【例】(較難)(CH808)在MySQL中創(chuàng)建數(shù)據(jù)庫emarket,其中建立一個commodity表(商品表),結構如表,往其中錄入一些商品記錄。列

名類

型長

度允許空值說

明Namechar32否商品名稱InputPricedecimal6,2位小數(shù)否商品購入價格(進價)OutputPricedecimal6,2位小數(shù)否商品售出價格(單價)Amountint6否商品庫存量操作MySQL實例1.安裝MySQL從Oracle官網(wǎng)下載MySQL安裝包可執(zhí)行程序,雙擊啟動向?qū)?,按照向?qū)Ы缑嬷敢惭b;或者下載MySQL壓縮包,手動編寫配置文件,通過Windows命令行安裝MySQL服務。2.創(chuàng)建數(shù)據(jù)庫安裝好MySQL后,再安裝一個可視化操作工具(筆者用的是NavicatPremium),創(chuàng)建數(shù)據(jù)庫emarket,其中建立commodity表,錄入測試用商品記錄,如圖。操作MySQL實例3.編譯MySQL驅(qū)動(1)首先打開MySQL安裝目錄下的lib文件夾(筆者的是E:\MySQL8\lib),看到里面有兩個文件libmysql.dll和libmysql.lib,將它們復制到Qt的MinGW編譯器的bin目錄(筆者的是C:\Qt\5.15.2\mingw81_64\bin)下,如圖。操作MySQL實例(2)找到Qt安裝目錄下源代碼目錄中的mysql文件夾(筆者的路徑是C:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql,讀者請根據(jù)自己安裝的實際路徑尋找),進入此文件夾,可見其中有一個名為的Qt項目工程配置文件,如圖。操作MySQL實例以Windows記事本打開文件,修改其內(nèi)容如下(加黑處為需要修改添加的地方):TARGET=qsqlmysql

#添加MySQL的include路徑INCLUDEPATH+="E:\MySQL8\include"#添加MySQL的libmysql.lib路徑,為驅(qū)動的生成提供lib文件LIBS+="E:\MySQL8\lib\libmysql.lib"

HEADERS+=$$PWD/qsql_mysql_p.hSOURCES+=$$PWD/qsql_mysql.cpp$$PWD/main.cpp

#注釋掉這條語句#QMAKE_USE+=mysql

OTHER_FILES+=mysql.json

PLUGIN_CLASS_NAME=QMYSQLDriverPlugininclude(../qsqldriverbase.pri)

#生成dll驅(qū)動文件的目標地址,這里將地址設置在mysql下的lib文件夾中DESTDIR=C:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql\lib操作MySQL實例小知識:如果在Qt安裝目錄下找不到源代碼(Src)目錄,說明在安裝Qt的時候未選擇安裝源代碼包,可通過Qt維護向?qū)аa充安裝。操作方法:雙擊Qt安裝目錄(筆者是C:\Qt)下的MaintenanceTool.exe,啟動維護向?qū)?,在“選擇組件”界面上補充勾選所安裝Qt版本樹狀視圖下面的“Sources”節(jié)點,如圖,單擊“下一步”按鈕,按照向?qū)У闹敢_始安裝即可,安裝完成后就能在安裝目錄的Qt版本文件夾中看到Src目錄了。操作MySQL實例(3)啟動QtCreator,定位到mysql文件夾下,打開對應的Qt項目,選擇“構建”→“構建項目"mysql"”,會產(chǎn)生一些構建錯誤,可忽略不管它。(4)打開mysql文件夾,可看到其中多了個lib子文件夾,進入可看到編譯生成的3個文件,如圖。操作MySQL實例(5)復制MySQL驅(qū)動到Qt的sqldrivers文件夾中選中上面生成的qsqlmysql.dll和qsqlmysql.dll.debug驅(qū)動文件并復制,然后將其粘貼到Qt安裝目錄下的sqldrivers文件夾(筆者的路徑為C:\Qt\5.15.2\mingw81_64\plugins\sqldrivers,讀者請根據(jù)自己安裝Qt的實際路徑復制)下,如圖。操作MySQL實例4.創(chuàng)建Qt項目以“設計器(QtDesigne

溫馨提示

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

評論

0/150

提交評論