欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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

最编程 2024-07-06 14:38:31
...

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

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

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

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

它要求指定表名和被插入到新行中的值,但这种语句高度依赖表中列的定义顺序,并不是很安全,更加安全的使用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', "
                                 "'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的表,

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

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

 

推荐阅读