数据库读写,生成树,操作异常,求教,付源代码

时间:2022-08-05 11:54:17
数据库读写,生成树,操作异常,求教,付源代码及数据库 
http://download.csdn.net/download/cibiren2011/10036058
头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>

#include <QtSql>
#include <QSqlTableModel>
#include <QStandardItemModel>
#include <QTableView>
#include <QTreeView>
#include <QStandardItem>
#include <QSqlQuery>
#include <QPushButton>

#include <QVBoxLayout>

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    Widget(QWidget *parent = 0);
    ~Widget();  
private:
    QTreeView *treeView;
    QTableView *tablev;
    QSqlDatabase db;
    QStandardItemModel *stdModel;
    QSqlTableModel *tableModel;

    QPushButton *btnAbout;
    QPushButton *btnDel;
    QPushButton *btnModfy;

    void addToModel(int pid,QStandardItem* pRoot);
    void writeToDB(QStandardItem* pRoot);
private slots:
    void About();
    void Del();
    void Modify();//更新数据库};

#endif // WIDGET_H


CPP文件:

#include "widget.h"
#include <QMessageBox>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
{

    //initData();
    db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=test.mdb");
    db.open();

    stdModel=new QStandardItemModel(this);
   // tableModel=new QSqlTableModel(this,db);
    treeView=new  QTreeView;
    //tablev=new QTableView ;

  //  tableModel->setTable("goods");
   // tableModel->select();
  //   tablev->setModel(tableModel);

    addToModel(0,stdModel->invisibleRootItem());
    treeView->setModel(stdModel);

    QVBoxLayout * layout=new QVBoxLayout ;
    QHBoxLayout *hlayout=new QHBoxLayout;
    btnAbout=new  QPushButton("aboutQt");
    btnDel=new  QPushButton("Delete");
    btnModfy=new  QPushButton("Modify");
    hlayout->addWidget(btnAbout);
    hlayout->addWidget(btnDel);
    hlayout->addWidget(btnModfy);

   // layout->addWidget(tablev);
    layout->addWidget(treeView);
    layout->addLayout(hlayout);
    setLayout(layout);

    connect(btnDel,SIGNAL(clicked()),this,SLOT(Del()));
    connect(btnModfy,SIGNAL(clicked()),this,SLOT(Modify()));
    connect(btnAbout,SIGNAL(clicked()),this,SLOT(About()));

    }

Widget::~Widget()
{
    
}


//把数据库中字段PID=pID的项添加到树上,递归函数
//参数 int pid  :父节点的ID
//QStandardItem* pParent :上级项节点
void Widget::addToModel(int pID,QStandardItem* pParent)
{
    QString qreryString=
            QString("SELECT  id,pid,goodname FROM goods where pid=%1 order by  id").arg(pID);

    QSqlQuery query(qreryString,db);
    while (query.next()) {
        //sqlRecord record;
        int id = query.value(0).toInt();
         int pid= query.value(1).toInt();
         QString name= query.value(2).toString();
         QVariant vid(id);
         QVariant vpid(pid);
         QVariant vname(name);
         QList<QVariant> itemdata;
         itemdata<<vid<<vpid<<vname;
        QStandardItem* item =new QStandardItem(name);
        item->setData(itemdata,Qt::UserRole+1);
        pParent->appendRow(item);
        addToModel(id, item);
    }
}

//递归函数,把模型里面的数据写到数据库里面
void Widget::writeToDB(QStandardItem*  item)
{
    if(item==0) return;
    if(item!=stdModel->invisibleRootItem()){

        QList<QVariant> itemdata =   item->data(Qt::UserRole+1).toList();

                QSqlQuery query(db);
        query.prepare("INSERT INTO goods (id, pid, goodname)"
                      "VALUES (?, ?, ?)");
        query.addBindValue(itemdata.at(0).toInt());
        query.addBindValue(itemdata.at(1).toInt());
        query.addBindValue(itemdata.at(2).toString());
        query.exec();
    }

    for(int i=0;i<item->rowCount();i++){
        writeToDB(item->takeChild(i));
    }


}

void Widget::About()
{
   QMessageBox::aboutQt(this);
}

void Widget::Del()
{
  QModelIndex index= treeView->currentIndex();
  stdModel->removeRow(index.row(), index.parent());

}

void Widget::Modify(){
    //清空数据库
    QSqlQuery query(db);
    query.exec("delete * from goods");
    //把模型里面的数据写到数据库里面
   QStandardItem * pRoot=stdModel->invisibleRootItem();
  writeToDB(pRoot);
}

4 个解决方案

#1


异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。

#2


引用 1 楼 qqwangfan 的回复:
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。

数据库里面是对的,调用下面这个函数后,
树视控件显示有问题,不知什么缘故。

void Widget::Modify(){     //清空数据库     QSqlQuery query(db);     query.exec("delete * from goods");     //把模型里面的数据写到数据库里面    QStandardItem * pRoot=stdModel->invisibleRootItem();   writeToDB(pRoot); } 

#3


引用 1 楼 qqwangfan 的回复:
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。


调用下面这个Modify()函数后,打开数据库查看,数据库里面数据是对的,
但是,树视控件没有文本了,显示有问题,不知什么缘故。
数据库读写,生成树,操作异常,求教,付源代码

void Widget::Modify(){    
 //清空数据库    
 QSqlQuery query(db);    
 query.exec("delete * from goods");     
 //把模型里面的数据写到数据库里面   
 QStandardItem * pRoot=stdModel->invisibleRootItem();   
 writeToDB(pRoot); 
 } 

#4


引用 1 楼 qqwangfan 的回复:
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。


Modify()函数只是修改了数据库里的数据,没有修改模型里的数据,为什么树控件里的文本都不见了?

#1


异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。

#2


引用 1 楼 qqwangfan 的回复:
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。

数据库里面是对的,调用下面这个函数后,
树视控件显示有问题,不知什么缘故。

void Widget::Modify(){     //清空数据库     QSqlQuery query(db);     query.exec("delete * from goods");     //把模型里面的数据写到数据库里面    QStandardItem * pRoot=stdModel->invisibleRootItem();   writeToDB(pRoot); } 

#3


引用 1 楼 qqwangfan 的回复:
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。


调用下面这个Modify()函数后,打开数据库查看,数据库里面数据是对的,
但是,树视控件没有文本了,显示有问题,不知什么缘故。
数据库读写,生成树,操作异常,求教,付源代码

void Widget::Modify(){    
 //清空数据库    
 QSqlQuery query(db);    
 query.exec("delete * from goods");     
 //把模型里面的数据写到数据库里面   
 QStandardItem * pRoot=stdModel->invisibleRootItem();   
 writeToDB(pRoot); 
 } 

#4


引用 1 楼 qqwangfan 的回复:
异常是指数据库操作异常?如果是查询操作异常可以使用QSqlError QSqlQuery::lastError() const获取到最近一次的错误。


Modify()函数只是修改了数据库里的数据,没有修改模型里的数据,为什么树控件里的文本都不见了?