gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:16:24 25 4
gpt4 key购买 nike

正在关注 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com