1

我对我的一个数据库表有以下查询:

select count(*) as mycount
  from mytable
 where fieldone = :fieldone
   and fieldtwo = :fieldtwo

参数已正确加载到查询中(均为字符串类型)。

当我在应用程序外部运行此查询(例如,通过 dbexplore)并将参数替换为实际值时,我得到了正确的结果。但是在应用程序中运行它时,我收到一个Field 'fieldtwo' not found错误,就在 Query.Open 调用上。

为什么 BDE 找不到这个字段,而实际上它确实存在?

更新:以下查询在第一个查询(失败的查询)之后立即执行,在应用程序中运行良好:

select *
  from mytable
 where fieldone = :fieldone
 order by fieldone, fieldtwo
4

7 回答 7

2

最好的猜测是您已经在查询中填充了字段列表,这会覆盖查询中基础字段的任何概念,并且会导致无数混乱。

右键单击查询,选择字段编辑器清除所有存在的值,然后选择“添加所有字段”,这将导致在执行查询后出现缺失的字段。

我认为如果执行查询时没有定义的字段,它应该自动填充字段,因此您可能不需要在清除字段后选择“添加所有字段”。

于 2011-02-21T14:36:50.047 回答
1

每当我们遇到这样的问题时,我们倾向于从表单中删除查询并在运行时动态创建它......这取决于它在表单中的根深蒂固......

例如,如果您有一个查看“fieldtwo”的数据感知控件,它会在基础数据集更新时尝试获取一些数据,那么它将触发这样的错误,但是当您编写这样的代码时会更明显

SomeEdit.Text = Query.FieldByName("fieldtwo").AsString;

这样它就会落在相关行而不是打开(触发相关事件)

于 2011-02-21T15:43:27.347 回答
0

在打开查询内容之前使用语句清除Query1.SQL.Clear;它。

其他原因可能是您正在打开其他可能没有指定字段的数据库。确保DatabaseName's您的应用程序中的 dbexplore 和 dbexplore 相同

于 2011-02-21T14:22:57.367 回答
0

当我打开 SQLExplorer 并且应用程序同时访问数据库时,我曾经遇到过 BDE 的问题(但我有类似的错误),尝试关闭资源管理器它可能会有所帮助,否则我会将 SQL 构建为没有参数的文本并尝试它是否有效(如果它可能在您的情况下)。

于 2011-02-21T14:59:19.457 回答
0

我不使用参数,所以我只是在这里抓住稻草。我仍然经常使用 BDE,但我不是专家。我发现我回避更复杂的表达式(你的表达式不是!),因为 BDE 会给你带来像这样的小“惊喜”。

也许添加括号:

 where (fieldone = :fieldone)
 and (fieldtwo = :fieldtwo)

或者,单引号或双引号(这可能会使情况变得更糟?)

 where (fieldon = ":fieldone")
 and   (fieldtwo = ":fieldtwo")

或者,为了探究问题,删除“and fieldtwo = :fieldtwo”行并查看它是否运行。

您是否可以使用 StringReplace 进行自己的参数替换,如

 Query1.SQL.Text := StringReplace(Query1.SQL.Text, ":fieldone", "MyVarName",[rfReplaceAll   ]); 
于 2011-02-21T15:36:40.530 回答
0

如果你是通过 Create DataSet 方法在内存中创建一个 ClienDataSet,你应该检查 TFieldDefs 属性,它必须有不同的字段名或者没有创建

于 2017-05-23T02:23:38.230 回答
0

我遇到了一个奇怪但很小的问题,我会发布以防有一天它会对某人有所帮助。

uRegPeople.pas

with frmEditPerson do
  begin
    PersonID := qryPerson.FieldByName(ID).AsInteger;
    ...
  end;

qryPerson同时拥有 infrmRegPeople和 in frmEditPerson,通过使用withI are references to frmEditPerson.qryPerson,但是我想引用frmRegPeople.qryPerson。然后我需要更改为以下代码。

with frmEditPerson do
  begin
    PersonID := Self.qryPerson.FieldByName(ID).AsInteger;
    ...
  end;

// Explanation
// qryPerson --> frmEditPerson.qryPerson;
// Self.qryPerson --> frmRegPeople.qryPerson;
于 2018-12-21T13:37:40.243 回答