QSqlQuery插入完整的结构,而不是单个字段
QSqlQuery insert full struct instead of individual fields?
根据QSqlQuery Class
文档,可以在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脚本中更改列名,即surname
到lastname
,当列名不匹配时,它将停止工作(因为名称是硬编码的)。
我想到的是改变整个机制,这样就不应该插入单个字段,而应该插入一个大对象(也许是由单个字段组成的结构)。然后,在数据库端,应该将字段拆分回一组字段,即使用视图或触发器。
我的方向对吗?
我将感谢对这个问题的一般性评论。
好吧,有一种方法,但您必须确保表的结构和列的含义不会改变,并且您的查询有每个列的数据要插入。
首先,您必须选择有关您的表格的所有信息:
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();
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- QSqlQuery插入完整的结构,而不是单个字段
- 如何在C++中从字节数组(在 BIG-ENDIAN 中)中提取单个字段
- 删除内存字段(数组)中的单个字节