Qt SQL学习笔记三:qt使用INSERT语句将数据插入表中
前面建立了一个名为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里面的值也是两个,实际效果如下:
阅读更多
- (八大方法、逐层深入,有你一定没见过的)使用INSERT语句向表中插入数据
- SQL语句(增、删、改、查)一、增:有4种方法1.使用insert插入单行数据:语法:insert
- 使用mybatis的insert语句插入数据的时候,获取插入数据的主键id
- (八大方法、逐层深入,有你一定没见过的)使用INSERT语句向表中插入数据
- SQL语言使用insert语句向数据库表格中插入或添加新的数据行
- 【SQL Server学习笔记】5:使用INSERT语句插入数据
- (八大方法、逐层深入,有你一定没见过的)使用INSERT语句向表中插入数据
- 使用insert 语句插入另一个表和几个传入数据时,写法:
- 如何快速生成Insert数据插入语句?
- 使用Bulk Insert插入大批量数据
- 用一条insert语句来插入多行数据
- PDO-使用预处理语句重复插入数据
- 用SQL语句向表格中插入数据INSERT
- 在Oracle使用sql语句中如何插入日期格式的数据
- 转://使用insert插入大量数据的总结
- 使用insert插入大量数据的总结
- sql server 小数据插入,根据表名生成insert 语句,求加固
- mysql 使用 insert ignore into和unique实现不插入重复数据功能
- MySQL 使用while语句向数据表中批量插入数据
- 使用REVERSE INDEX改善大规模数据插入【IMPROVE INSERT STATEMENT USING REVERSE INDEX】 推荐