检查数据库表中的某些值是否已存在

时间:2014-01-30 20:02:13

标签: sqlite delphi delphi-xe4

我想在向数据发布之前检查另一个名为“LOG”的表中是否存在两个值('shift'和'date')。 'shift'值由网格中的选择确定,该选择显示来自“shift”表(UNITable1)的数据,而date参数是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正在迭代我想插入的其他记录。

1 个答案:

答案 0 :(得分:0)

我不使用你所指的任何组件(我不知道UNIQuery2UNITransaction可能是什么,但你的逻辑完全没有问题。(你的格式也是如此) ,这简直是残暴的 - 如果你的真实代码是如何工作的,你真的需要学习更好的习惯。)

请 - 现在摆脱with的使用。它非常容易出错,使代码难以阅读和理解,并使调试变得非常困难。

您需要(按此顺序):

  • 连接数据库
  • 设置查询
  • 准备您的查询
  • 设置参数
  • 开始交易
  • 开始尝试(最后)
  • 开始尝试(除了)
  • 执行您的查询
  • 例外,回滚查询
  • 如果没有异常,请提交您的交易
  • 最后,关闭查询和连接

此外,如果您的组件与TDataSet兼容,则应该支持TDataSet.IsEmpty您应该使用if not UNIQuery2.IsEmpty then而不是if UNIQuery.Eof = false(这应该更加干净if not UNIQuery.Eof {1}})。

我无法努力重新编写代码,因为它遍布整个地方。您在一个地方UNIQuery2,在另一个地方UNIQuery1(以及with声明使其更加混乱),我不使用(或拥有)您所拥有的任何组件用来甚至试图搞清楚。我希望这些信息可以帮助您解决问题。如果没有,请用清理后的(重写的)代码发布一个新问题,更清楚地了解您遇到的问题,并尝试提出更清晰的问题,我们可以提供更多帮助。