c++ - QSqlQuery 插入完整结构而不是单个字段?

标签 c++ mysql qt qt5 qsqlquery

正在关注 QSqlQuery Class documentation可以在 MySQL 数据库中实现插入操作,即像这样:

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();

它有效。但它很脆弱,不是吗?如果数据库程序员更改了 MySQL 脚本中的列名,即 surnamelastname,那么当列名不匹配时,它将停止工作(因为名称是硬编码的)。

我想到的是改变整个机制,而不是插入单个字段,而是插入一个大对象(可能是由单个字段组成的结构)。然后,在数据库端,应将字段拆分回一组字段,即使用 View 或触发器。

我的方向是否正确?

我将感谢对这个问题的一般评论。

最佳答案

好吧,有办法,但是你必须确保表的结构和列的含义不会改变,并且你的查询有每一列的数据要插入。

首先,您必须选择有关您的表的所有信息:

SELECT c.column_name FROM information_schema.columns c 
WHERE c.table_name = 'some_table_name' 
ORDER BY c.ordinal_position ASC

其次,您的代码可以这样更改。我正在使用通用方法,这意味着您已经知道数据:

QList<QVariant> valuesList { QVariant(1), QVariant("Bart"), QVariant("Simpson") }; 
QList<QPair<QString, QVariant>> varList;
QSqlQuery query;
query.exec("SELECT @rownum := @rownum + 1 AS row_num, c.column_name 
            FROM information_schema.columns c, (SELECT @rownum := -1) r
            WHERE c.table_name = 'some_table_name' 
            ORDER BY c.ordinal_position ASC");
while(query.next())
    colList << QPair<QString, QString>(query.value(1).toString(), 
               valuesList.at(query.value(0).toInt()));

QString queryString = "INSERT INTO person (%1) "
                      "VALUES (%2)";

QString insertColsString;
QString bindColsString;

for(int i = 0; i < colList.size(); i++) {
    insertColsString += colList.at(i).first + ", ";
    bindColsString += ":" colList.at(i).first + ", ";
}

if(!insertColsString.isEmpty()) {
    insertColsString.chop(2);
    bindColsString.chop(2);
}

query.prepare(queryString.arg(insertColsString, bindColsString));

for(int i = 0; i < colList.size(); i++)
    query.bindValue(":" + colList.at(i).first, colList.at(i).second);

query.exec();

关于c++ - QSqlQuery 插入完整结构而不是单个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37095024/

相关文章:

qt - 安装 Qt Quick Components for Desktop 以与 Qt Creator 一起使用

c++ - 关闭 MainWindow 后 Qt 应用程序仍在运行

c++ - 如何强制 Eclipse 使用 g++ 而不是 gcc?

jquery - 如何在jsp中创建搜索文本框?

mysql - SQL 数据库 - 查询以生成医生 ID 及其姓名列表以及他们的预约次数?

php - 我将如何插入影响多个表的值?

c++ - QT - 拖放 - 在拖放位置的自定义场景上创建自定义图形对象

c++ - 为什么两个函数不会产生二义性?

c++ - 谷歌测试没有找到任何测试

c++ - 离开范围后如何保护局部变量的值?