您的位置:首页 > 编程语言 > Qt开发

Qt SQL学习笔记三:qt使用INSERT语句将数据插入表中

2018-12-23 21:53 246 查看

前面建立了一个名为testDB.db的SQLITE类型的数据库,并为之创建了一个名为Customers的表,在这个基础上,我们利用INSERT语句将数据插入到Customers表中。

前面已经介绍过了INSERT是用来插入或者添加行到数据库表的,插入可以用以下两种种方式:

  • 插入完整的行;
  • 插入行的一部分;

把数据插入表中的最简单方法就是使用基本的INSERT语法,INSERT INTO <table_name> VALUES(value1, value2,…);

它要求指定表名和被插入到新行中的值,但这种语句高度依赖表中列的定义顺序,并不是很安全,更加安全的使用INSERT语句的方法(不看看起来更烦琐)如下:

[code]    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', "
"'sales@villagetoys.com');");
query.prepare(mInsertStr);
if(!query.exec()){
qDebug()<<"query error :"<<query.lastError();
}
else{
qDebug()<<"insert data success!";
}

上述例子在表名后的括号里给出了列名,在插入行时,SQLITE将用VALUES列表中的相应值填入列表中对应的项,这样的优点时即使表的结构改变,INSERT语句仍然能够正确工作。

上述例子是用纯命令是方式采用INSERT语句插入数据,qt给我们提供4种相对灵活的绑定VALUES的方法:

为方便简单说明,我们新建一个名为person的表,

[code]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();
}

使用命名占位符的命名绑定 

[code]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();
}

使用命名占位符的位置绑定 

[code]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)

[code]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)

[code]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:只插入行的一部分。

[code]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: "<<query.lastError();
}
}
db.close();
}

上述例子只插入person表中的id和forname两列,对应VALUES里面的值也是两个,实际效果如下:

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: