BDE说“找不到字段”但字段存在

时间:2011-02-21 13:59:06

标签: delphi bde

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

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

参数被正确加载到查询中(两者都是String类型)。

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

为什么BDE在实际存在时找不到这个字段?

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

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

7 个答案:

答案 0 :(得分:2)

最好的猜测是,您已在查询中填充了字段列表,这将覆盖查询中的任何基础字段的概念,并且是无数混淆的原因。

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

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

答案 1 :(得分:1)

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

E.g。如果你有一个数据感知控件查看“fieldtwo”,它试图在底层数据集更新时获取一些数据,那么它会触发这样的错误,但是当你编写代码时更明显

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分: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   ]); 

答案 5 :(得分:0)

如果要通过Create DataSet方法在内存中创建ClienDataSet,则应检查TFieldDefs属性,该属性必须具有不同的字段名称或未创建

答案 6 :(得分:0)

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

uRegPeople.pas

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

我在qryPersonfrmRegPeople中都有frmEditPerson,通过使用with我是指frmEditPerson.qryPerson,但是我想参考{{ 1}}。然后,我需要更改为以下代码。

frmRegPeople.qryPerson