C++ Builder: получение значений через ADOQuery с помощью SELECT
Вопрос как для Delphi-кодеров, так и для C++ Builder, потому что я использую те же компоненты. Я пытаюсь заполнить ярлыки на форме данными из базы данных. Я делаю запрос SELECT через TADOQuery. Но когда я пытаюсь получить результат, я всегда получаю сообщение об ошибке типа "ADOQuery1: поле 'count' not found". 'id', переданный функции, является значением поля автоинкремента, которое ТОЧНО существует в базе данных (оно было получено через DBLookupComboBox). Кроме того, выполнение запроса вручную для отображения результата в DBGrid является успешным. Запрашивать без параметров и записывать значение 'id' в строку запроса тоже не удается. В чем проблема? Вот код
void TSellForm::LoadData(int id) {
TADOQuery* q = DataModule1->ADOQuery1;
q->Active = false;
try
{
q->SQL->Text = "select * from drugs where(id=:id)";
q->Parameters->ParamByName("id")->Value = IntToStr(id);
q->ExecSQL();
this->LabelAvail->Caption = q->FieldByName("count")->Value;
}
catch (Exception* e) {
MessageBox(NULL, PChar(WideString(e->Message)),
L"Exception", MB_OK|MB_ICONWARNING);
}
q->SQL->Clear();
}
2 ответа
ExecSQL
используется только для операторов SQL, которые не возвращают набор записей, и для определения результатов, которые вы используете RowsAffected
,
За SELECT
операторы (которые возвращают набор записей), вы используете Open
или установить Active
к истине.
Также, count
является зарезервированным словом в большинстве диалектов SQL (как в SELECT Count(*) FROM ...
, так что если у вас есть столбец с таким именем, вам нужно его избежать, как правило, используя либо []
или двойные кавычки вокруг него или путем наложения его в SELECT
сам.
ADOQuery1->Close();
ADOQuery1->SQL->Text= "SELECT * FROM reportTble WHERE (firstName =:firstName) " ;
ADOQuery1->Parameters->ParamByName("firstName")->Value = textBox->Text ;
ADOQuery1->Open();
Вот как вы можете использовать ADOQuery