#include <QtSql>
 QT += sql
 QSqlDatabase类实现了数据库连接的操作
 QSqlQuery类执行SQL语句
 QSqlRecord类封装数据库所有记录
 
 QSqlDatabase类
 
  -  QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");  
-  db.setHostName("localhost");      
-  db.setDatabaseName("scott");      
-  db.setUserName("stott");          
-  db.setPassword("tiger");          
-  db.open();            
-  db.close();           
  
 建立数据库文件
 
  -  QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  
-  db.setDatabaseName("database.db");  
-  if (!db.open())   
-  {  
-      qDebug("数据库不能打开");  
-  }  
-  return false;  
  
 
  -  QSqlQuery query;  
-  query.exec("create table student(id INTEGER PRIMARY KEY autoincrement,  
-              name nvarchar(20), age int)");   
-  query.exec("insert into student values(1,'小明', 14)");  
-  query.exec("insert into student values(2,'小王',15)");  
  
 
 QSqlQuery类
 
 插入值到数据库操作
 
 一、直接用SQL语句插入(参照上面)
 
 二、利用预处理方式插入(ORACLE语法和ODBC语法)
 
 适合插入多条记录,或者避免将值转换成字符串(即正确地转义),调用prepare()函数指定一个包含占位符的query,然后绑定要插入的值
 
 ORACLE语法
 
  -  QSqlQuery query;   
-  query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)");   
-  query.bindValue(":name", "小王");     
-  query.bindValue(":age", 11);   
-  query.exec();  
  
 
 ODBC语法
 
  -  QSqlQuery query;  
-  query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)");   
-  query.addBindValue("小王");     
-  query.bindValue(11);  
-  query.exec();  
  
 三、批量插入到数据库中
 
  -  QSqlQuery query;  
-  query.prepare(“insert into student values (?, ?)”);  
-  QVariantList names;  
-  names << "小王" << "小明" << "小张" << "小新";   
-  query.addBindValue(names);  
-  QVariantList ages;  
-  ages << 11 << 13 << 12 << 11;  
-  query.addBindValue(ages);  
-  if (!q.execBatch())   
-      qDebug() << q.lastError();  
  
 
 查询数据库操作
 
  -  QSqlQuery query;  
-  query.exec("SELECT * FROM t_STUDENT");   
-  while (query.next())  
-  {  
-      QString name = query.value(0).toString();   
-      int age = query.value(0).toInt();   
-        
-  }  
  
 
 seek(int n) :query指向结果集的第n条记录。指定当前的位置
 
 first() :query指向结果集的第一条记录。
 
 last() :query指向结果集的最后一条记录。
 
 next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。
 
 previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。
 
 record() :获得现在指向的记录。
 
 value(int n) :获得属性的值。其中n表示你查询的第n个属性
 
 int rowNum = query.at(); //获取query所指向的记录在结果集中的编号
 
 int fieldNo = query.record().indexOf(“name”); //返回"name"的列号
 
 int columnNum = query.record().count(); //获取每条记录中属性(即列)的个数
 
  
 
 事务操作
 
 操作函数:transaction(),commit()提交,rollback()回滚
 操作事务前,先判断该数据库是否支持事务操作。hasFeature是QSQLDriver类函数
 
  -  if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... }   
  
  插入一条记录,然后提交事务
 
  -  QSqlDatabase::database().transaction();  
-  QSqlQuery query;  
-  query.exec("SELECT id FROM T_STUDENT WHERE class=1");  
-  if (query.next())  
-  {  
-      query.exec("INSERT INTO T_STUDENT (id,name,age) VALUES (3,'小李',13)");  
-  }  
-  QSqlDatabase::database().commit();