很久以前寫過《Qt數據庫操作》的一篇文章,在操作數據庫的時候,溫習了一下!感覺很好!但在操作Oracle數據庫時又遇到了一些問題。在使用QSqlRelationalTableModel操縱表的時候,卻無法顯示。這里使用QT中自帶的例子$QTDIR\examples\sql\relationaltablemodel 加以修改說明。
首先編譯數據庫驅動,我這里使用的的是 Oracle 9i,數據庫名為 syabt,賬號 scott,密碼 tiger。在《Qt數據庫操作》中已經講解了編譯驅動方法,這里不再多說。
鏈接數據庫,代碼如下:
...
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("127.0.0.1");
db.setDatabaseName("syabt");
db.setUserName("scott");
db.setPassword("tiger");
if(!db.open())
...
貌似不用setHostName(),如果其他電腦上的數據庫setDatabaseName("syabt_192.168.1.100")即可。
這樣使用QSqlRelationalTableModel在QTableView中進行顯示的時候始終沒有數據。添加顯示錯誤信息,看看毛病在那里!
bool why = model->select();
if (why ==false)
{
QSqlError err =model->lastError();
QString str = err.text();
QMessageBox::critical(0, ("err"), str, QMessageBox::Cancel);
}
顯示錯誤提示:
ora-00942: 表或視圖不存在
QOCI: Unable to execute select statement
Google一下:
"ORA-00942: 表或視圖不存在 "的原因和解決方法
錯誤原因:在Oracle新建了一個表,名為“QueryHistory",用來保存用戶的查詢記錄,這時,再用"Select * from QueryHistory"來查詢,報 "ORA-00942: 表或視圖不存在 "
錯誤分析:oracle是大小寫敏感的,如果定義表名稱或列名稱的時候沒有用引號引起來的話 oracle會把他們全部轉換為大寫,這時就會出現錯誤了.
解決方法:將語句改為"Select * from "QueryHistory" 或是語句全部大寫
明白原因后,修改代碼全部代碼貼出,編譯運行就OK了!
#include <QtGui>
#include <QtSql>void initializeModel(QSqlRelationalTableModel *model)
{
model->setTable("EMPLOYEE");model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setRelation(2, QSqlRelation("CITY", "ID", "NAME"));
model->setRelation(3, QSqlRelation("COUNTRY", "ID", "NAME"));model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));bool why = model->select();
if (why ==false)
{
QSqlError err =model->lastError();
QString str = err.text();
QMessageBox::critical(0, ("err"), str, QMessageBox::Cancel);
}
}QTableView *createView(const QString &title, QSqlTableModel *model)
{
QTableView *view = new QTableView;
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view));
view->setWindowTitle(title);
return view;
}void createRelationalTables()
{
QSqlQuery query;
query.exec("create table employee(id int primary key, name varchar(20), city int, country int)");
query.exec("insert into employee values(1, 'Espen', 5000, 47)");
query.exec("insert into employee values(2, 'Harald', 80000, 49)");
query.exec("insert into employee values(3, 'Sam', 100, 1)");query.exec("create table city(id int, name varchar(20))");
query.exec("insert into city values(100, 'San Jose')");
query.exec("insert into city values(5000, 'Oslo')");
query.exec("insert into city values(80000, 'Munich')");query.exec("create table country(id int, name varchar(20))");
query.exec("insert into country values(1, 'USA')");
query.exec("insert into country values(47, 'Norway')");
query.exec("insert into country values(49, 'Germany')");
}int main(int argc, char *argv[])
{
QApplication app(argc, argv);QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("127.0.0.1");
db.setDatabaseName("syabt");
db.setUserName("scott");
db.setPassword("tiger");
if(!db.open())
return 1;
createRelationalTables();QSqlRelationalTableModel model;
initializeModel(&model);
QTableView *view = createView(QObject::tr("Relational Table Model"), &model);
view->show();return app.exec();
}
http://cool.worm.blog.163.com/blog/static/64339006200972832743495/
