Qt操作Oracle


      很久以前寫過《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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM