6

sqliteデータベースに基づいてデータを保存するための中規模のアプリケーションを作成しています。データベースにデータを追加するためのダイアログを作成しました。データを保存する前に、入力されたデータが有効であることを確認するためにいくつかの条件をチェックします。それは単純なプロセスです。障害を簡単に見つけることができます。enyポイントでアプリケーションをクラッシュさせるのはエラーではないことを確認してください。また、アプリケーションはエラーなしでコンパイルされます。うまくいくこともありますが、ほとんどの場合、クラッシュして閉じます。

  1. 私の最初の質問は、なぜこのようなことが起こるのかということです。(うまく機能することもあれば、同じ状態でクラッシュすることもあります)。

  2. この種の状況で障害を見つける方法。単純に私がしていることは、ロジックを変更してコードを変更するために使用し、バイナリを変更してエラーを修正すると考えています。

    元:-

    if(query.exec()){
         //codes here.
     }
    

    このコードを次のように置き換えます

    bool ok=query.exec();
      if(ok){
           //code here....
     }
    

この状況で私を助けてください、私はenyのアドバイスに感謝します。 アプリケーションをクラッシュさせるnewMember.hとを追加します。newMember.cpp(これは私のnew memberダイアログのクラスです)。さらに多くのデータが必要な場合は、それらも追加することを教えてください。

エラーレポートでは、エラーシグニチャに記載されていますModName:qtgui4.dll , Offset: 000c14e6

newMember.h

       #ifndef NEWMEMBER_H
       #define NEWMEMBER_H

       #include "ui_newmember.h"


       class newMember : public QDialog, private Ui::newMember
       {
           Q_OBJECT

       private:
           QString path_1;
           QPixmap pic;

       public:
           newMember(QString str, QWidget *parent );


       public slots:
           void browse();
           void save_2();

      };

      #endif // NEWMEMBER_H

newMember.cpp

        #include "newmember.h"
        #include<QtGui>
        #include<QtSql/QSqlDatabase>
        #include <QSqlQuery>
        #include <QSqlError>

        newMember::newMember(QString str, QWidget *parent)
        {
              setupUi(this);
           lineEdit_7->setText(str);
           radioButton->setChecked(true); ;

           connect(pushButton,SIGNAL(clicked()),this,SLOT(browse()));
           connect(pushButton_2,SIGNAL(clicked()),this,SLOT(save_2()));
        }


        void newMember::browse(){
             path_1=QFileDialog::getOpenFileName(this,"choose an image for the new house", QString::null,"Image Files (*.jpg *.bmp)");
             pic.load(path_1);
             pic=pic.scaled(284,213,Qt::KeepAspectRatio, Qt::SmoothTransformation);
             label_14->setPixmap(pic);
        }

        QString input1(QString str){
             if(str=="")
                 return "-NA-";
              else
                return str;
        }


       void newMember::save_2(){
             QByteArray array;
             QBuffer buf(&array);
             buf.open( QIODevice::WriteOnly);
             pic.save(&buf,"jpg");

             QString mof;
             if(radioButton->isChecked())mof="male";
             if(radioButton_2->isChecked())mof="female";

             QString isgm="false";
             if(checkBox->isChecked())isgm="true";


            QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
            db.setDatabaseName("data");
            db.open();

            QSqlQuery query;
            query.exec("create table members(aname text, homeno text, namein text, fname text, onames text, nic text, sex text, bday text,gm text,occupation text,contactno text,qulification text,note text, img BLOB) ");

             if(lineEdit_8->text()==""){
             QMessageBox::about(this,"error","you should enter a name to identify this member \n within the specific house");
             return;
             }

             query.prepare("select aname from members where homeno=? and aname=?   ");
             query.bindValue(0,lineEdit_7->text());
             query.bindValue(1,lineEdit_8->text());
             query.exec();
             if(query.next()){
             QMessageBox::about(this, "error", "the name you entered to identify this member \n  is already available, please enter another one") ;
             return;
            }

              if(isgm=="true"){
                  query.prepare("select aname from members where homeno=? and gm=?");
                  query.bindValue(0,lineEdit_7->text());
                  query.bindValue(1,"true");
                  query.exec();
                      if(query.next()){
                          QMessageBox::about(this, "error", "there is a gruha mulikaya set already");
                         return;
                        }
                }


                 query.prepare("insert into members(aname, homeno , namein , fname , onames , nic , sex , bday ,gm ,occupation ,contactno ,qulification ,note ,img) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)     ");
                 query.bindValue(0,lineEdit_8->text());
                 query.bindValue(1,input1(lineEdit_7->text()));
                 query.bindValue(2,input1(lineEdit->text()));
                 query.bindValue(3,input1(lineEdit_2->text()));
                 query.bindValue(4,input1(lineEdit_3->text()));
                 query.bindValue(5,input1(lineEdit_4->text()));
                 query.bindValue(6,mof);
                 query.bindValue(7,dateEdit->date().toString("yyyy-MM-dd") );
                 query.bindValue(8,isgm);
                 query.bindValue(9,input1(lineEdit_5->text()));
                 query.bindValue(10,input1(lineEdit_6->text()));
                 query.bindValue(11,input1(textEdit->toPlainText()));
                 query.bindValue(12,input1(textEdit_2->toPlainText()));
                 query.bindValue(13,array);


                bool ok=query.exec();
                if(!ok){
                   QSqlError error;
                   error=query.lastError();
                   QMessageBox::about(this,"error",error.text()   );
                 }
                else{
                    QMessageBox::about(this,"message","data added successfully");
                    newMember::close();
                 }

              }
4

1 に答える 1

4
  1. デバッガーでアプリを実行してみてください。アプリがクラッシュするコードの場所が表示されます。あなたの場合、セグメンテーション違反である可能性があります。
  2. 戻り値をチェックしてみませんか?
于 2012-12-26T13:52:18.080 に答える