try
{
Query 1 ->0pen(); // выполнить команду SQL }
catch(EDBEngineError* dbError) //
обработка ошибок BDE (
for (int i=0; i<dbError->ErrorCount; i++)
MessageBox(0, dbError[i].Message.c_str(), "SQL Error", MB_OK) ;
} }
Листинг 5.6. Соединение запроса с таблицей по событию источника.
Для динамического формирования текста командной строки SQL во время исполнения программы удобно использовать стандартную функцию Windows sprintf. Эта функция замещает параметры форматирования (%s, %d, %n и т.д.) передаваемыми значениями, например, в результате подстановки значений параметров форматирования:
tbIName = "EMPLOYEE";
fIdName = "EmpNo";
fIdValue = 3;
sprintf(sqls, "SELECT * FROM %s WHERE %s = %d", tbIName, fIdName, fIdValue)
символьный массив sqls будет содержать следующую команду:
"SELECT * FROM EMPLOYEE WHERE EmpNo =3"
Листинг 5.7 иллюстрирует применение функции sprintf для
формирования команды SELECT динамического запроса к таблице EMPLOYEE.
Методы Clear и Add используются для занесения этой команды в свойство SQL. Поскольку подготовленный запрос использует ресурсы сервера и нет никакой гарантии, что новый запрос будет работать с данными одной и той же таблицы, C++Builder снимает готовность при любом изменении свойства SQL (т.е. устанавливает значение false свойства Prepared). При очередном исполнении запроса готовность автоматически восстанавливается.
void _fastcall TFormI::ButtonlClick(TObject *Sender)
{
char sqls[250]; // массив для хранения команды SQL
char fmts[50]; // массив для значения зарплаты
// Присвоить
fmts значение, введенное пользователем
if ( i (strcmp(SalaryEdit->Text .c_str () , " ") ==0)) strcpytfmts, SalaryEdit->Text.c_str()) ;
else
strcpy(fmts, "100000"); //
максимальная зарплата
// Деактивировать предыдущий запрос, если он имел место
Queryl->Close() ;
// Очистить свойство SQL от предыдущего запроса
Queryl->SQL->Clear() ;
// Построить команду SELECT с помощью функции sprintf