• 8842阅读
  • 15回复

qt数据库。 [复制链接]

上一主题 下一主题
离线daisyyu419
 
只看楼主 倒序阅读 楼主  发表于: 2006-09-06
用qt3编写一个数据库查询程序,该数据库对应一个table,编译已经通过,生成了一个database的执行文件,但是在命令行输入./database执行时没有弹出相应的表格,而是提示出现段错误,不知道这是哪里的问题,大家能给个提示不?
[ 此贴被XChinux在2006-09-07 08:50重新编辑 ]
离线daisyyu419
只看该作者 1楼 发表于: 2006-09-06
没有人帮忙么?
离线narnialei
只看该作者 2楼 发表于: 2006-09-07
可能是表的列数和查出的列数不一致
离线daisyyu419
只看该作者 3楼 发表于: 2006-09-08
列数是一致的,不知道为什么就是不能执行。
离线daisyyu419
只看该作者 4楼 发表于: 2006-09-08
我还是把程序贴出来给大家看吧。在做这个程序之前,我先用MYSQL生成了一个ARTIST的database然后又建了一个table名为artist,
CREATE TABLE artist (   id INTEGER PRIMARY KEY, name VARCHAR(40) NOT NULL, country VARCHAR(40));
离线daisyyu419
只看该作者 5楼 发表于: 2006-09-08
之后连接数据库
connection.cpp:


#include <qapplication.h>
#include <qsqldatabase.h>
#include <qmessagebox.h>
#include "connection.h"
#include "artistform.h"

//bool createConnections();

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  if (!createConnections())
   return 1;
    ArtistForm artistForm;  
    app.setMainWidget(&artistForm);
//   artistForm.resize(480, 320);
    artistForm.show();
    return app.exec();
}

bool createConnections()
{
  QSqlDatabase *db = QSqlDatabase::addDatabase(DB_SJK_DRIVER);
  db->setHostName(DB_SJK_HOST);
  db->setDatabaseName(DB_SJK_DBNAME);
  db->setUserName(DB_SJK_USER);
  db->setPassword(DB_SJK_PASSWD);
  if( !db->open() )
  {
   QMessageBox::critical(0, QObject::tr("Database Error"),
              db->lastError().text());
   return false;
  }
  return true;
}
离线daisyyu419
只看该作者 6楼 发表于: 2006-09-08
artistform.cpp:

#include <qdialog.h>
#include <qsqldatabase.h>
#include <qsqlcursor.h>
#include <qdatatable.h>
#include <qpushbutton.h>
#include <qsqlrecord.h>
#include <qlayout.h>
#include <qsqlquery.h>
#include <qstring.h>

#include "artistform.h"
//#include "connection.h"
#include "generateid.h"

ArtistForm :: ArtistForm(QWidget *parent, const char *name) : QDialog(parent, name)
{
  setCaption(tr("Update Artists"));
 
  db = QSqlDatabase::database("ARTIST");
  db->transaction();
 
  QSqlCursor *artistCursor = new QSqlCursor("artist", true, db);
  artistTable = new QDataTable(artistCursor, false, this);
  artistTable->addColumn("name", tr("Name"));
  artistTable->addColumn("country", tr("Country"));
  artistTable->setAutoDelete(true);
  artistTable->setConfirmDelete(true);
  artistTable->refresh();
 
  updateButton = new QPushButton(tr("Update"), this);
  updateButton->setDefault(true);
  cancelButton = new QPushButton(tr("Cancel"), this);
 
  connect(artistTable, SIGNAL(beforeDelete(QSqlRecord *)), this, SLOT(beforeDeleteArtist(QSqlRecord *)));
  connect(artistTable, SIGNAL(primeInsert(QSqlRecord *)), this, SLOT(primeInsertArtist(QSqlRecord *)));
  connect(artistTable, SIGNAL(beforeInsert(QSqlRecord *)), this, SLOT(beforeInsertArtist(QSqlRecord *)));
  connect(updateButton, SIGNAL(clicked()), this, SLOT(accept()));
  connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
 
  QHBoxLayout *buttonLayout = new QHBoxLayout;    
  buttonLayout->addStretch(1);
  buttonLayout->addWidget(updateButton);
  buttonLayout->addWidget(cancelButton);
 
  QVBoxLayout *mainLayout = new QVBoxLayout(this);
  mainLayout->setMargin(11);
  mainLayout->setSpacing(6);
  mainLayout->addWidget(artistTable);
  mainLayout->addLayout(buttonLayout);
}

void ArtistForm::accept()
{
  db->commit();
  QDialog::accept();
}

void ArtistForm::reject()
{
  db->rollback();
  QDialog::reject();
}

void ArtistForm::beforeDeleteArtist(QSqlRecord *buffer)
{
  QSqlQuery query(db);
  query.exec("DELETE FROM track WHERE track.id IN "
          "(SELECT track.id FROM track, cd "
          "WHERE track.cdid = cd.id AND cd.artistid = "
          + buffer->value("id").toString() + ")");
  query.exec("DELETE FROM cd WHERE artistid = "
          + buffer->value("id").toString());
}

void ArtistForm::primeInsertArtist(QSqlRecord *buffer)
{
  buffer->setValue("country", "USA");
}

void ArtistForm::beforeInsertArtist(QSqlRecord *buffer)
{
  buffer->setValue("id", generateId("artist", db));
}
离线daisyyu419
只看该作者 7楼 发表于: 2006-09-08
artistform.cpp生成了一个‘updataartist’的表单
离线daisyyu419
只看该作者 8楼 发表于: 2006-09-08
头文件我都没有贴出来,其中的generateId函数作为内联函数,我放到另外一个头文件中定义了 。
离线daisyyu419
只看该作者 9楼 发表于: 2006-09-08
g++ -c -pipe -Wall -W -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/lib/qt-3.3/mkspecs/default -I. -I/usr/lib/qt-3.3/include -I.ui/ -I.moc/ -o .obj/connection.o connection.cpp
/usr/lib/qt-3.3/include/qsqldatabase.h:63: 警告:‘class QSqlDriverCreatorBase’ 有虚函数却没有虚析构函数
g++ -c -pipe -Wall -W -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/lib/qt-3.3/mkspecs/default -I. -I/usr/lib/qt-3.3/include -I.ui/ -I.moc/ -o .obj/artistform.o artistform.cpp
/usr/lib/qt-3.3/include/qsqldatabase.h:63: 警告:‘class QSqlDriverCreatorBase’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/bin/moc artistform.h -o .moc/moc_artistform.cpp
g++ -c -pipe -Wall -W -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/lib/qt-3.3/mkspecs/default -I. -I/usr/lib/qt-3.3/include -I.ui/ -I.moc/ -o .obj/moc_artistform.o .moc/moc_artistform.cpp
/usr/lib/qt-3.3/include/qsqldatabase.h:63: 警告:‘class QSqlDriverCreatorBase’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:69: 警告:‘struct QUBuffer’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:77: 警告:‘struct QUType’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:104: 警告:‘struct QUType_Null’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:287: 警告:‘struct QUType_enum’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:307: 警告:‘struct QUType_ptr’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:326: 警告:‘struct QUType_iface’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:345: 警告:‘struct QUType_idisp’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:364: 警告:‘struct QUType_bool’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:383: 警告:‘struct QUType_int’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:403: 警告:‘struct QUType_double’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:423: 警告:‘struct QUType_charstar’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucom_p.h:444: 警告:‘struct QUType_QString’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucomextra_p.h:65: 警告:‘struct QUType_QVariant’ 有虚函数却没有虚析构函数
/usr/lib/qt-3.3/include/private/qucomextra_p.h:87: 警告:‘struct QUType_varptr’ 有虚函数却没有虚析构函数
g++ -o database .obj/connection.o .obj/artistform.o .obj/moc_artistform.o   -L/usr/lib/qt-3.3/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
离线daisyyu419
只看该作者 10楼 发表于: 2006-09-08
以上是编译过程。没有出错,可是有一堆警告。执行‘ ./database’时,提示出现段错误
离线daisyyu419
只看该作者 11楼 发表于: 2006-09-08
找了好久,也不知道哪里错了,高手们,帮我看看啊
离线daisyyu419
只看该作者 12楼 发表于: 2006-09-08
这其实是C++ GUI Programming with Qt 3中database中的一个例子,可就是实现不了。不知有人看过没有?
离线daisyyu419
只看该作者 13楼 发表于: 2006-09-09
大家能告诉我问题出在哪里吗?
离线daisyyu419
只看该作者 14楼 发表于: 2006-09-11
大家帮我看看第一页最后的错误信息吧,会不会是库文件的问题
离线yeguoxiong

只看该作者 15楼 发表于: 2008-06-17
PRIMARY KEY    在QT中不能使用这个关键字!  你去掉试试

还有就是,你要在Window下设置链接,有点像ASP 和数据库链接一样!
快速回复
限100 字节
 
上一个 下一个