【问题标题】:Check if certain values in a database table already exist检查数据库表中的某些值是否已存在
【发布时间】: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


【解决方案1】:

我不使用您所指的任何组件(我不知道 UNIQuery2UNITransaction 可能是什么,但您的逻辑完全不正常。(您的格式也是如此,这只是atrocious - 如果这就是你真正的代码的工作方式,你真的需要学习更好的习惯。)

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

您需要(按此顺序):

  • 连接到数据库
  • 设置查询
  • 准备查询
  • 设置参数
  • 开始您的交易
  • 开始尝试(终于)
  • 开始尝试(除外)
  • 执行查询
  • 在异常情况下,回滚您的查询
  • 如果没有异常,提交您的事务
  • 最后,关闭查询和连接

另外,如果您的组件与TDataSet 兼容,它应该支持TDataSet.IsEmpty,您应该使用(if not UNIQuery2.IsEmpty then)而不是if UNIQuery.Eof = false(应该更干净地使用if not UNIQuery.Eof)。

我无法重新编写您的代码,因为它到处都是。你在一个地方有UNIQuery2,在另一个地方有UNIQuery1(还有with 声明,这让一切变得更加混乱),我不使用(或拥有)你正在使用的任何组件,甚至试图弄清楚出来。我希望这些信息可以帮助您解决问题。如果没有,请在您清理(重写)的代码中发布一个新问题,提供有关您遇到的问题的更清晰信息,并尝试提出更清晰的问题,我们可以提供更多帮助。

【讨论】:

  • UNI (table/query/transaction) 是 Devart 的 UNIDAC 组件的一部分。查询都在他们应该在的地方。我对任何查询的执行都没有问题。我已经清除了一点代码,希望您能理解我。
猜你喜欢
  • 2021-08-11
  • 2011-05-16
  • 2011-04-09
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多