PDA

View Full Version : i can't update database,



xiongxiongchuan
28th June 2010, 04:21
i can't update ,insert or edit the database ,someone help me pleaze





void WellDataManage::loadWellData(QString projectAddress)
{
QString address=projectAddress;
address+="//";
address+="Data";
address+="//";
address+="SystemData";
address+=".db3";

if (!QFile::exists(address))
{
QMessageBox::information(this,tr("Information"),tr("There is something wrong with the wells databases"),QMessageBox::Ok,QMessageBox::Ok);
}

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


welldatamodel = new QSqlRelationalTableModel;
welldatamodel->setTable("wells");
welldatamodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
welldatamodel->setSort(0,Qt::AscendingOrder);

//set Comobox model


wellTypeComoBox->setModel(welldatamodel);
wellTypeComoBox->setModelColumn(welldatamodel->fieldIndex("welltype"));

//set header name
welldatamodel->setHeaderData(0,Qt::Horizontal,tr("Name"));
welldatamodel->setHeaderData(1,Qt::Horizontal,tr("Group"));
welldatamodel->setHeaderData(2,Qt::Horizontal,tr("X"));
welldatamodel->setHeaderData(3,Qt::Horizontal,tr("Y"));
welldatamodel->setHeaderData(4,Qt::Horizontal,tr("Type"));
welldatamodel->setHeaderData(5,Qt::Horizontal,tr("Production"));
welldatamodel->setHeaderData(6,Qt::Horizontal,tr("Depth"));
welldatamodel->setHeaderData(7,Qt::Horizontal,tr("BeginDepth"));
welldatamodel->setHeaderData(8,Qt::Horizontal,tr("EndDepth"));
welldatamodel->setHeaderData(9,Qt::Horizontal,tr("Altitude"));


welldatamodel->select();
welldatamodel->removeColumn(0);

wellTableView->setModel(welldatamodel);
wellTableView->setSelectionBehavior(QAbstractItemView::SelectRows );
wellTableView->resizeRowsToContents();

// wellTableView->enabledChange(false);
// wellTableView->resizeColumnsToContents();
// wellTableView->horizontalHeader()->setStretchLastSection(true);


welldatamapper->setModel(welldatamodel);
//welldatamapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
welldatamapper->setItemDelegate(new QSqlRelationalDelegate(this));

welldatamapper->addMapping(wellNameEdit,0);
welldatamapper->addMapping(wellGroupEdit,1);
welldatamapper->addMapping(wellXPositionEdit,2);
welldatamapper->addMapping(wellYPositionEdit,3);

welldatamapper->addMapping(wellProductionEdit,5);
/*welldatamapper->addMapping(wellDepthEdit,6);*/
welldatamapper->addMapping(wellTypeComoBox,6);
welldatamapper->addMapping(wellBeginDepthEdit,7);
welldatamapper->addMapping(wellEndDepthEdit,8);
welldatamapper->addMapping(wellAltitudeEdit,9);

//create connect of the buttons
welldatamapper->toFirst();//初始化时选择选 择第一行
connect(firstAction,SIGNAL(triggered()),welldatama pper,SLOT(toFirst()));
connect(lastAction,SIGNAL(triggered()),welldatamap per,SLOT(toLast()));
connect(previousAction,SIGNAL(triggered()),welldat amapper,SLOT(toPrevious()));
connect(nextAction,SIGNAL(triggered()),welldatamap per,SLOT(toNext()));
connect(newAction,SIGNAL(triggered()),this,SLOT(ad dWellRecord()));
connect(deleteAction,SIGNAL(triggered()),this,SLOT (deleteWellRecord()));
connect(updateAction,SIGNAL(triggered()),this,SLOT (updateWellRecord()));


connect(wellTableView->selectionModel(),SIGNAL(currentRowChanged(QModelIn dex, QModelIndex)),welldatamapper,SLOT(setCurrentModelI ndex(QModelIndex) ));
connect(welldatamapper,SIGNAL(currentIndexChanged( int)),wellTableView,SLOT(selectRow (int)));
}

void WellDataManage::addWellRecord()
{

int row=welldatamapper->currentIndex();
welldatamapper->submit();
welldatamodel->insertRow(row);
welldatamapper->setCurrentIndex(row);


wellNameEdit->clear();
wellGroupEdit->clear();
wellXPositionEdit->clear();
wellYPositionEdit->clear();
wellBeginDepthEdit->clear();
wellEndDepthEdit->clear();
wellProductionEdit->clear();
wellTypeComoBox->clear();
wellNameEdit->setFocus();
}




void WellDataManage::deleteWellRecord()
{

int row=welldatamapper->currentIndex();
welldatamodel->removeRow(row);
welldatamapper->submit();
welldatamodel->submit();
//welldatamapper->setCurrentIndex(QMIN(row,welldatamodel->rowCount()-1));


}

void WellDataManage::updateWellRecord()
{
welldatamapper->submit();

//welldatamodel->submitAll();

}

daemonna
28th June 2010, 05:14
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(address);
db.open();

just lookin in sql examples... dont you need also

db.setHostName("bigblue");
db.setUserName("acarlson");
db.setPassword("1uTbSbAs");
bool ok = db.open();

??????

xiongxiongchuan
28th June 2010, 06:05
i can read the data from the database ,i just can't update it

saa7_go
28th June 2010, 09:09
If you set the edit strategy to QSqlTableModel::OnManualSubmit,



welldatamodel->setEditStrategy(QSqlTableModel::OnManualSubmit);


you must use QSqlTableModel::submitAll() or QSqlTableModel::revertAll().

xiongxiongchuan
28th June 2010, 09:25
i also use the
QSqlTableModel::submitAll() ,it still can't work ,i have tried.

xiongxiongchuan
29th June 2010, 09:52
can anyone help me ?

saa7_go
29th June 2010, 12:42
How do you create the database? When i use sqlite3 application (http://www.sqlite.org/sqlite-3_6_23_1.zip) to create database and tables, then open it with Qt, there are problems when updating the data, the data won't update when calling model->submitAll().

Then i try to create database and tables from Qt using QSqlQuery, inserting some records, updating some data. And it works fine. :)

xiongxiongchuan
29th June 2010, 14:44
i used the blow code to create the databases

QString address=projectAddress;
address+="//";
address+=projectName;
address+="//";
address+="Data";
address+="//";
address+="SystemData";
address+=".db3";

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

QSqlQuery query;
query.exec("CREATE TABLE [wells] ("
"[id] INTEGER PRIMARY KEY,"
"[wellnames] NVARCHAR, "
"[wellgroup] NVARCHAR,"
"[XPosition] DOUBLE, "
"[YPosition] DOUBLE,"
"[welltype] CHAR, "
"[production(m3)] DOUBLE,"
"[depth] DOUBLE, "
"[beginDetpth] DOUBLE, "
"[endDepth] CHAR,"
"[altitude] DOUBLE);");
db.close();
return true;