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;