debug時把sql語句復制出來,在資料庫鏈接工具中(如plsql,navicat等)執行一次,可能是你的value中設置了非空欄位,也有可能是你的資料庫策略不允許插入空.
㈡ 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 能直接連sql2008嗎
1. 確定QT編譯時已經編譯了QtSql。(默認的qt5,都已經支持了,如下目錄:C:\Qt\Qt5.3.0\5.3\msvc2013_opengl\plugins\sqldrivers里有相應的驅動動態庫
也可以通過如下代碼測試qt5是否支持SqlServer
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include <QDebug>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers) //列出Qt5所有支持的資料庫類型
qDebug() << "\t" << driver;
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
qDebug() << "ODBC driver valid?" << db.isValid(); //true為支持
}
輸出結果如下:
"QSQLITE""QMYSQL""QMYSQL3""QODBC""QODBC3""QPSQL""QPSQL7"ODBC driver valid? true
2. 若是沒有編譯,可以手動編譯了qt的ODBC插件。
可以通過編譯qt的時候加上 configure -plugin-sql-odbc來保證,也可以單獨編譯qt安裝包里的~\src\plugins\sqldrivers\odbcqmake -t vclib odbc.pronmake (註:windows中為mingw32-make)編譯後,在~\plugins\sqldrivers\下應該有qsqlodbcd4.dll(debug)或qsqlodbc4.dll
此時,可以用下面的程序,測試一下你的QT目前支持哪些資料庫訪問。
二、連接SQLServer
要注意的就是連接資料庫時使用的資料庫名,sqlserver和sqlite、mysql等是不同的,並不是直接寫入資料庫名稱。 而是DSN名。 如果你已經設置好了DSN,可以直接輸入DSN名。 如果沒有,可以採用DSN連接字元串直接連接ODBC資料庫。
1、直接設定DSN的字元串連接資料庫,很簡單。
/**
*函數介紹:創建資料庫連接
*輸入參數:
*返回值:無
*/
bool DataAccess::createConnection()
{
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << "\t" << driver;
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
qDebug() << "ODBC driver valid?" << db.isValid();
// 注意,對於express版本資料庫, 一定要加\\sqlexpress這種後綴 SERVER=58.67.161.109\\sqlexpress
QString dsn = "DRIVER={SQL SERVER};SERVER=58.67.161.109;DATABASE=RDBS;UID=RDBS_USER;PWD=RDBS_USER_7010387;";
db.setHostName("58.67.161.109"); //資料庫伺服器,我這里不需要
//即使dsn中已經設置了UID和PASSWD,仍然需要執行setUserName和setPassword的步驟
//還要注意這里的用戶名要有創建表的許可權,不然創建下面的表student會不成功。
db.setDatabaseName(dsn); //資料庫名
db.setUserName("RDBS_USER");//登錄名,我再dsn里設置UID和PWD後,就不需要設置了
db.setPassword("RDBS_USER_7010387");//密碼,我再dsn里設置UID和PWD後,就不需要設置了
if(!db.open ())
{
QSqlError error = db.lastError();
QMessageBox::warning (0, "Warning", QString("Failed to open database!Error:%1").arg(error.text()));
returnfalse;
}
returntrue;
}
注意:連接資料庫時, 一直連不上報錯: ConnectionOpen (Invalid Instance()) , 連接無效, 結果發現微軟對express版本資料庫是有限制的, 在SERVER欄位添加\\sqlexpress這樣後綴, 連接OK。
2、手動設置ODBC數據源,然後制定DSN
控制面板->系統和安全->管理工具->數據源(ODBC)
代碼:
QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("testdsn");
db.setUserName("sa");
db.setPassword("scada");
三、下面是ODBC和OLEDB的連接字元串寫法:
1、ODBC連接字元串
//適合資料庫類型 連接方式
access "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"
dBase "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"
oracle "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"
MSSQL server "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;"
MS text "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"
Visual Foxpro "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"
MySQL "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"
SQLite "Driver={SQLite3 ODBC Driver};Database=D:\SQLite\*.db"
PostgreSQL "Driver={PostgreSQL ANSI};server=127.0.0.1;uid=admin;pwd=pass;database=databaseName"
2、OLEDB連接字元串
//適合的資料庫類型 連接方式
access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"
oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"
MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties'text;FMT=Delimited'"
㈣ 怎樣在Qt下連接讀寫sqlite資料庫
這里以學生信息的錄入與讀取來作為演示,主要目的是演示資料庫的操作,至於數據的顯示等不在演示範圍內,請您自行研究。
首先,在Qt中建立一個圖形界面的程序項目。
然後,我們在命令行下用sqlite命令創建了資料庫 C:\StudentInfo\sutdentdata.db,並且建立了一個資料庫表student,該表有四個欄位ID、Name、Sex、Age,未向表中添加任何數據。
關於sqlite的簡單使用,可以參考我們的另一篇經驗。
2SQLite的簡單使用方法
在讀寫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成功以後才行,否則會出錯。
我們來看看效果如何。
4c++怎麼做界面
我們接著來寫查詢按鈕的代碼,輸入以下代碼:
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)
第五步,執行SQL語句:query.exec("你的SQL語句字元串")
㈤ qt怎麼連接sqlserver
前提:
SQL Server里已經建立了相應的資料庫,有對應的表和數據。
步驟:
1. Qt里新建一個空工程,添加main.cpp文件。
2. 在工程文件(.pro文件)添加一行:QT += sql。
3. 該敲代碼了,代碼如下:
[cpp] view plain
#include <QtGui>
#include <QString>
#include <QTextCodec>
#include <QSqlDatabase>
#include <QtSql>
/*連接資料庫*/
void OpenDatabase()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName(QString("DRIVER={SQL SERVER};"
"SERVER=%1;"
"DATABASE=%2;"
"UID=%3;"
"PWD=%4;").arg("QIAN-PC")
.arg("StuManager")
.arg("sa")
.arg("123456"));
if (!db.open())
{
QMessageBox::warning(0, qApp->tr("Cannot open database"),
db.lastError().databaseText(), QMessageBox::Cancel);
}
else
{
qDebug()<<"Connect to Database Success!";
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
/*設置編碼格式*/
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
OpenDatabase();
QDialog *mainDialog = new QDialog;
QTableView *tableView = new QTableView;
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(tableView);
mainDialog->setLayout(layout);
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery(QObject::tr("select * from 教師"));
tableView->setModel(model);
mainDialog->adjustSize();
mainDialog->show();
return a.exec();
}
4. 看看運行結果吧。
參考網址:http://hhuayuan.blog.51cto.com/1630327/893415
㈥ qt如何調用sqlite資料庫
//自己設置連接名,不使用默認連接名
if(SdbSqlite.contains("Conn2sqlite"))
{
SdbSqlite=QSqlDatabase::database("Conn2sqlite");
}
else
{
SdbSqlite=QSqlDatabase::addDatabase(
"QSQLITE","Conn2sqlite");
}
SdbSqlite.setDatabaseName("FiveChess.database");//資料庫名稱
這是連接
if(SdbSqlite.open())
{
intRltRowNumber=0;//查詢出來的結果列數
QStringStrSql1=
QString("selectname,grade,integration,round,victory,defeat,rank"
"frommemberwhereaccount='%0'andpassword='%1';")
.arg(StrAcn,StrPsdOrNew);
QSqlQueryquery1(SdbSqlite);
query1.exec(StrSql1);
while(query1.next())
{
if(SdbSqlite.driver()->hasFeature(QSqlDriver::QuerySize))
{
//速度快
RltRowNumber=query1.size();
}
else
{
//速度很慢
//實際執行的是這個
query1.last();
RltRowNumber=query1.at()+1;
}
}
SdbSqlite.close();
}
這是查詢
㈦ Qt如何實現對SQLite的寫入與更新操作的,急!
點擊一下查看按鈕,會添加一條信息,在pc機上很容易實現了,但在Arm開飯板上,資料庫能打開但執行插入的操作的時候總是報錯,我把我能想到的可能都想到了,1,修改了一下資料庫的許可權,2,export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Trolltech/QtEmbedded-4.7.0-arm/plugins/sqldrivers
,sqlite庫的路徑也加上了,但運行結果是一樣的,錯誤提示不是打開資料庫失敗,就是動態庫超出鏈接隊列什麼的(英語不太好),總之不行。後來我決定採取比較二的選擇,在arm板linux系統上跑sqlite插件,後來還是以失敗告終(但得到了好多啟發,下片博文講),無奈我想到的辦法是整一個好的sqliteDemo
在板子上跑一下,執行sql語句的時候還是不行,報錯信息是打開資料庫失敗,無奈做了下一步決定,重燒了一下文件系統,和內核,結果還是不行,在崩潰的邊緣,向老大求教,搗鼓了一陣,結果把生成的可執行文件放到了根目錄下成功了!可以對資料庫進行各種操作,我把我自己寫的Qt
sqlite的小demo也放到了根目錄下結果也成功運行了,很奇怪呀!網上還有人說友善的arm板子對資料庫的支持不好。