【发布时间】:2015-02-25 15:14:38
【问题描述】:
我收到此错误消息:
[FireDAC][Phys][MySQL] 键“PRIMARY”的重复条目“1111”
尝试将数据插入数据库时。数据库中唯一的数据是一个主键为“0000”的元组,所以我知道主键不是另一个键的副本。数据已正确插入数据库,那么当主键不重复时,有什么方法可以阻止错误弹出?
我正在使用 Delphi XE7、MySQL 6.2、FDConnection 和 FDQuery。我的代码是:
FDQuery1.SQL.Clear;
FDQuery1.SQL.Add(
'Insert into Customer (' +
'CustID,' +
'Forename,' +
'Surname,' +
'Address,' +
'PostCode' +
') ' +
'Values (' +
QuotedStr(CustID) + ',' +
QuotedStr(Forename) + ',' +
QuotedStr(Surname) + ',' +
QuotedStr(Address) + ',' +
QuotedStr(Postcode) +
')'
);
FDQuery1.ExecSQL;
FDQuery1.Open;
【问题讨论】:
-
我怀疑
FDQuery1.Open;调用再次执行INSERT查询。为什么你有它?为什么不使用参数?如果您可以简单地分配Text,为什么还要使用Clear和Add,或者更好的是,准备语句并保持准备状态,只更改参数并调用ExecSQL? -
为什么要指定ID而不是依赖MySQL的自增特性?
-
摆脱
FDQuery1.Open工作谢谢 -
进一步澄清:
ExecSQL用于NOT 返回行集的 SQL 语句,例如INSERT、UPDATE或DELETE。Open用于DO 返回行集的查询,例如SELECT。将有 ZERO 个实例,其中两者都适用,而无需更改方法执行之间的 SQL。
标签: mysql delphi delphi-xe7 firedac