【问题标题】:Access Database - Auto INSERT\UPDATE - Qt4访问数据库 - 自动插入\更新 - Qt4
【发布时间】:2011-05-01 12:24:44
【问题描述】:

在使用 Qt4 制作的注册软件中,我打开一个 Access .mdb 数据库,使用用户提供的字段对其进行更新。

它目前有一个表clients,有六个字段:

 CustomerNumber, FullName, CNICNumber, ResidentialAddress, ResidentialPhoneNumber, MobileNumber 

其中CustomerNumber 是主键和数字,而所有其他都是文本。目前有一些记录。但是当尝试插入另一条具有相同CustomerNumber的记录时,出现错误:

QODBCResult::exec: 无法执行 声明:“[微软][ODBC微软 访问驱动程序] 你的改变 要求表没有 成功,因为他们会创造 索引中的重复值,主要 键或关系。更改数据 在一个或多个包含 重复数据,删除索引,或 重新定义索引以允许重复 条目并重试。”

"[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: 无法执行语句”

解决方法是什么,即当主键不存在时如何插入新记录,但用相同的主键更新现有记录?

【问题讨论】:

    标签: sql ms-access qt4


    【解决方案1】:

    您缺少空格。您正在执行的实际命令相当于

        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 注入的攻击。您需要小心清除所有字符串值(例如,将所有 ' 替换为 '')。

    【讨论】:

    • 实际上是用户输入的值导致了问题。我用了QSqlQuery::bindValue,它起作用了
    【解决方案2】:

    解决方法是什么,即如何 插入新记录时 主键不存在但更新 具有相同主键的现有记录?

    这被非正式地称为UPSERT。请参阅与 Access 相关的this answer

    【讨论】:

      【解决方案3】:
      query.exec("UPDATE clients"
      ...CNICNumber='"+cnic+"', ...
      

      我的猜测是 CNICNumber 不应该有单引号。

      ...CNICNumber="+cnic+", ...
      

      但如果不知道您的表结构,就无法确定。

      【讨论】:

        【解决方案4】:

        你可以试试:

        + " SET FullName='"+cname+ ...
        + " WHERE CustomerNumber="+cnumber+";");
        

        在第二排和第三排?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-17
          • 1970-01-01
          • 2018-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多