前面建立了一个名为testDB.db的SQLITE类型的数据库,并为之创建了一个名为Customers的表,在这个基础上,我们利用INSERT语句将数据插入到Customers表中。
前面已经介绍过了INSERT是用来插入或者添加行到数据库表的,插入可以用以下两种种方式:
把数据插入表中的最简单方法就是使用基本的INSERT语法,INSERT INTO
它要求指定表名和被插入到新行中的值,但这种语句高度依赖表中列的定义顺序,并不是很安全,更加安全的使用INSERT语句的方法(不看看起来更烦琐)如下:
QSqlQuery query;
QString mInsertStr = QString("INSERT INTO Customers("
"cust_id, "
"cust_name, "
"cust_address,"
" cust_city, "
"cust_state, "
"cust_zip, "
"cust_country, "
"cust_contact, "
"cust_email)"
"VALUES("
"'1000000001', "
"'Village Toys', "
"'200 Maple Lane', "
"'Detroit', "
"'MI', "
"'44444', "
"'USA', "
"'John Smith', "
"'[email protected]');");
query.prepare(mInsertStr);
if(!query.exec()){
qDebug()<<"query error :"<
上述例子在表名后的括号里给出了列名,在插入行时,SQLITE将用VALUES列表中的相应值填入列表中对应的项,这样的优点时即使表的结构改变,INSERT语句仍然能够正确工作。
上述例子是用纯命令是方式采用INSERT语句插入数据,qt给我们提供4种相对灵活的绑定VALUES的方法:
为方便简单说明,我们新建一个名为person的表,
void Widget::createTableNamedPerson()
{
if(db.open()){
QSqlQuery query;
QString createTable = QString("CREATE TABLE person(id int,forename char(10),surname char(10));");
query.prepare(createTable);
if(query.exec()){
qDebug()<<"create person success!";
}
}
db.close();
}
使用命名占位符的命名绑定
void Widget::insertDataViaNamedBinding()
{
if(db.open()){
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (:id, :forename, :surname)");
query.bindValue(":id", 1001);
query.bindValue(":forename", "Bart");
query.bindValue(":surname", "Simpson");
query.exec();
}
db.close();
}
使用命名占位符的位置绑定
void Widget::insertDataViaPositionalBinding()
{
if(db.open()){
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (:id, :forename, :surname)");
query.bindValue(0, 1002);
query.bindValue(1, "Lei");
query.bindValue(2, "Li");
query.exec();
}
db.close();
}
使用位置占位符绑定值(版本1)
void Widget::insertDataViaPositionalPlaceholdersV1()
{
if(db.open()){
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (?, ?, ?)");
query.bindValue(0, 1003);
query.bindValue(1, "Meimei");
query.bindValue(2, "Han");
query.exec();
}
db.close();
}
使用位置占位符绑定值(版本2)
void Widget::insertDataViaPositionalPlaceholdersV2()
{
if(db.open()){
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (?, ?, ?)");
query.addBindValue(1004);
query.addBindValue("Feng");
query.addBindValue("Li");
query.exec();
}
db.close();
}
用qt提供的上述四种绑定VALUES的方式都能够实现相同的插入数据功能,使用起来非常方便,用DB Browser for SQLITE工具查看person表,数据结构如下:
需要注意的是,使用INSERT语句,在表person后提供列名的同时,VALUES里面必须给出一个相对应的值,如果不这样,相应的行插入不成功,会有错误消息:QSqlError("", "Parameter count mismatch", "")。
使用INSERT语句,还可以省略列,这表示可以只给某些列提供值,其他列不提供值,但省略的列必须被定义为允许NULL值,否者相应的行插入不成功,将产生错误消息:QSqlError("19", "Unable to fetch row", "NOT NULL constraint failed: Customers.cust_id")。eg:只插入行的一部分。
void Widget::insertDataViaPositionalPlaceholdersV2()
{
if(db.open()){
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename) "
"VALUES (?, ?)");
query.addBindValue(1005);
query.addBindValue("Liang");
if(!query.exec()){
qDebug()<<"query error: "<
上述例子只插入person表中的id和forname两列,对应VALUES里面的值也是两个,实际效果如下: