Delphi BDE说:“我们的目标是:;“未找到字段”;但这个领域是存在的

Delphi BDE说:“我们的目标是:;“未找到字段”;但这个领域是存在的,delphi,bde,Delphi,Bde,我对我的一个数据库表进行了以下查询: select count(*) as mycount from mytable where fieldone = :fieldone and fieldtwo = :fieldtwo 参数已正确加载到查询中(两种类型均为String) 当我在应用程序外部运行这个查询(例如,通过dbexplore)并用实际值替换参数时,我得到了正确的结果。但是当在应用程序中运行它时,我在查询中得到一个字段'fieldtwo'未找到错误。打开调用 为什么BDE找不

我对我的一个数据库表进行了以下查询:

select count(*) as mycount
  from mytable
 where fieldone = :fieldone
   and fieldtwo = :fieldtwo
参数已正确加载到查询中(两种类型均为String)

当我在应用程序外部运行这个查询(例如,通过dbexplore)并用实际值替换参数时,我得到了正确的结果。但是当在应用程序中运行它时,我在查询中得到一个
字段'fieldtwo'未找到
错误。打开调用

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

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

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

使用
Query1.SQL.Clear清除查询内容语句,然后再打开它


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

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

右键单击查询,选择字段编辑器,清除其中的所有值,然后选择“添加所有字段”,执行查询后,该字段将导致缺少的字段出现


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

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

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

也许添加括号:

 where (fieldone = :fieldone)
 and (fieldtwo = :fieldtwo)
或者,单引号或双引号符号(这可能会使情况变得更糟?)

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

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

 Query1.SQL.Text := StringReplace(Query1.SQL.Text, ":fieldone", "MyVarName",[rfReplaceAll   ]); 

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

例如,如果您有一个数据感知控件查看“fieldtwo”,该控件在底层数据集更新时尝试获取一些数据,那么它将触发类似这样的错误,但在编写此类代码时更为明显

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

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

如果您正在通过创建数据集方法在内存中创建CliendDataset,则应检查TfiedDefs属性,该属性必须具有不同的字段名或未创建

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

uRegPeople.pas

with frmEditPerson do
  begin
    PersonID := qryPerson.FieldByName(ID).AsInteger;
    ...
  end;
我在
frmRegPeople
frmmeditperson
中都有
qryPerson
,通过使用
with
我引用了
frmmeditperson.qryPerson
,但是我想引用
frmRegPeople.qryPerson
。然后我需要更改为以下代码

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

// Explanation
// qryPerson --> frmEditPerson.qryPerson;
// Self.qryPerson --> frmRegPeople.qryPerson;

双重检查:在执行此语句之前,我已经关闭了查询。关于数据库,我肯定是同一个。我在我的应用程序上执行的下一个查询(按这两列对表进行排序的查询)工作正常。虽然您关闭了查询,但它不会清除sql语句。因此,请尝试在关闭查询后使用
clear
语句清除查询。检查:在调试时,
query.SQL.Text
为我提供了正试图执行的确切查询。在构造我的查询之前,我尝试添加一个
Query.SQL.Clear
,但仍然出现相同的错误。经过多次测试,我确定错误出现在我的应用程序上。我找到了解决办法,所以我不再测试了。我会接受你的回答,因为你是第一个回答的,并且确实跟进了这个问题。谢谢@PabloVenturino我也遇到了类似的问题,您找到了什么解决方法?检查:当我调用Query.Call时,Query.Fields为空。尽管如此,我仍然无法在查询或字段列表中找到“添加所有字段”选项,因为我不在这里使用GUI。您更改了实际SQL,是否在第一条SQL语句中删除了order by?因为fieldone和fieldtwo在结果语句中不存在,这将导致问题。嗯。。。不,我没有从第一个语句中删除一个
orderby
子句。我只是更改了字段和表的名称来描述一个通用场景。此外,在返回单个聚合函数的语句中,
orderby
子句没有任何用处,在“通用场景”中没有问题。SQL语句执行正常。问题出在别的地方,但这个问题并没有给我一个在哪里找到它的线索。看起来有些东西值得一试。但我还是在单独执行应用程序时出错。我还尝试不使用参数,但结果没有改变:(无论如何,谢谢你的提示。我这里没有使用GUI,所以查询是在运行时创建的。SQL语句也是在运行时创建的(它对于不同的表是动态的),但我在设置参数时没有遇到错误。我有类似的经验。填充查询运行时在这种情况下很有帮助,不必动态分配它们。调用某些存储过程似乎会重写内存中不相关的对象,在这种情况下是某个TQuery对象的字段列表。只需尝试使用括号,但得到了t他犯了同样的错误。正如你所说的,双引号会使情况变得更糟,因为它会使参数变成int
with frmEditPerson do
  begin
    PersonID := Self.qryPerson.FieldByName(ID).AsInteger;
    ...
  end;

// Explanation
// qryPerson --> frmEditPerson.qryPerson;
// Self.qryPerson --> frmRegPeople.qryPerson;