㈠ QT如何實現Qsqltablemodel實時更新資料庫,並在tableview中實時顯示,
在QT的widget中用tableview顯示sqlite資料庫表中的內容。
假設有資料庫文件test.db,有表table(id integer, name nvarchar(20),age integer),且有數條數據。
首先用QTcreator創建一個基於Widget類的窗口,再拖一個tableview到widget中,保存,然後按照如下方法進行:
1.在widget.h中增添頭文件:QtSql/qsql.h、QtSql/QsqlDatabase、QtSql/QsqlQuery、QtSql/QsqlQueryModel
2.在.pro工程文件中添加:QT+=sql
3.在widget.cpp中widget的構造函數中添加如下代碼:
QsqDatabase db = QsqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");
if(!db.open())
{
//錯誤處理
}
static QSqlQueryModel *model = new QSqlQueryModel(ui->tableview);
model->setQuery(QString("select * from table"));
model->setHeaderData(0,Qt::Horizontal,QObject::tr("編號"));
model->setHeaderData(1,Qt::Horizontal,QObject::tr("姓名"));
model->setHeaderData(2,Qt::Horizontal,QObject::tr("年齡"));
ui->tableview->setModel(model);
db->close();
這樣之後,table表裡的內容就會顯示到tableview中了。
㈡ 怎樣在Qt下連接讀寫sqlite資料庫
這里以學生信息的錄入與讀取來作為演示,主要目的是演示資料庫的操作,至於數據的顯示等不在演示範圍內,請您自行研究。
首先,在Qt中建立一個圖形界面的程序項目。
然後,我們在命令行下用sqlite命令創建了資料庫 C:\StudentInfo\sutdentdata.db,並且建立了一個資料庫表student,該表有四個欄位ID、Name、Sex、Age,未向表中添加任何數據。
關於sqlite的簡單使用,可以參考我們的另一篇經驗。
1SQLite的簡單使用方法
在讀寫SQLite資料庫中,我們最主要用到的是QSqlDatabase類及QSqlQuery類,前者負責創建資料庫連接並打開資料庫,後者負責執行查詢操作。實際上前者也可以進行查詢操作並將結果返回給QSqlQuery對象,但是Qt並不建議這么做。
在幹活前,依然是先看看Assitant,這是培養獨立解決問題的一個好習慣。
好,下面給 錄入 按鈕的點擊事件編寫代碼。關於如何給按鈕的某一事件進行編碼,可以參考我們另一篇經驗。
首先在.pro文件中加上sql,然後別忘了#include <QSqlDatabase>以及#include <QSqlQuery>。
好了,下面在錄入按鈕的槽中加入如下代碼:
QSqlDatabase mydb=QSqlDatabase::addDatabase("QSQLITE","wconntosqlite");
mydb.setDatabaseName("c:\\StudentInfo\\studentdata.db");
if(mydb.open())
{
QSqlQuery query(mydb);
QString sqlstr="insert into student (ID,Name,Sex,Age) values ('"
+ui->le_id->text()+"','"
+ui->le_name->text()+"','"
+ui->le_sex->text()+"',"
+ui->le_age->text()+")";
bool isok=query.exec(sqlstr);
if(isok)
qDebug()<<"數據寫入成功";
}
上面我們先調用了QSqlDatabase的靜態函數addDatabase創建了一個名為wconntosqlite的連接。然後給其傳遞資料庫名稱。
如果資料庫打開成功,就創建一個關聯的QSqlQuery對象,最後由QSqlQuery來執行插入數據工作。
特別注意:QSqlQuery對象的創建必須在mydb open成功以後才行,否則會出錯。
我們來看看效果如何。
1c++怎麼做界面
我們接著來寫查詢按鈕的代碼,輸入以下代碼:
QSqlDatabase mydb=QSqlDatabase::addDatabase("QSQLITE","rconntosqlite");
mydb.setDatabaseName("c:\\StudentInfo\\studentdata.db");
if(mydb.open())
{
QSqlQuery query(mydb);
QString sqlstr="select * from student";
bool isok=query.exec(sqlstr);
if(isok)
qDebug()<<"數據讀取成功";
query.first();
QString result="學號:"+query.value(0).toString()+" "
+"姓名:"+query.value(1).toString()+" "
+"性別:"+query.value(2).toString()+" "
+"年齡:"+query.value(3).toString();
ui->lbl_query->setText(result);
}
與寫入數據基本差不多,這里需要特別注意的是query.first();。看看Assistant怎麼說的就知道了。原來,query對象在執行完查詢語句後,query的位置被置於一個不可用的位置,如果想從query中獲取數據,需要設置query到一個可用的記錄中才行。方法有好幾種,這里我們用了first()成員函數。
好,來看看運行結果。
可以看到軟體讀取的數據與控制台窗口的數據是一致的。
我們來總結下Qt操作SQLite資料庫的五步走法決:
第一步,建立一個連接:QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
第二步,關聯資料庫文件:db.setDatabaseName("這里你的資料庫文件路徑")
第三步,打開資料庫:db.open()
第四步,如果資料庫打開成功,就建立一個相關聯的QSqlQuery對象:QSqlQuery query(db)
㈢ 用qt怎麼備份Oracle資料庫
Qt 提供了 QtSql 模塊來提供平台獨立的基於 SQL 的資料庫操作。這里我們所說的「平台獨立」,既包括操作系統平台,有包括各個資料庫平台。另外,我們強調了「基於 SQL」,因為 NoSQL 資料庫至今沒有一個通用查詢方法,所以不可能提供一種通用的 NoSQL 資料庫的操作。Qt 的資料庫操作還可以很方便的與 model/view 架構進行整合。通常來說,我們對資料庫的操作更多地在於對資料庫表的操作,而這正是 model/view 架構的長項。
Qt 使用QSqlDatabase表示一個資料庫連接。更底層上,Qt 使用驅動(drivers)來與不同的資料庫 API 進行交互。Qt 桌面版本提供了如下幾種驅動:
驅動 資料庫
QDB2 IBM DB2 (7.1 或更新版本)
QIBASE Borland InterBase
QMYSQL MySQL
QOCI Oracle Call Interface Driver
QODBC Open Database Connectivity (ODBC) – Microsoft SQL Server 及其它兼容 ODBC 的資料庫
QPSQL PostgreSQL (7.3 或更新版本)
QSQLITE2 SQLite 2
QSQLITE SQLite 3
QSYMSQL 針對 Symbian 平台的SQLite 3
QTDS Sybase Adaptive Server (自 Qt 4.7 起廢除)
不過,由於受到協議的限制,Qt 開源版本並沒有提供上面所有驅動的二進製版本,而僅僅以源代碼的形式提供。通常,Qt 只默認搭載 QSqlite 驅動(這個驅動實際還包括 Sqlite 資料庫,也就是說,如果需要使用 Sqlite 的話,只需要該驅動即可)。我們可以選擇把這些驅動作為 Qt 的一部分進行編譯,也可以當作插件編譯。
如果習慣於使用 SQL 語句,我們可以選擇QSqlQuery類;如果只需要使用高層次的資料庫介面(不關心 SQL 語法),我們可以選擇QSqlTableModel和QSqlRelationalTableModel。我們只介紹QSqlQuery類的使用。
在使用時,我們可以通過
QSqlDatabase::drivers();
1
找到系統中所有可用的資料庫驅動的名字列表。我們只能使用出現在列表中的驅動。由於默認情況下,QtSql 是作為 Qt 的一個模塊提供的。為了使用有關資料庫的類,我們必須早 .pro 文件中添加這么一句:
QT += sql
1
這表示,我們的程序需要使用 Qt 的 core、gui 以及 sql 三個模塊。注意,如果需要同時使用 Qt4 和 Qt5 編譯程序,通常我們的 .pro 文件是這樣的:
QT += core gui sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
1
2
這兩句也很明確:Qt 需要載入 core、gui 和 sql 三個模塊,如果主板本大於 4,則再添加 widgets 模塊。
下面來看一個簡單的函數:
bool connect(const QString &dbName)
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
// db.setHostName("host");
// db.setDatabaseName("dbname");
// db.setUserName("username");
// db.setPassword("password");
db.setDatabaseName(dbName);
if (!db.open()) {
QMessageBox::critical(0, QObject::tr("Database Error"),
db.lastError().text());
return false;
}
return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我們使用connect()函數創建一個資料庫連接。我們使用QSqlDatabase::addDatabase()靜態函數完成這一請求,也就是創建了一個QSqlDatabase實例。注意,資料庫連接使用自己的名字進行區分,而不是資料庫的名字。例如,我們可以使用下面的語句:
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE", QString("con%1").arg(dbName));
1
此時,我們是使用addDatabase()函數的第二個參數來給這個資料庫連接一個名字。在這個例子中,用於區分這個資料庫連接的名字是QString(「conn%1」).arg(dbName),而不是 「QSQLITE」。這個參數是可選的,如果不指定,系統會給出一個默認的名字QSqlDatabase::defaultConnection,此時,Qt 會創建一個默認的連接。如果你給出的名字與已存在的名字相同,新的連接會替換掉已有的連接。通過這種設計,我們可以為一個資料庫建立多個連接。
我們這里使用的是 sqlite 資料庫,只需要指定資料庫名字即可。如果是資料庫伺服器,比如 MySQL,我們還需要指定主機名、埠號、用戶名和密碼,這些語句使用注釋進行了簡單的說明。
接下來我們調用了QSqlDatabase::open()函數,打開這個資料庫連接。通過檢查open()函數的返回值,我們可以判斷資料庫是不是正確打開。
QtSql 模塊中的類大多具有lastError()函數,用於檢查最新出現的錯誤。如果你發現資料庫操作有任何問題,應該使用這個函數進行錯誤的檢查。這一點我們也在上面的代碼中進行了體現。當然,這只是最簡單的實現,一般來說,更好的設計是,不要在資料庫操作中混雜界面代碼(並且將這個connect()函數放在一個專門的資料庫操作類中)。
接下來我們可以在main()函數中使用這個connect()函數:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (connect("demo.db")) {
QSqlQuery query;
if (!query.exec("CREATE TABLE student ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name VARCHAR,"
"age INT)")) {
QMessageBox::critical(0, QObject::tr("Database Error"),
query.lastError().text());
return 1;
}
} else {
return 1;
}
return a.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
main()函數中,我們調用這個connect()函數打開資料庫。如果打開成功,我們通過一個QSqlQuery實例執行了 SQL 語句,就是query.exec();。同樣,我們使用其lastError()函數檢查了執行結果是否正確。
注意這里的QSqlQuery實例的創建。我們並沒有指定是為哪一個資料庫連接創建查詢對象,此時,系統會使用默認的連接,也就是使用沒有第二個參數的addDatabase()函數創建的那個連接(其實就是名字為QSqlDatabase::defaultConnection的默認連接)。如果沒有這么一個連接,系統就會報錯。也就是說,如果沒有默認連接,我們在創建QSqlQuery對象時必須指明是哪一個QSqlDatabase對象,也就是addDatabase()的返回值。
我們還可以通過使用QSqlQuery::isActive()函數檢查語句執行正確與否。如果QSqlQuery對象是活動的,該函數返回 true。所謂「活動」,就是指該對象成功執行了exec()函數,但是還沒有完成。如果需要設置為不活動的,可以使用finish()或者clear()函數,或者直接釋放掉這個QSqlQuery對象。這里需要注意的是,如果存在一個活動的 SELECT 語句,某些資料庫系統不能成功完成connect()或者rollback()函數的調用。此時,我們必須首先將活動的 SELECT 語句設置成不活動的。
創建過資料庫表 student 之後,我們開始插入數據,然後將其獨取出來:
if (connect("demo.db")) {
QSqlQuery query;
query.prepare("INSERT INTO student (name, age) VALUES (?, ?)");
QVariantList names;
names << "Tom" << "Jack" << "Jane" << "Jerry";
query.addBindValue(names);
QVariantList ages;
ages << 20 << 23 << 22 << 25;
query.addBindValue(ages);
if (!query.execBatch()) {
QMessageBox::critical(0, QObject::tr("Database Error"),
query.lastError().text());
}
query.finish();
query.exec("SELECT name, age FROM student");
while (query.next()) {
QString name = query.value(0).toString();
int age = query.value(1).toInt();
qDebug() << name << ": " << age;
}
} else {
return 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
依舊連接到我們創建的 demo.db 資料庫。我們需要插入多條數據,此時可以使用QSqlQuery::exec()函數一條一條插入數據,但是這里我們選擇了另外一種方法:批量執行。首先,我們使用QSqlQuery::prepare()函數對這條 SQL 語句進行預處理,問號 ? 相當於佔位符,預示著以後我們可以使用實際數據替換這些位置。簡單說明一下,預處理是資料庫提供的一種特性,它會將 SQL 語句進行編譯,性能和安全性都要優於普通的 SQL 處理。在上面的代碼中,我們使用一個字元串列表 names 替換掉第一個問號的位置,一個整型列表 ages 替換掉第二個問號的位置,利用QSqlQuery::addBindValue()我們將實際數據綁定到這個預處理的 SQL 語句上。需要注意的是,names 和 ages 這兩個列表裡面的數據需要一一對應。然後我們調用QSqlQuery::execBatch()批量執行 SQL,之後結束該對象。這樣,插入操作便完成了。
另外說明一點,我們這里使用了 ODBC 風格的 ? 佔位符,同樣,我們也可以使用 Oracle 風格的佔位符:
query.prepare("INSERT INTO student (name, age) VALUES (:name, :age)");
1
此時,我們就需要使用
query.bindValue(":name", names);
query.bindValue(":age", ages);
1
2
進行綁定。Oracle 風格的綁定最大的好處是,綁定的名字和值很清晰,與順序無關。但是這里需要注意,bindValue()函數只能綁定一個位置。比如
query.prepare("INSERT INTO test (name1, name2) VALUES (:name, :name)");
// ...
query.bindValue(":name", name);
1
2
3
只能綁定第一個 :name 佔位符,不能綁定到第二個。
接下來我們依舊使用同一個查詢對象執行一個 SELECT 語句。如果存在查詢結果,QSqlQuery::next()會返回 true,直到到達結果最末,返回 false,說明遍歷結束。我們利用這一點,使用 while 循環即可遍歷查詢結果。使用QSqlQuery::value()函數即可按照 SELECT 語句的欄位順序獲取到對應的資料庫存儲的數據。
對於資料庫事務的操作,我們可以使用 QSqlDatabase::transaction() 開啟事務,QSqlDatabase::commit() 或者QSqlDatabase::rollback() 結束事務。使用QSqlDatabase::database()函數則可以根據名字獲取所需要的資料庫連接。
㈣ 如何用Qt創建資料庫
booldatabase::createDatabase()
{
QSqlQueryquery;//此處請查詢query的相關操作
qDebug()<<"Starttocreatetable...";
//createtable:User
query.exec("CREATETABLE[User]([userId]VARCHAR(40)NOTNULL,[username]VARCHAR(40)NOTNULL,[email]VARCHAR(40),[password]VARCHAR(40),[city]VARCHAR(20),PRIMARYKEY([userId]))");
//createtable:Connect
query.exec("CREATETABLE[Connect]([LeftUser]VARCHAR(40)NOTNULL,[RightUser]VARCHAR(40)NOTNULL,[relation]INTEGERDEFAULT'0'NULL,PRIMARYKEY([LeftUser],[RightUser]))");
if(query.lastError().isValid())
{
qDebug()<<query.lastError();
returnfalse;
}
else
{
qDebug()<<"Createdatabasesuccessfully.";
}
returntrue;
}
㈤ qt資料庫應用編程實驗,實現了哪些功能
大致只要知道以上例子就OK了。一般而言會將db變數作為全局變數或者數據成員,當需要訪問的時候就獲取一個query就可以了。
另外,要實現所提到的功能,要好好看看QString、QStringList,這兩玩意主要是臨時存放數據、分割數據等作用,另外,要看QFile、QDir、QFileInfo、QTextStream,這四個主要用來讀取文本數據。看看QVector或者QList等來存放讀出來的數據。
另外,要實現這玩意,SQL的語句不要求精通,但是基本的Create、Insert、Select、Delete等操作要准確無誤。否則出錯了QT是看不出來的。QT不會檢測SQL的准確性的。
再另外,在QT的編程中,C++和類都很重要,所以還是得看看。
㈥ qt怎樣創建資料庫以及資料庫的操作
QT創建和插入的操作代碼如下:
bool database::createDatabase()
{
QSqlQuery query; // 此處請查詢 query的相關操作
qDebug() << "Start to create table...";
//create table: User
query.exec("CREATE TABLE [User] ( [userId] VARCHAR(40) NOT NULL, [username] VARCHAR(40) NOT NULL, [email] VARCHAR(40), [password] VARCHAR(40), [city] VARCHAR(20), PRIMARY KEY([userId]) )"); // 一定注意不要拼寫錯誤,引號內是不提示拼寫錯誤的。
//create table: Connect
query.exec("CREATE TABLE [Connect] ( [LeftUser] VARCHAR(40) NOT NULL, [RightUser] VARCHAR(40) NOT NULL, [relation] INTEGER DEFAULT '0' NULL, PRIMARY KEY ([LeftUser], [RightUser]))");
if (query.lastError().isValid())
{
qDebug() << query.lastError();
return false;
}
else
{
qDebug() << "Create database successfully.";
}
return true;
}
插入操作
bool database::adser( User user )
{
if (!db.isOpen())
{
createconnection();
}
QSqlQuery query;
qDebug() << "start to insert data";
query.exec("INSERT INTO [User] ( userId, username, email, password, city) VALUES(?,?,?,?,?)");
QVariantList userId;
userId << user.getUserId();
query.addBindValue(userId);
QVariantList username;
username << user.getUserName();
query.addBindValue(username);
QVariantList email;
email << user.getEmail();
query.addBindValue(email);
QVariantList password;
password << user.getPassword();
query.addBindValue(password);
QVariantList city;
city << user.getCity();
query.addBindValue(city);
try
{
if (!query.execBatch())
{
qDebug() << query.lastQuery();
qDebug() << query.lastError();
return NULL;
}
}
catch(...)
{
QMessageBox::critical(0, "Add New Node error!",
"Unable to add a new Node!/n/n"
"Click Cancel to exit.", QMessageBox::Cancel);
}
if( !UpdateConnectTable(user.getUserId(),user.getUserId(),2))
{
QMessageBox::critical(0,"","Update table Connect error");
return NULL;
}
return true;
}
㈦ qt的資料庫實現是怎樣的
完整的代碼給你了:
data.h
#define DB_SALES_DRIVER "QMYSQL3"
#define DB_SALES_DBNAME "CAAS"
#define DB_SALES_USER "root"
#define DB_SALES_PASSWD ""
#define DB_SALES_HOST ""
main.cpp
#include <qapplication.h>
#include <qsqldatabase.h>
#include <qsqlquery.h>
#include <qsqlcursor.h>
#include <qtextedit.h>
#include <qstring.h>
#include <qtextcodec.h>
#include <qvbox.h>
#include "data.h"
#include <stdio.h>
#include <qpushbutton.h>
class MyQVBox : public QVBox
{
public:
MyQVBox( QWidget *parent=0, const char *name=0 );
//public slots:
// refValue(QSrting lzw);
};
MyQVBox::MyQVBox( QWidget *parent, const char *name )
: QVBox( parent, name )
{
QString Lzw("\n");
QSqlDatabase *defaultDB = QSqlDatabase::addDatabase(DB_SALES_DRIVER);
if ( defaultDB )
{
defaultDB->setDatabaseName( DB_SALES_DBNAME );
defaultDB->setUserName( DB_SALES_USER );
defaultDB->setPassword( DB_SALES_PASSWD );
defaultDB->setHostName( DB_SALES_HOST );
if ( defaultDB->open() )
{
//插入數據
QSqlQuery query("INSERT INTO test(ID,Name,Age) VALUES(1155, 'Ginger', 125);" );
//提取數據
QSqlCursor cur( "test" ); // 指定表/視圖名稱
cur.select(); // 我們將檢索每一條記錄
while ( cur.next() )
{
qDebug( cur.value( "ID" ).toString() + ": " +
cur.value( "Name" ).toString() + " " +
cur.value( "Age" ).toString() );
Lzw.append(cur.value( "ID" ).toString() + ": " +
cur.value( "Name" ).toString() + " " +
cur.value( "Age" ).toString()+"\n");
}
//qDebug(Lzw);
printf("aaaaaaa");
}
}
QString ustr = (QTextCodec::codecForLocale())->toUnicode(Lzw);
QString sstr = (QTextCodec::codecForLocale())->toUnicode("刷新");
QTextEdit *myEdit = new QTextEdit(this,0);
myEdit->setText(ustr);
QPushButton *quit = new QPushButton(sstr, this, "quit" );
connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
}
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
MyQVBox *mybox = new MyQVBox(0,0);
//mybox->setText(ustr);
app.setMainWidget(mybox);
mybox->show();
return app.exec();
}
㈧ 如何用QT實現本地資料庫上傳到伺服器
你本地的資料庫是在運行的吧,這個就最方便的。 你直接在本地打開 SQL Server Management Studio (mssql客戶端)同時連接本地及遠程資料庫。 選擇本地要同步的資料庫,任務--導出數據。。。然後直接就導入了遠程的資料庫了。 當然也可以生成sql腳本,然後再執行都 行。
㈨ 在Qt數據開發中,用來建立資料庫連接的類是什麼,用來提供SQL執行方法的類是什
using System; using System.Data.SqlClient; namespace _09_01 { class Class_09_01 { public static void Main(String[] args) { // 連接字元串,讀者可以根據自己情況設置不同的值 string strConn = "Initial Catalog=Northwind;Data Source=(local);User ID=sa;Password=sa"; // SqlConnection 對象 SqlConnection conn = new SqlConnection(); conn.ConnectionString = strConn; try { // 打開資料庫連接 conn.Open(); Console.WriteLine("成功連接到資料庫!"); Console.WriteLine("數據源:{0}", conn.DataSource); Console.WriteLine("資料庫名:{0}", conn.Database); Console.WriteLine("客戶端名:{0}", conn.WorkstationId); // 在用完了資料庫連接之後記得關閉! conn.Close(); } catch (Exception e) { Console.WriteLine("無法連接到資料庫!報告異常:"); Console.WriteLine(e.Message); } } } }