【发布时间】:2014-01-30 20:02:13
【问题描述】:
我想在将数据发布到另一个名为“LOG”的表中之前检查两个值(“shift”和“date”)是否已经存在。 “班次”值由显示“班次”表 (UNITable1) 数据的网格中的选择确定,日期参数是 AdvOfficeStatusBar1.Panels[0].Text(它显示当前日期)。查询是这样的:
procedure TForm1.cxButton4Click(Sender: TObject);
begin
UniTransaction1.AddConnection(UniConnection1);
UNIquery2.Close;
UNIquery2.SQL.Clear;
UNIquery2.SQL.Add('INSERT INTO LOG (DATE,SHIFT,TASK,DONE) VALUES (:a1,:a2,:a3,:a4)');
UNIquery2.Prepare;
UniTransaction1.StartTransaction;
try
UNIQuery1.DisableControls;
UNIQuery1.First;
while Uniquery1.EOF = false do begin
UNIquery2.Params[0].asString := AdvOfficeStatusBar1.Panels[0].Text; //Current Date
UNIquery2.Params[1].asString := UniTable1.FieldByName('SHIFT').asString;// Which shift
UNIquery2.Params[2].asString := Uniquery1.FieldByName('TASK').asString;//many tasks
UNIquery2.Params[3].Value := Uniquery1.FieldByName('DONE').Value;// Checkbox
Uniquery1.Next; //get 'all' the values from UNIQuery1
UNIquery2.ExecSQL;
end;
UniTransaction1.Commit;
UNIQuery1.EnableControls;
finally
if UNIquery2.Connection.InTransaction then
UNIquery2.Connection.Rollback;
end;
end;
我怎样才能合并这个?如何重写此事务以检查现有记录???
已编辑:UNIQuery1 正在遍历我要插入的其他记录。
【问题讨论】:
-
如果你正确缩进你的代码格式,它会更容易理解。
-
如果你不能决定 else 应该去哪里,你显然没有理解你自己的代码应该如何工作。无论如何,如果分配给 UNIQuery2 的 Sql 正确地为班次选择了现有记录,那么在您调用 Open 之后,UNIQuery2.EOF 将立即为 false。你应该能够从那里弄清楚。要点:1)听从 Jerry Dodge 的建议,2)停止使用“With”结构——它会给你带来各种各样的麻烦。
-
我不确定您是否需要 QuotedString();你可能需要检查一下。
-
在建立连接到数据集之前调用 Prepare 是否正确?
-
@MartynA - 如果我没记错的话,查询必须遍历所有记录直到最后一条记录。如果它没有找到足够的记录,我会关闭它并继续使用新的 SQL。
标签: sqlite delphi delphi-xe4