我收到此错误消息:
[FireDAC][Phys][MySQL] Duplicate entry ‘1111’ for key ‘PRIMARY’
尝试将数据插入数据库时.数据库中唯一的数据是主键为“ 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;
解决方法:
您要执行两次相同的SQL语句.首先使用ExecSQL,然后使用Open.您仅应使用一个或另一个,具体取决于您的SQL语句是否实际返回任何结果.
就您而言,您已经编写了一个简单的INSERT查询,因此ExecSQL是正确的选择.请注意,如果将Open与该查询一起使用(不使用ExecSQL),则仍然会收到错误消息,因为“没有数据可打开”(可以这么说).
要强调该规则:如果SQL语句返回数据,请使用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;
如图所示,如果数据库分配了任何值(例如默认值,自动键,行版本),则可能要在插入后立即返回新行.如果是这种情况,那么您应该使用Open.
SIDE NOTE: I’ve stuck with a dynamic query as per your question. However, it’s generally advisable to go with a parametrised query or even stored procedure.