我的数据库有问题。表结构为:
表名:salessale_id(自动增量)日期(datetime)总(十进制)等。
我有两台电脑,一台是"服务器"。另一个是"客户",当我插入"销售"时有时数据库保存超过1条记录,这是一个随机的问题,因为有一天可能是正常的,只保存1条记录,但其他一天可能保存2条或更多的重复。
我的代码是:qry1.SQL.Text := 'SELECT * FROM sales '
+ 'WHERE sale_id = 1';
qry1.Open;
qry1.Insert;
qry1.FieldByName('date').AsDateTime := Date;
qry1.FieldByName('total').AsFloat := total;
qry1.Post;
saleId := qry1.FieldByName('sale_id').AsInteger;
qry1.Close;
// Code to save sale details using saleId.
我正在使用Delphi 10.3 + ZeosLib 7.2.6-stable + MySQL 8.0
我打开了服务器的端口,所以我有一个直接连接到MySQL,我不知道会发生什么
希望你能帮助我
更新—谢谢你友好的回答,
@nbk是的,我已经做了。
@A Lombardo我使用了"where"获取1条记录,然后使用查询插入新记录类似于使用TTable,但不是加载孔表,而是获取一条记录,我可以插入(query。insert)
@TheSatinKnight不仅我得到两个记录,有时我得到3个或更多,但有可能是键盘工作不好,可以发送"enter">
@fpiette,我现在就做。
我将与你保持联系。有比打开TZTable并在打开的表上插入数据更好的方法来完成插入操作。
作为另一种方法,在您的表单上删除2 TZQuery(不是TZTable)(我假设是TForm1 -酌情更改)。
假设名称为ZQuery1和ZQuery2。
将其连接属性设置为与TZTable相同,因此它使用相同的连接器。
ZQuery1设置。SQL属性'Insert into sales (date, total) values (:pdate,:ptotal)'//(无引号)设置ZQuery2。SQL属性select last_insert_id() as iddb
现在将下面的函数添加到表单的私有声明
TForm1 = class(TForm)
ZQuery1: TZQuery; //added when dropped on form
ZQuery2: TZQuery;
private
{ Private declarations }
function AddNewSale(SaleDate: TDateTime; Total: Double): Integer; //add this line
public
{ Public declarations }
end;
,然后将以下代码添加到表单的方法
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.AddNewSale(SaleDate: TDateTime; Total: Double): Integer;
begin
ZQuery1.ParamByName('pdate').AsDateTime := SaleDate;
ZQuery1.ParamByName('ptotal').AsFloat := Total;
ZQuery1.ExecSQL; //*Execute* the Insert - Only "open" SQL that returns a result set
//now the record has been added to your DB
if ZQuery1.RowsAffected = 1 then //check to ensure it was inserted
begin
ZQuery2.Open;
try
Result := ZQuery2.FieldByName('iddb').AsInteger;
finally
ZQuery2.Close;
end;
end
else
result := -1;//indicate error by returning negative value
end;
现在在您想要插入记录的地方,只需调用这个函数:
var
ReturnValue: Integer;
begin
ReturnValue := AddNewSale(Date, total);
if ReturnValue < 0 then
//error happened
else
begin
//Everything worked
end;
end;
再次感谢您的友好回答。
最后的问题是键盘,它有一个问题,输入"键,所以当你按下它时,它会发送不止一个脉冲所以@ thesatinknight你的方法是正确的
@fpiette我创建了日志文件,我发现请求已经执行了两次或两次以上。
我知道对于程序员来说这可能是一件愚蠢的事情,因为我太晚禁用了按钮,对不起
@A Lombardo谢谢你的代码,我喜欢它比我的更好,我会使用它