您的位置:首页 > 数据库 > Oracle

Qt操作Oracle

2017-01-04 23:54 399 查看
很久以前写过《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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: