BDE говорит "Поле не найдено", но поле существует
У меня есть следующий запрос к одной из моих таблиц базы данных:
select count(*) as mycount
from mytable
where fieldone = :fieldone
and fieldtwo = :fieldtwo
Параметры правильно загружены в запрос (оба типа String).
Когда я запускаю этот запрос вне приложения (например, через dbexplore) и заменяю параметры фактическими значениями, я получаю правильный результат. Но когда я запускаю его в приложении, я получаю Field 'fieldtwo' not found
ошибка, прямо при вызове Query.Open.
Почему BDE не может найти это поле, если оно действительно существует?
Обновление: следующий запрос, выполненный сразу после первого (тот, который терпит неудачу), прекрасно работает в приложении:
select *
from mytable
where fieldone = :fieldone
order by fieldone, fieldtwo
6 ответов
Очистить содержимое запроса с помощью Query1.SQL.Clear;
Заявление до его открытия.
Другая причина может быть в том, что вы открываете другую базу данных, которая может не иметь указанного поля. Убедитесь, что оба DatabaseName's
в вашем приложении и dbexplore одинаковы
Лучше всего предположить, что вы заполнили список полей в запросе, это переопределяет любую концепцию базовых полей, которые есть в запросе, и вызывает бесчисленное количество путаницы.
Щелкните правой кнопкой мыши на запросе, выберите редактор полей, очистите все имеющиеся значения и затем выберите "добавить все поля", что должно привести к тому, что пропущенное поле появится после выполнения запроса.
Я думаю, что это должно автоматически заполнить поля, если нет определенных полей при выполнении запроса, поэтому вам не нужно выбирать "добавить все поля" после очистки полей.
Всякий раз, когда мы сталкиваемся с подобной проблемой, мы склонны удалять запрос из формы и динамически создавать его во время выполнения... Это зависит от того, насколько он укоренился в форме...
Например, если у вас есть элемент управления с осознанием данных, который просматривает "fieldtwo", который пытается извлечь некоторые данные при обновлении базового набора данных, то это вызовет такую ошибку, но это становится более очевидным, когда вы пишете такой код
SomeEdit.Text = Query.FieldByName("fieldtwo").AsString;
Таким образом он падает на соответствующую строку вместо открытия (вызывая связанное событие)
Я имел обыкновение сталкиваться с проблемами с BDE, когда у меня открыт SQLExplorer, и приложение одновременно обращается к БД (но у меня были подобные ошибки), попробуйте закрыть Проводник, это может помочь, если нет, я бы собрал SQL как текст без параметров и попробуйте, если это работает тогда (если это возможно в вашей ситуации).
Если вы создаете ClienDataSet в памяти с помощью метода Create DataSet, вы должны проверить свойство TFieldDefs, которое должно иметь другое имя поля или не создано
Я не использую параметры, поэтому я просто хватаюсь за соломинку здесь. Я до сих пор регулярно использую 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 ]);
У меня была странная, но небольшая проблема, я выложу на всякий случай, если она кому-нибудь поможет.
uRegPeople.pas
with frmEditPerson do
begin
PersonID := qryPerson.FieldByName(ID).AsInteger;
...
end;
я имел qryPerson
оба в frmRegPeople
И в frmEditPerson
, используя with
Я имел в виду frmEditPerson.qryPerson
Однако я хотел бы сослаться на frmRegPeople.qryPerson
, Затем мне нужно перейти на следующий код.
with frmEditPerson do
begin
PersonID := Self.qryPerson.FieldByName(ID).AsInteger;
...
end;
// Explanation
// qryPerson --> frmEditPerson.qryPerson;
// Self.qryPerson --> frmRegPeople.qryPerson;