【问题标题】:TSQLQuery not returning right amount of recordsTSQLQuery 没有返回正确数量的记录
【发布时间】:2024-01-01 10:29:01
【问题描述】:

我有一个名为 Artist 的表,它当前包含四条记录和一个 TSQLQuery,其中包含以下语句:

SELECT name
FROM Artist

Artist 表还包含以下记录:

id          name
1           Artist 1
2           Artist 2
3           Artist 3
4           Artist 4

当前的记录检索方法:

Query1.Open;
for i := 0 to qArtist.FieldCount -1 do
    with cbArtist.ListBox.ListItems[i] do
        Text := qArtist.Fields[i].AsString;

以前的记录检索方法:

Query1 数据绑定到ComboBox1


使用“previous”方法,ComboBox1 将显示来自Artist 表的所有预期记录。但是,当我尝试使用“当前”方法时,Query1 仅从Artist 表中选择第一条记录,尽管存在其他三个现有值。我已经在其他查询中尝试了“当前”方法,它们也只返回了表的第一个值。

我选择这种新方法的原因是因为我觉得如果我继续使用“以前的”/数据绑定方法,我能做的事情非常有限,但这不是重点。

那么我该如何解决这个问题呢?即查询仅从表中选择第一条记录的问题。

【问题讨论】:

    标签: delphi sqlite delphi-xe3 firemonkey-fm2


    【解决方案1】:

    您必须使用EofNext 方法来迭代记录。

    Query1.Open;
     while not Query1.eof do
     begin
      cbArtist.Items.Add(Query1.FieldByName('Artist').AsString);
      Query1.Next;
     end;
    

    【讨论】:

    • 这段代码比我计划写的要简单得多。在运行时为 ComboBox 动态创建 TTabItems?我在想什么……但谢谢你的回答!
    【解决方案2】:

    您的代码显示了跨字段的交互,如果您需要迭代所有记录,那么您必须使用如下代码:

    Query1.Open;
    Query1.first;
    while not Query1.eof do
    begin
        with cbArtist.ListBox.ListItems[i] do
            Text := qArtist.Fields[1].AsString; //put here field you want to bind on ListBox.
        Query1.next;
    end;
    

    【讨论】:

      【解决方案3】:

      我认为您没有正确导航查询的数据集。 FieldCount 和 Fields[i] 访问字段元数据(跨越的列),而不是行。我相信 Delphi 你使用 While not Eof begin... end。

      Navigating Datasets

      我会考虑更改数据绑定字段以满足您的需要。 Delphi 的数据绑定非常强大。手动迭代数据集以填充控件将只是可以隐藏错误的额外代码。利用工具的内置功能,将更容易理解和维护。

      【讨论】:

      • 更多的是评论而不是我想说的答案?
      • 我只是不知道数据绑定有多强大。那我最好开始研究。谢谢你的回答!