我对我的一个数据库表有以下查询:
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
答案 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;
我在qryPerson
和frmRegPeople
中都有frmEditPerson
,通过使用with
我是指frmEditPerson.qryPerson
,但是我想参考{{ 1}}。然后,我需要更改为以下代码。
frmRegPeople.qryPerson