在用Qt4制作的注册软件中,我打开一个Access .mdb数据库,用用户提供的字段更新它。
目前有一个包含六个字段的表clients
:
CustomerNumber, FullName, CNICNumber, ResidentialAddress, ResidentialPhoneNumber, MobileNumber
其中CustomerNumber
是主键和数字,而其他所有都是文本。有一些记录存在。但是当尝试插入具有相同CustomerNumber
的另一条记录时,会出现错误:
QODBCResult :: exec:无法执行 声明:“[Microsoft] [ODBC Microsoft 访问驱动程序]改变你 请求表不是 成功,因为他们会创造 索引中的重复值,primary 关键或关系。更改数据 在包含的字段或字段中 重复数据,删除索引,或 重新定义索引以允许重复 条目,然后再试一次。“
“[Microsoft] [ODBC Microsoft Access 驱动程序]您要求的更改 桌子没有成功,因为 他们会在中创建重复值 索引,主键或 关系。更改中的数据 字段或包含重复的字段 数据,删除索引或重新定义 允许重复输入的索引 然后再试一次。“”QODBC3:无法 执行声明“
然后我找到了UPDATE
查询,但以下代码给出了另一个错误:
query.exec("UPDATE clients"
"SET FullName='"+cname+"', CNICNumber='"+cnic+"', ResidentialAddress='"+caddress+"', ResidentialPhoneNumber='"+cphone+"', MobileNumber='"+cmobile+"'"
"WHERE CustomerNumber="+cnumber+";");
变量cname, cninc, caddresss, cphone, cmobile, cnumber
是带有值的字符串。但上述代码的错误是:
QODBCResult :: exec:无法执行 声明:“[Microsoft] [ODBC驱动程序 经理]功能序列错误“ “[Microsoft] [ODBC驱动程序管理器] 功能序列错误“”QODBC3: 无法执行语句“
这是什么解决方案,即如果主键不存在时如何插入新记录但是使用相同的主键更新现有记录?
答案 0 :(得分:4)
你缺少空格。您正在执行的实际命令等同于
query.exec("UPDATE clientsSET Fullname...
没有像clientsSET这样的表。
这是你的意图
query.exec("UPDATE clients"
" SET FullName='"+cname+"', CNICNumber='"+cnic+"', ResidentialAddress='"+caddress+"', ResidentialPhoneNumber='"+cphone+"', MobileNumber='"+cmobile+"'"
" WHERE CustomerNumber="+cnumber+";");
如果这些是用户输入值,则您很容易受到SQL注入攻击。您需要小心擦除所有字符串值(例如,将所有字符串替换为'')。
答案 1 :(得分:1)
这是什么解决方案,即如何 在插入新记录时 主键不存在但更新 具有相同主键的现有记录?
这被非正式地称为UPSERT
。请参阅与Access相关的this answer。
答案 2 :(得分:0)
query.exec("UPDATE clients"
...CNICNumber='"+cnic+"', ...
我的猜测是CNICNumber不应该有单引号。
...CNICNumber="+cnic+", ...
但如果不知道你的桌面结构,就无法确定。
答案 3 :(得分:0)
你可以尝试:
+ " SET FullName='"+cname+ ...
+ " WHERE CustomerNumber="+cnumber+";");
在第二和第三行?