我收到此错误消息:
[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;
答案 0 :(得分:3)
您正在执行两次相同的SQL语句。首先使用ExecSQL
,然后使用Open
。您应该只使用 一个 ,具体取决于您的SQL语句是否实际返回任何结果。
在您的情况下,您编写了一个简单的INSERT
查询,因此ExecSQL
是正确的选择。请注意,如果您对此查询使用Open
(没有ExecSQL
),您仍会收到错误,因为“无法打开数据”(可以这么说)。
要强调规则:如果SQL语句返回数据,请使用Open
。这是一个例子,即使你的语句插入一行,你也会Open
。
LQuery.SQL.Text :=
'INSERT INTO Customer (CustId, CustomerName)'#13#10 +
'VALUES ('+QuotedStr(ACustId)+','#13#10 +
QuotedStr(ACustomerName)+');'#13#10 +
'SELECT CustId, CustomerName, DateAdded'#13#10 +
'WHERE CustId = '+QuotedStr(ACustId)
LQuery.Open;
如图所示,如果数据库分配了任何值(例如默认值,自动键,rowversion),您可能希望在插入后立即返回新行。如果情况确实如此,那么您应该使用Open
。
SIDE注意:我根据您的问题坚持使用动态查询。但是,通常建议使用参数化查询甚至存储过程。