qt4 数据库操作---------tableView

[cpp]  view plain copy
  1. //connection.h  
  2. #ifndef CONNECTION_H  
  3. #define CONNECTION_H  
  4. #include   
  5. #include   
  6. #include   
  7.   
  8. static bool createConnection()  
  9. {  
  10.     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  
  11.    // db.setDatabaseName(":memory:");  
  12.     db.setDatabaseName("/test1.db");  
  13.     if (!db.open()) {  
  14.         QMessageBox::critical(0, qApp->tr("Cannot open database"),  
  15.             qApp->tr("Unable to establish a database connection."  
  16.                      ), QMessageBox::Cancel);  
  17.         return false;  
  18.     }  
  19.   
  20.      QSqlQuery query;  
  21.      query.exec("create table student (id int primary key, name varchar(20))");  
  22.      //创建表student,如果student表已经存在则无动作  
  23.      query.exec("insert into student values(0, 'first')");  
  24.      query.exec("insert into student values(1, 'second')");  
  25.      query.exec("insert into student values(2, 'third')");  
  26.      query.exec("insert into student values(3, 'fourth')");  
  27.      query.exec("insert into student values(4, 'fifth')");  
  28.     return true;  
  29. }  
  30. #endif // CONNECTION_H  

[cpp]  view plain copy
  1. //main.cpp  
  2. #include   
  3. #include "mainwindow.h"  
  4. #include"connection.h"  
  5. #include  
  6.   
  7. int main(int argc, char *argv[])  
  8. {  
  9.     QApplication a(argc, argv);  
  10.     if (!createConnection())  
  11.         return 1;  
  12.   
  13.     MainWindow w;  
  14.     w.show();  
  15.   
  16.     return a.exec();  
  17. }  

[cpp]  view plain copy
  1. //mainwindow.cpp  
  2. void MainWindow::on_pushButton_clicked()  
  3. {  
  4.     QSqlQuery query;  
  5.     query.exec("select * from student");  
  6.     QString str;  
  7.     while(query.next())  
  8.     {  
  9.         qDebug() << query.value(0).toInt() << query.value(1).toString();  
  10.         str=str+"\n"+query.value(1).toString();  
  11.         ui->textEdit->setText(str);  
  12.     }  
  13.   
  14. }  


[cpp]  view plain copy
  1. void MainWindow::on_pushButton_2_clicked()  
  2. {  
  3.     QSqlQuery query;  
  4.      query.exec("select * from student");  
  5.      qDebug() << "exec next() :";  
  6.      if(query.next())  
  7.      //开始就先执行一次next()函数,那么query指向结果集的第一条记录  
  8.      {  
  9.          int rowNum = query.at();  
  10.          //获取query所指向的记录在结果集中的编号  
  11.          int columnNum = query.record().count();  
  12.          //获取每条记录中属性(即列)的个数  
  13.          int fieldNo = query.record().indexOf("name");  
  14.          //获取"name"属性所在列的编号,列从左向右编号,最左边的编号为0  
  15.          int id = query.value(0).toInt();  
  16.          //获取id属性的值,并转换为int型  
  17.         QString name = query.value(fieldNo).toString();  
  18.          //获取name属性的值  
  19.          qDebug() << "rowNum is : " << rowNum //将结果输出  
  20.                  << " id is : " << id  
  21.                  << " name is : " << name  
  22.                  << " columnNum is : " << columnNum;  
  23.      }  
  24.      qDebug() << "exec seek(2) :";  
  25.      if(query.seek(2))  
  26.      //定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0  
  27.      {  
  28.          qDebug() << "rowNum is : " << query.at()  
  29.                  << " id is : " << query.value(0).toInt()  
  30.                  << " name is : " << query.value(1).toString();  
  31.      }  
  32.      qDebug() << "exec last() :";  
  33.      if(query.last())  
  34.      //定位到结果集中最后一条记录  
  35.      {  
  36.          qDebug() << "rowNum is : " << query.at()  
  37.                  << " id is : " << query.value(0).toInt()  
  38.                  << " name is : " << query.value(1).toString();  
  39.      }  
  40. }  

当数据库已open,可进行如下操作
创建表
[cpp]  view plain copy
  1. query.exec("create table student (id int primary key, name varchar(20))");  
  2. //创建表student,如果student表已经存在则无动作  
  3. //有两个字段,id(兼任主键)和name  

添加记录
[cpp]  view plain copy
  1. //直接添加  
  2. query.exec("insert into student values(1, 'second')");  
  3. //在表中增加一条主键即id是1的记录,name字段是"second"  
  4. //如果id=1的记录已经存在,则无动作  
  5.   
  6. //使用变量添加  
  7. query.prepare("insert into student values (?, ?)");  
  8. query.bindValue(0, i);  
  9. query.bindValue(1, "sixth");  
  10. query.exec();  
  11.   
  12.   
  13. //或  
  14. query.prepare("insert into student (id, name) values (:id, :name)");  
  15. query.bindValue(0, i);  
  16. query.bindValue(1, "sixth");  
  17. query.exec();  
  18.   
  19.   
  20. //或  
  21.     query.prepare("insert into student (id, name) values (:id, :name)");  
  22.     query.addBindValue(i);  
  23.     query.addBindValue("sixth");  
  24.     query.exec();  

删除记录
[cpp]  view plain copy
  1. query.exec("delete from student where id = 1");  


查询记录
[cpp]  view plain copy
  1. //直接查询  
  2. query.exec("select name from student where id = 1");  
  3. query.exec("select name from student ");  
  4. query.exec("select * from student ");  
  5.   
  6.   
  7. //使用变量    
  8. query.prepare("select name from student where id = ?");            
  9. int id = ui->spinBox->value(); //从界面获取id的值            
  10. query.addBindValue(id); //将id值进行绑定          
  11. query.exec();  

更新记录
[cpp]  view plain copy
  1. //使用变量      
  2.     QSqlQuery query;  
  3.     query.prepare("update student set name = ? where id = ?");  
  4.     query.addBindValue(name);  
  5.     query.addBindValue(studentId);  
  6.     query.exec();  

http://www.yafeilinux.com/?p=82



************************************************************************************************************************************************************************************

二十五、Qt数据库(五)QSqlQueryModel

二十六、Qt数据库(六)QSqlTableModel

二十七、Qt数据库(七)QSqlRelationalTableModel


[cpp]  view plain copy
  1. //mainwindow.cpp  
  2. #include "mainwindow.h"  
  3. #include "ui_mainwindow.h"  
  4. #include  
  5. #include   
  6. #include   
  7. #include  
  8. #include   
  9. #include  
  10. #include "mysqlquerymodel.h"  
  11. #include   
  12. #include   
  13. #include  
  14. MainWindow::MainWindow(QWidget *parent) :  
  15.     QMainWindow(parent),  
  16.     ui(new Ui::MainWindow)  
  17. {  
  18.     ui->setupUi(this);  
  19. /* 
  20.     model = new QSqlTableModel(this); 
  21.     model->setTable("student"); 
  22.     model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
  23.     model->select(); //选取整个表的所有行 
  24.    // model->removeColumn(0); //不显示name属性列,如果这时添加记录,则该属性的值添加不上 
  25.     ui->tableView->setModel(model); 
  26.     //ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);   //使其不可编 
  27.     */  
  28.   
  29.     model = new QSqlRelationalTableModel(this);  
  30.       model->setEditStrategy(QSqlTableModel::OnFieldChange); //属性变化时写入数据库  
  31.       model->setTable("student");  
  32.       model->setRelation(2,QSqlRelation("course","id","name"));  
  33.       //将student表的第三个属性设为course表的id属性的外键,并将其显示为course表的name属性的值  
  34.       model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));  
  35.       model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));  
  36.       model->setHeaderData(2, Qt::Horizontal, QObject::tr("Course"));  
  37.       model->select();  
  38.       ui->tableView->setModel(model);  
  39.       ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));  
  40.   
  41. }  
  42.   
  43. MainWindow::~MainWindow()  
  44. {  
  45.     delete ui;  
  46. }  
  47.   
  48. void MainWindow::on_pushButton_clicked()  
  49. {  
  50.     QSqlQuery query;  
  51.     query.exec("select * from student");  
  52.     QString str;  
  53.     while(query.next())  
  54.     {  
  55.         qDebug() << query.value(0).toInt() << query.value(1).toString();  
  56.         str=str+"\n"+query.value(1).toString();  
  57.        // ui->lineEdit->setText(str);  
  58.         //ui->textEdit->setText(str);  
  59.     }  
  60.   
  61. }  
  62.   
  63. void MainWindow::on_pushButton_2_clicked()  
  64. {  
  65.     QSqlQuery query;  
  66.      query.exec("select * from student");  
  67.      qDebug() << "exec next() :";  
  68.      if(query.next())  
  69.      //开始就先执行一次next()函数,那么query指向结果集的第一条记录  
  70.      {  
  71.          int rowNum = query.at();  
  72.          //获取query所指向的记录在结果集中的编号  
  73.          int columnNum = query.record().count();  
  74.          //获取每条记录中属性(即列)的个数  
  75.          int fieldNo = query.record().indexOf("name");  
  76.          //获取"name"属性所在列的编号,列从左向右编号,最左边的编号为0  
  77.          int id = query.value(0).toInt();  
  78.          //获取id属性的值,并转换为int型  
  79.         QString name = query.value(fieldNo).toString();  
  80.          //获取name属性的值  
  81.          qDebug() << "rowNum is : " << rowNum //将结果输出  
  82.                  << " id is : " << id  
  83.                  << " name is : " << name  
  84.                  << " columnNum is : " << columnNum;  
  85.      }  
  86.      qDebug() << "exec seek(2) :";  
  87.      if(query.seek(2))  
  88.      //定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0  
  89.      {  
  90.          qDebug() << "rowNum is : " << query.at()  
  91.                  << " id is : " << query.value(0).toInt()  
  92.                  << " name is : " << query.value(1).toString();  
  93.      }  
  94.      qDebug() << "exec last() :";  
  95.      if(query.last())  
  96.      //定位到结果集中最后一条记录  
  97.      {  
  98.          qDebug() << "rowNum is : " << query.at()  
  99.                  << " id is : " << query.value(0).toInt()  
  100.                  << " name is : " << query.value(1).toString();  
  101.      }  
  102. }  
  103.   
  104. void MainWindow::on_pushButton_3_clicked()  
  105. {  
  106.     QSqlQuery query;  
  107.   
  108.     int i=210;  
  109.     while(i--){  
  110.         query.prepare("insert into student values (?, ?)");  
  111.         query.bindValue(0, i);  
  112.         query.bindValue(1, "sixth");  
  113.         query.exec();  
  114.   
  115.     }  
  116.   
  117.   
  118.     //下面输出最后一条记录  
  119.     query.exec("select * from student");  
  120.     query.last();  
  121.     int id = query.value(0).toInt();  
  122.     QString name = query.value(1).toString();  
  123.     qDebug() << id << name;  
  124. }  
  125.   
  126. void MainWindow::on_pushButton_4_clicked()  
  127. {         //  QSqlQuery query;  
  128.         // query.exec("insert into student values(69, '768')");  
  129.             QSqlQuery query;  
  130.             query.prepare("select name from student where id = ?");  
  131.             int id = ui->spinBox->value(); //从界面获取id的值  
  132.             query.addBindValue(id); //将id值进行绑定  
  133.             query.exec();  
  134.             query.next(); //指向第一条记录  
  135.             qDebug() << query.value(0).toString();  
  136.   
  137.   
  138. }  
  139.   
  140. void MainWindow::on_pushButton_5_clicked()  
  141. {  
  142.     QSqlQueryModel *model = new QSqlQueryModel;  
  143.      model->setQuery("select * from student");  
  144.      model->setHeaderData(0, Qt::Horizontal, tr("id"));  
  145.      model->setHeaderData(1, Qt::Horizontal, tr("name song"));  
  146.      QTableView *view = new QTableView;  
  147.      view->setWindowTitle("ggg"); //修改窗口标题  
  148.   
  149.      view->setModel(model);  
  150.      view->show();  
  151.   
  152.   
  153.      MySqlQueryModel *myModel = new MySqlQueryModel; //创建自己模型的对象  
  154.      myModel->setQuery("select * from student");  
  155.      myModel->setHeaderData(0, Qt::Horizontal, tr("id"));  
  156.      myModel->setHeaderData(1, Qt::Horizontal, tr("name"));  
  157.      QTableView *view1 = new QTableView;  
  158.      view1->setWindowTitle("mySqlQueryModel"); //修改窗口标题  
  159.      view1->setModel(myModel);  
  160.      view1->show();  
  161.   
  162.      int column = model->columnCount(); //获得列数  
  163.      int row = model->rowCount();    // 获得行数  
  164.      QSqlRecord record = model->record(1); //获得一条记录  
  165.      QModelIndex index = model->index(1,1);   //获得一条记录的一个属性的值  
  166.      qDebug() << "column num is:" << column << endl  
  167.                  << "row num is:" << row << endl  
  168.                  <<"the second record is:" << record << endl  
  169.                  << "the data of index(1,1) is:"<< index.data();  
  170.   
  171.   
  172. }  
  173.   
  174. void MainWindow::on_pushButton_6_clicked()  
  175. {  
  176.   
  177.   
  178.   
  179. }  
  180.   
  181. void MainWindow::on_pushButton_7_clicked()  
  182. {  
  183.     model->database().transaction(); //开始事务操作  
  184.     if (model->submitAll()) {  
  185.         model->database().commit(); //提交  
  186.     } else {  
  187.         model->database().rollback(); //回滚  
  188.         QMessageBox::warning(this, tr("tableModel"),  
  189.                                  tr("数据库错误: %1")  
  190.                              .arg(model->lastError().text()));  
  191.     }  
  192. }  
  193.   
  194. void MainWindow::on_pushButton_8_clicked()  
  195. {  
  196.      model->revertAll();  
  197. }  
  198.   
  199. void MainWindow::on_pushButton_9_clicked()  
  200. {  
  201.     QString str=ui->lineEdit->text();  
  202.   
  203.     model->setFilter(tr("name='%1'").arg(str));  
  204.     model->select();  
  205. }  
  206.   
  207. void MainWindow::on_pushButton_10_clicked()  
  208. {   model->setTable("student");  
  209.     model->select();  
  210. }  
  211.   
  212. void MainWindow::on_pushButton_11_clicked()  
  213. {  
  214.     model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列  
  215.     model->select();  
  216. }  
  217.   
  218. void MainWindow::on_pushButton_12_clicked()  
  219. {  
  220.     model->setSort(0,Qt::DescendingOrder); //id属性,即第0列,升序排列  
  221.     model->select();  
  222. }  
  223.   
  224. void MainWindow::on_pushButton_14_clicked()  
  225. {  
  226.     int curRow = ui->tableView->currentIndex().row();  
  227.     //获取选中的行  
  228.     model->removeRow(curRow);  
  229.     //删除该行  
  230.     int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定"  
  231.                                                            "删除当前行吗?"),  
  232.                          QMessageBox::Yes,QMessageBox::No);  
  233.     if(ok == QMessageBox::No)  
  234.     {  
  235.        model->revertAll(); //如果不删除,则撤销  
  236.     }  
  237.     else model->submitAll(); //否则提交,在数据库中删除该行  
  238. }  
  239.   
  240. void MainWindow::on_pushButton_13_clicked()  
  241. {  
  242.     int rowNum = model->rowCount(); //获得表的行数  
  243.     //int id = 10;  
  244.     model->insertRow(rowNum); //添加一行  
  245.     model->setData(model->index(rowNum,0),rowNum+1);  
  246.     model->setData(model->index(rowNum,1),"rowNum");  
  247.     //model->submitAll(); //可以直接提交  
  248. }  

最后的
model->setData(model->index(rowNum,0),rowNum+1);
此函数是给某条记录的某个字段赋值
参数1  model->index(rowNum,0)指定视图表格中的第rowNum行,从1开始,不是数据库的表第rowNum行,的字段0。
参数2  是实际要赋的值,上面的那个字段值指定为rowNum+1
比如,点击2次添加记录按钮

另外在add记录时,注意构造函数中手动提交和字段变化时自动提交的区别
model -> setEditStrategy ( QSqlTableModel :: OnManualSubmit );
model->setEditStrategy(QSqlTableModel::OnFieldChange);

你可能感兴趣的:(qt4 数据库操作---------tableView)