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;
Другие вопросы по тегам