Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 检查数据库表中的某些值是否已存在_Sqlite_Delphi_Delphi Xe4 - Fatal编程技术网

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

Sqlite 检查数据库表中的某些值是否已存在,sqlite,delphi,delphi-xe4,Sqlite,Delphi,Delphi Xe4,在将数据发布到另一个名为“LOG”的表之前,我想检查两个值(“shift”和“date”)是否已经存在。“shift”值由显示“shift”表(UNITable1)数据的网格中的选择确定,日期参数为AdvOfficeStatusBar1.Panels[0].Text(显示当前日期)。问题是: procedure TForm1.cxButton4Click(Sender: TObject); begin UniTransaction1.AddConnection(UniConne

在将数据发布到另一个名为“LOG”的表之前,我想检查两个值(“shift”和“date”)是否已经存在。“shift”值由显示“shift”表(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正在迭代我想要插入的其他记录。

我不使用您所指的任何组件(我不知道UNIQuery2或
UnitTransaction
可能是什么,但您的逻辑完全不正常。(你的格式也一样,简直太糟糕了——如果你真正的代码就是这样工作的,你真的需要学习更好的习惯。)

而且请-现在就用摆脱
的使用。它极易出错,使代码难以阅读和理解,并且使调试变得极其困难

您需要(按此顺序):

  • 连接到数据库
  • 设置您的查询
  • 准备您的查询
  • 设置参数
  • 开始你的交易
  • 开始尝试(最后)
  • 开始尝试(除了)
  • 执行您的查询
  • 在异常情况下,回滚查询
  • 如果没有异常,请提交事务
  • 最后,关闭查询和连接
另外,如果您的组件与
TDataSet
兼容,它应该支持您应该使用的
TDataSet.IsEmpty
如果不是UNIQuery2.IsEmpty,那么
),而不是
如果UNIQuery.Eof=false
(如果不是UNIQuery.Eof,那么应该更干净地使用


我无法重新编写你的代码,因为它到处都是。你在一个地方有
UNIQuery2
,在另一个地方有
UNIQuery1
(还有
with
语句,这使它更加混乱),而我没有使用(或有)无论您使用什么组件来尝试解决问题。我希望这些信息可以帮助您解决问题。如果没有,请在清理(重写)后发布一个新问题代码,关于您遇到的问题的更清楚的信息,并尝试问一个更清楚的问题,我们可以提供更多帮助。

如果您正确缩进代码格式,它将更容易理解。如果您不能决定其他代码应该放在哪里,您显然不理解您自己的代码应该如何工作。无论如何,如果Sql分配给UNIQuery2正确地为该班次选择现有记录,则UNIQuery2.EOF将在您调用Open后立即为false。您应该能够从中找到答案。关键点:1)遵循Jerry Dodge的建议,2)停止使用“With”构造-它会给你带来各种各样的麻烦。我不确定你是否需要QuotedString();您可能需要检查。在连接到数据集之前调用Prepare是否正确?@MartynA-如果我没有弄错的话,查询必须遍历所有记录,直到最后一条记录。如果它没有找到足够的记录,我将关闭它并继续使用新的SQL。UNI(表/查询/事务)是Devart的UNIDAC组件的一部分。这些查询都应该在哪里。我对执行任何查询都没有异议。我已经清除了一点代码,希望你能理解我的意思。