Borland C++ Builder FAQ.

Ответы на часто задаваемые вопросы

 

 


0. Введение.

0.1 Какова цель этого документа?

Ответ: Этот документ предназначен для освещения некоторых вопросов по новому продукту фирмы Borland - С++ Builder. Здесь расматриваются вопросы как общего характера так и технические вопросы.

0.2 Как я могу получить последнюю версию FAQ ?

Ответ: Вы можете получить новый FAQ послав пустое письмо по адресу cbuilder@demo.ru или взять его на BBS нашего информационного партнера - Cosmopоlis BBS, 2:5020/87 (SysOp: Никита Попов). В начале 1997 года Демоцентр открывает WWW сервер технической поддержки адрес - www.demo.ru и там этот и другие документы по продуктам фирмы Borland будут доступны в последних версиях.

0.3 Замечание

Все исследования и тесты проводятся на БЕТА версиях Borland С++ Builder. Данный документ не претендует на законченность и не является официальной информацией Borland International.


1. Общие вопросы.

1.1 Что такое Borland C++ Builder?

Ответ: Borland C++Builder для Windows 95 и NT предоставляет Вам возможность скоростной ( RAD ), визуальной drag & drop разработки, включает в себя более 100 повторно используемых компонент с исходными текстами, и гибкими масштабируемыми средствами управления базами данных, при этом комбинируя в себе мощность и высочайший контроль над исполняемым кодом предоставляемый индустриальным стандартом языка C++. Этот продукт сохраняет Ваши вложения в проекты которые разрабатывались на C/C++. Borland C++Builder компилирует любой ANSI С/C++ код, делая это очень быстро, поддерживает технологии разработки Visual C++ и Borland C++ приложений. Плюс, вы сможете полностью поддерживать индустриальные стандарты, включая ANSI C++, Win32 API, ActiveX, OLE Automation, ODBC, DCOM, MAPI, DirectX, Unicode, WinSock, ISAPI, и NSAPI.

 1.2 Чем С++ Builder отличается от Delphi 2.0?

Ответ: С точки зрения функциональной наполненности исключая более развитые средства отладки - практически ничем. Но мы имеем более мощный объектно- ориентированный язык программирования, развитые стандартные библиотеки С++, и гибкие возможности по интеграции с другими средствами разработки включая Delphi. Также хочется отметить что технологии Win32 постоянно развиваются и их поддержка в С++ Builder более широкая (DirectX, DCOM, try Unicode, NSAPI). Плюс в C++Builder, файл проекта есть ничто иное как стандартный "makefile" и имеет расширение .POF .

1.3 Borland C++ Builder - это новая версия С++ от фирмы Borland?

Ответ: Если мы говорим о линии С/С++ продуктов фирмы Borland, то С++ Builder - это отдельный продукт который позволяет решать определенные задачи и мы можем говорить только как о расширении линии С/С++ инструментов средством с настоящей компонентной архитектурой в рамках общей стратегии "Golden Gate" фирмы Borland.

1.4 Что входит в поставку Borland C++ Builder?

Ответ: Поставка продукта будет осуществляться в трех вариантах - подобно Delphi 2.0. Комплектация различных поставок приведена ниже в таблице.

Позиции поставки

C++Builder

Standard

C++Builder

Professional

C++Builder

C/S Suite

Поддержка стандарта C++ Да Да  Да
Высокопроизводительный, 32-битный, оптимизирующий компилятор  Да Да  Да
Неправдоподобно быстрый линковщик  Да  Да Да
Проффессиональная интегрированная среда разработчика включая полностью интегрированный, комплексный Отладчик, Редактор и Менеджер Проекта. Интегрированный CPU просмотрщик, и обычные средства коммандной строки  Да Да Да
Создание DLL, LIB, и стандартных EXE модулей  Да Да  Да 
Полный набор Windows 95 общих контрольных элементов Да Да Да
Полный доступ к Windows 95/NT API включая multi-threading, ActiveX, ODBC, DCOM, DirectX и другие Да  Да Да
Полная поддержка для создания Windows 95/Windows NT OLE Automation контроллеров и серверов Да  Да Да
Репозиторий Объектов для хранения и повторного использования форм, модулей данных, и проектов  Да Да Да
Визуальное наследование форм для повторного использования Вашего кода и простой поддержки Да  Да Да
Библиотека визуальных компонент (VCL) с более чем 100 компонентами для повторного использования или создания собственных  Да Да Да
Обширная система помощи и печатная документация  Да Да Да
Эксперт для простого создания Ваших различных повторноиспользуемых компонент Да  Да Да
Копоненты для работы с базами данных Да Да Да
Объект - Модуль данных (DataModule), для разделения бизнес правил и Вашего кода  Да Да Да
Программа Database Explorer - для визуального просмотра и модификации таблиц, псевдонимов доступа, и индексов  Да Да Да
СВОБОДНО! Компонентный редактор отчетов Quick Reports для простого создания, предварительного просмотра и печати отчетов

Да

Да Да
Масштабируемый Словарь Данных (Data Dictionary) для управления и поддержке даных в Ваших проектах  Нет   Да Да
Полноценный шлюз ODBC  Нет   Да Да
Много-Объектная таблица данных Нет  Да Да 
32-битный локальный Borland IB SQL Server для отдельной разработки масштабируемых клиент - серверных приложений Нет    Да Да 
InstallShield Express для создания проффессиональных программ установки Ваших приложений  Нет   Да Да
СВОБОДНО! Internet Solutions Pack из восьми ActiveX для простого создания Web-ориентированных приложений  Нет   Да Да 
WinSight™ 32 для мониторинга Windows сообщений  Нет   Да Да 
Open Tools API для интеграции ваших средств, расширяющих интегрированную среду разработчика  Нет  Да  Да 
Поддержка групповой разработки проекта, PVCS API (требуется InterSolv PVCS)  Нет  Да Да
Гибкие OCX для бизнес графики, электронных таблиц, проверки орфографии  Нет  Да Да
Родные драйвера с неограниченной лицензией для работы с SQL серверами:Oracle, Sybase, Informix, DB2, Microsoft SQL Server, и InterBase Нет   Нет   Да
SQL Database Explorer для визуального управления серверно - зависимыми мета-данными Нет   Нет  Да
SQL Monitor для тестирования, отладки, и настройки клиент-серверных приложений Нет   Нет  Да
Визуальный построитель запросов (Visual Query Builder) для генерации SQL запросов свободного от ошибок Нет   Нет  Да
Интегрированный PVCS Менеджер версий для групповой разработки Нет   Нет   Да
Borland IB SQL Server for NT (2-х пользовательская лицензия)  Нет   Нет  Да
Кешируемые обновления для высокой скорости ответа сервера на Ваши запросы  Нет  Нет  Да
Data Pump Expert для переноса данных, быстрого масштабирования ваших приложений Нет   Нет  Да

1.5 Когда выходит релиз продукта?

Ответ: Borland С++ Builder выходит в конце февраля, в начале марта 1997 года.

1.6 Сколько стоит этот продукт?

Ответ: Ниже в таблице цены Демоцентра на различные варианты продукта

Поставка

C++Builder
Standard
+ техническая поддержка
C++Builder
Professional
+ техническая поддержка
C++Builder
C/S Suite
+ техническая
поддержка


Стоимость

Звоните Звоните Звоните

 1.7 Как можно с ним ознакомиться?

Ответ: Вы можете приобрести в Демоцентре ознакомительный диск "Borland Tools" на котором находятся триал версии Borland C++ Builder, Borland Delphi 2.0, Borland IntraBuilder. Стоимость диска - 36$.

1.8 Как можно оформить получение последних новостей по С++ Builder?

Ответ: В России это можно сделать подписавшись на годовую информационную программу для разработчиков, проводит её Демоцентр совместно с Европейским отделением технической поддержки фирмы Borland (Голландия).

1.9 Под какие платформы можно разрабатывать программы на С++ Builder?

Ответ: Под Windows 95, Windows NT3.51, Windows NT4.0. Но если вы неиспользуете платформо-зависимых вызовов, то оставаясь в рамках языка программирования вы можете создавать переносимый код на уровне исходных текстов.

1.10 В чем выражается соответствие стандарту С++?

Ответ: В стандарте языка С++ появились различные новые возможности, и фирма Borland включила в C++ Builder (как и в BC 5.01) новые зарезервированные слова такие как -

bool - новый тип, значениями которого могут, быть только true или false

mutable - позволяет модифицировать переменную, даже если она входит в состав выражения, специфицированного как константа.

explicit - запрещает неявное преобразование типа при присваивании классов.

namespace и using - управление пространством имен.

Новые зарезервированные слова обозначающие логические операции упрощающие читабельность Вашего кода.

Новое ключевое слово Соответствует
and &&
or ||
not !
not_eq !=
bitand &
and_eq &=
bitor |
or_eq |=
xor ^
xor_eq ^=
compl ~

1.11 Смогу ли я использовать свои старые наработки на С++?

Ответ: Конечно ДА! Поскольку в основе C++ Builder лежит стандартный компилятор С++.

1.12 Смогу ли я использовать в проектах OWL?

Ответ: Да сможете и не только OWL, но и MFC.

1.13 Какие технологии Win32 поддерживает С++ Builder?

Ответ: Win32 API, ActiveX, DirectX, OpenGL, OLE Automation, DDE, ODBC, DCOM, MAPI, Unicode, WinSock.

1.14 Что такое компонентная технология?

Ответ: Компонентную технологию можно определить следующими пунктами

  • Компонент это объект в синтаксисе объектно-ориентированного языка программирования
  • Компоненты работают во время создания и во время работы приложения
  • Компоненты представляется в среде разработки как визуальные элементы, из которых строится приложение

1.15 Какие компоненты входят в поставку?

Ответ: Ниже в таблице приведены группы компонент С++ Builder представленные в палитре компонент IDE. Количество и функцинальность компонент соответствует набору компонент в Delphi 2.01

Название страницы компонент


Содержимое

Standard Стандартные контрольные элементы Windows, меню, кнопки, поля редактирования
Additional Дополнительные контрольные элементы
Win95 Общие контрольные элементы Windows 95
Data Access Невизуальные компоненты для доступа к базам данных, таблицам, SQL запросам, отчетам
Data Controls Компоненты для визуального управления данными
Win 3.1 Windows 3.1 контрольные элементы
Dialogs Общие диалоги Windows
System Сомпоненты и контрольные элементы для доступа к системному уровню операционной системы, включая таймер, использование файловой системы, мультимедиа, DDE и OLE
QReport Quick Reports компоненты для простого создания отчетов
OCX Простые в использовании контрольные элементы OLE
Samples Примеры различных компонент, для обучения их программирования
Internet OCX контрольные элементы для Internet программирования


1.16 Как организованна VCL библиотека?

Visual Component Library (VCL) - это библиотека классов для построения приложений в C++ Builder. В ней содержатся как визуальные классы так и невизуальные. Добавляя или удаляя компоненты в среду разработчика Вы тем самым изменяете содержимое VCL. В процессе работы Вы можете иметь несколько различных VCL подгружая нужную для данного момента времени. Это можно использовать для минимизации скорости работы среды при разработке определенного проекта.

ПРИМЕР: Если Вам не требуется использовать при разработке OLE технологию то можете смело создать VCL без компонент OLE.

Физически библиотека представляет собой DLL модуль. Структура классов аналогична библиотеке в Delphi 32. C++Builder библиотека компонент основана на формате DLL модулей Delphi 2.0 ( .DCV ) . В библиотеке C++Builder, Вы можете смешивать .pas и .cpp модули в одной .DLL.

1.17 На каком уровне сделана интеграция с другими инструментами?

Ответ: В ходе разработки Вашего проекта Вы можете использовать модули DLL написанные на других языках программирования импортируя из них функции или классы. В случае интеграции с родными средствами Borland (Borland C++, Delphi) вы можете использовать общие библиотеки LIB, или модули OBJ. Самая удивительная интеграция возможна с Delphi 32 - Вы можете использовать дельфийские компоненты установив их в среду, то есть использовать все то что наработано за 2 года существования Delphi 32, Вы можете включать в проект С++ Builder'а формы и модули созданные в Delphi даже создавать классы С++ наследники от дельфийских форм. Все это стало возможным при помощи единой кодогенерации в компиляторах С++ и Delphi фирмы Borland и включению в С++ Builder обоих компиляторов С++ и Delphi. Теперь если в комманде разработчиков половина пишет на C++ а половина на Delphi то мы можем говорить о действительно совместной разработке и сохранении средств предназначенных для обучения.

1.18 Какие параметры машины разработчика требуются для нормальной работы С++ Builder?

Ответ: Мы рекомендуем следующие характеристики железа -

  • ОЗУ: 32- 24Мб
  • Процессор: Pentium 100 или выше
  • Жесткий диск: скорость обмена > 1.3Мб в секунду
  • ОС: Windows NT Workstation 3.51 4.0, Windows 95

1.19 Какого размера создаются исполняемые модули?

Ответ: Размеры Ваших программ если вы используете С++ Builder VCL будут такими как и модули написанные на Delphi 2.01 к примеру окошко с "Нello world!" ~ 150K. Если Вы используете другие библиотеки (OWL, MFC) или пишете консольное приложение, то размеры аналогичны тем размерам которые Вы могли получить программируя на Borland C++ 5.01

1.20 Какие Internet - направленные программы можно создавать c помощью C++ Builder? 

Ответ: Вы можете использовать для создания как серверных так и клиентских приложений стандартные функции Windows Socket API. В Windows NT4.0 & Windows 95 появилась библиотека WinInet которая являются более высокоуровневой, и реализует доступ к протоколами - HTTP, FTP, Gopher. В поставку С++ Builder включены OCX компоненты фирмы NetManage, они реализуют работу с протоколами HTTP, FTP, NNTP, SMTP, POP3, TCP, UDP и есть компонента HTML c ее помощью Вы можете создать за пару минут свой "Netscape Navigator". Конечно же Вы можете расширять логику WEB серверов разрабатывая приложения CGI, DLL в рамках интерфейсов ISAPI и NSAPI. Так же поддерживается технология ActiveX.

1.21 Каким образом в C++ Builder реализован доступ к базам данных?

Ответ: Доступ к базам данных в С++ Builder реализован через стандартный Borland Database Engine 3.5. Эта библиотека используется всеми инструментальными средствами выпускаемыми фирмой Borland : Delphi, C++, Visual dBase. Эта масштабируемая, высокопроизводительная библиотека обеспечивает доступ к следующим форматам данных - Paradox, dBase, поддерживается доступ при помощи ODBC-драйверов. Реализация родных SQL драйверов позволяет работать с данными на всех основных SQL серверах. Для программиста разрабатывающего программы на C++ Builder доступны два уровня управления базами данных - это уровень BDE API, и обьектно-ориентированный уровень компонент палитры Data Access.

примечание: в конце первого квартала 1997 года Borland выпускает Driver Developers Kit for BDE - это DDK разработчика, который позволит писать свои драйвера для различных форматов данных.

1.22 С какими SQL серверами может работать программа написанная на C++ Builder?

Ответ:

  • InterBase (Native SQL Link with the all platforms) 4.0, 4.1, 4.2
  • Oracle 7.0, 7.1, 7.2, 7.3
  • DB/2
  • Informix
  • Sybase (Два типа линка)
  • MS SQL 6.0, 6.5
  • Любой другой через ODBC шлюз

1.23 Какие дополнительные библиотеки входят в поставку?

Ответ: В поставке есть стандартная библиотека шаблонов (STL) от RogueWave Software - эта библиотека первоначально разработанная в HP Labs Александром Степановым представляет собой шаблоны классов для списков, очередей, стеков и др. контейнерных классов, так же различные алгоритмы. Эта библиотека сегодня является стандартной и поставляется с многими другими компиляторами С++.


2. Технические вопросы.

2.1 Рекомендации по установке

Установка продукта не вызывает трудностей, единственное замечание по поводу BETA версии это то что нужно производить установку по умолчанию в противном случае если мы будем ставить C++ Builder на диск D: а не на C:, то он не будет запускаться. Ознакомительная версия продукта автоматом не прописывает переменную окружения "PRONTO", надо руками прописать "SET PRONTO = C:\CPPB"

2.2 Какие изменения внесены в компилятор

Ответ: В C++ компиляторе появились следующие изменения

Добавлены СВОЙСТВА объектов
Пример:

// Объявление свойства в классе 
__property String FileName = {read=GetFileName, write=SetFileName};
// Чтение значения свойства делается функцией GetFileName
// А запись функцией SetFileName
// ...
// Управление значением свойства в программе
FileName = FileName + ".cpp";

Обработчики событий
Пример:

// Общее определение события для класса
void (__closure *OnClickButton) (TObject* Sender);

// в программе
OnClickButton( foo ); // вызов обработчика
OnClickButton = bar->MyNewHandleButton; // установка нового обработчика

OnClickButton( foo ); // вызов нового обработчика

Новые ключевые слова

Слово Описание
__declspec(delphiclass | delphireturn) Для совместимости с вызовами Delphi
__automated Для реализации OLE Automated
__published Для реализации публикуемых членов классов
__closure Для событийной реализации
__property Для реализации свойств объектов
__classid(class) Для внутренней работы IDE с VCL, прямо не может использоватся программистами
__dispid(int) Используется для реализации вызовов методов при программировании Automation OLE объектов

Дополнительно добавлены новые классы: String, Variant, ShortString, Currency, TDateTime, and Set.
Новые макросы -
OPENARRAY, ARRAYOFCONST, EXISTINGARRAY, SLICE;

2.3 Какие могут быть типы свойств?

Ответ: Так как свойства в процессе дизайна управляются Object Inspector'ом, то возможны два вида обработки свойств - это собственным редактором Object Inspector'а или пользовательским. Таблица ниже показывает соответствие типов свойств и способов их обработки в момент создания приложения (design time). Это вопрос особенно важно знать при разработке новых компонент.

Типы свойств В Object Inspector'е
Simple Численные, символьные, и строковые свойства Object Inspector'ом обрабатываются встроенным редактором. Пользователь прямо в полях Object Inspector'а редактирует значения.
Enumerated Тоже самое только редактирование производится с помощью выбора значения из списка
Set Тоже самое
Object Редактор свойств должен быть индивидуальным для данного объекта
Array Редактор свойств должен быть индивидуальным для данного массива значений или объектов

2.4 Как можно перенаправить ввод подсказок (Hints) на свой компонент?

Ответ: Подсказки выводятся при возникновении события и обрабатываются обработчиком по умолчанию. Для того чтобы выводить подсказку в другой элемент нужно перекрыть старый обработчик своей функцией. Этот пример показывает как рабатать с динамическими событиями, в принципе используя этот механизм вы можете динамически устанавливать во время выполнения любой другой обработчик для любого события.

// Это наш обработчик...
void __fastcall TGeneralForm::ShowMyHint(TObject* /*Sender*/)
{
    StatusBar->SimpleText = Application->Hint;
}
// при создании главной формы переприсваиваем обработку вывода хинтов...	
void __fastcall TGeneralForm::ShowMyHint(TObject* /*Sender*/)
{
    Application->OnHint = &ShowHint;
}

2.5 Как динамически создать форму на этапе исполнения?

Ответ: Прежде всего мы создаем в дизайнере нашу форму, затем в свойствах проекта мы должны указать что эта форма не является автоматически создаваемой при инициализации программы, затем в нужном модуле создаем объект :

#include <aboutbox.hpp>	
// ...
TAboutBox *Box = new TAboutBox(this);
int ret = Box->ShowModal();
if (ret == ...){
// тут Ваш код
}
delete Box;

Примечание
Во избежании проблем с именами указателей настоятельно рекомендуется имена описывать уникальными.

2.6 Как работать с функциями Win32 API в С++ Builder

Ответ: В частном примере показано как использовать свойство Handle компоненты TForm для получения и освобождения HDC данной формы путем вызова функций API GetDC() и ReleaseDC(). Общий подход следующий - библиотека VCL инкапсулирует в себе практически все элементы API надо только пройтись по дереву объектов их свойств и найти нужное свойство для управления функциями API. Далее если Вам придется написать достаточно большой функционал на Win32 API то неполенитесь оформите его в в виде компоненты или набора компонент.


char buff[32];
HDC dc = GetDC(Form1->Handle);
Label1->Caption = (AnsiString)itoa(dc,buff,10);
ReleaseDC(Form1->Handle, dc );

2.7 Как работать с компонентой TQuery и обработкой исключительных ситуаций возникающих при работе с базами данных.

Ответ: Ниже приводится код в котором строки SQL запроса берутся из объекта TMemo и присваиваются свойству SQL объекта TQuery, код выполнения находится в блоке try(...}.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	// Проверим Memo1 на наличие строк SQL запроса.
	if (strcmp(Memo1->Lines->Strings[0].c_str(), "") == 0)
	{
		MessageBox(0, "No SQL Statement Entered", "Error", MB_OK);
		return;
	}
	else
	{
		// Закрываем Query1 на всякий случай
		Query1->Close();
		// Чистим любой предыдущий SQL запрос
		Query1->SQL->Clear();
		// Назначаем SQL свойству Query1 значение текста в Memo1.
		Query1->SQL->Add(Memo1->Lines->Strings[0].c_str());
	} // if

	try 
	{
	// Выполняем SQL запрос и открываем Query1
		Query1->Open();
	} catch(EDBEngineError* dbError) {
		for (int i = 0; i < dbError->ErrorCount; i++)
		{
			MessageBox(0, dbError[i].Message.c_str(), "SQL Error", MB_OK);
		}
	} // catch(EDBEngineError* dbError)
} // end function TForm1::Button1Click(TObject *Sender)
  

2.8 Как в С++ Builder работать с параметрами SQL запросов.

Ответ: Прежде всего определяем строки SQL запроса в компоненте TQuery
select * from EMPLOYEE where DEPT_NO = :Dept_no
который содержит в себе параметры в примере он один :Dept_no Далее нажав правую кнопку на объекте TQuery выбираем в появившемся меню пункт - Define Parameters и определяем тип параметра, для примера выберем Integer.

Теперь перед выполнением SQL запроса мы можем определить параметр нашим значением
Возможны следующие варианты доступа к значениям параметра


Query1->Params->Items[0]->AsInteger = 900;
//или,
Query1->Params->Items[0]->AsInteger = atoi(Edit1->Text.c_str());
//или,
Query1->Params->Items[0]->AsString = "900";
//или,
Query1->Params->Items[0]->AsString = Edit1->Text;
//или,
Query1->ParamByName("Dept_no")->asInteger = 900;

Далее выполняем SQL запрос. Ниже приводится полный пример ипользования параметров.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Query1->Close();

	if (! Query1->Prepared)
	{
	        Query1->Prepare();
      	  if (strcmp(Edit1->Text.c_str(),"") == 0)
	        {
			Query1->ParamByName("Dept_no")->AsInteger = 0;
			Edit1->Text = 0;
		}
		else
		{
			Query1->ParamByName("Dept_no")->AsString = Edit1->Text.c_str();
		}

		try
		{
			Query1->Open();
		 } catch(EDBEngineError* dbError) {
			for (int i = 0; i < dbError->ErrorCount; i++)
			{
				MessageBox(0, dbError[i].Message.c_str(), "SQL Error", MB_OK);
			}
		} // try
	} // if
}

2.9 Можно ли применять стандартные функции форматирования из RTL [ sprintf() ]

Ответ: Да конечно, пример показывает как это делать

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	// Эта строка для хранения всего SQL выражения.
	//
	char *sqlStr = new char[250];
	
	// В этих строках будут значения.
	
	char* fmtStr1 = new char[50];
	char* fmtStr2 = new char[50];
	
	// Если кнопка выбора отмечена
	if (showSalaryChkBox->Checked)
	{
		strcpy(fmtStr1, ", SALARY");
	}
	else
	{
		strcpy(fmtStr1, "");
	}
	
	// Если поле ввода не пустое
	//
if (!(strcmp(salaryEdit->Text.c_str(),"") == 0))
	{
		strcpy(fmtStr2, salaryEdit->Text.c_str());
	}
	else
	{
		strcpy(fmtStr2, "> 0");
	}
	
	Query1->Close();
	Query1->SQL->Clear();
	
	// Строим SQL выражение используя sprintf() функцию.
	//
	sprintf(sqlStr, "Select EMP_NO %s from EMPLOYEE where SALARY %s", fmtStr1, fmtStr2);
	
	Query1->SQL->Add(sqlStr);
	
	try
	{
		Query1->Open();
	} catch(EDBEngineError* dbError){
		for (int i = 0; i < dbError->ErrorCount; i++)
		{
			MessageBox(0, dbError[i].Message.c_str(), "SQL Error", MB_OK);
		}
	}
}

2.10 Когда нужно использовать методы Open(), ExecSQL() объекта TQuery.

Ответ: Если в результате выполнения SQL запроса Вам возвращается курсор [ к примеру делаете SELECT ] то нужно использовать Open() метод. Если курсор не возвращается [ UPDATE, INSERT, EXECUTE ] то используйте ExecSQL(). Пример комбинированного использования этих методов показан ниже:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Query1->Close();
	Query1->SQL->Clear();

	Query1->SQL->Add("update EMPLOYEE set SALARY = (SALARY * (1 + :raise))\
			where (SALARY < :salary)");
	Query1->ParamByName("salary")->AsString = Edit1->Text.c_str();
	Query1->ParamByName("raise")->AsString = Edit2->Text.c_str();
	try
	{
		Query1->ExecSQL();
	} catch(EDBEngineError* dbError) {
		for (int i = 0; i < dbError->ErrorCount; i++)
		{
			MessageBox(0, dbError[i].Message.c_str(), "SQL Error", MB_OK);
		}
	}
	Query1->Close();
	Query1->SQL->Clear();

	Query1->SQL->Add("select * from EMPLOYEE");

	try
	{
		Query1->Open();
	} catch(EDBEngineError* dbError){
		for (int i = 0; i < dbError->ErrorCount; i++)
		{
			MessageBox(0, dbError[i].Message.c_str(), "SQL Error", MB_OK);
		}
	}
}

2.11 При работе с SQL серверами для разделения уровней изоляции применяются транзакции, как они оформляются в программе на С++ в C++ Builder.

Ответ: Применение механизмов транзакционности в C++ Builder требует ипользования в Вашем проекте объекта типа TDatabase именно в нем инкапсулированы все методы и свойства по работе с транзакциями.

   void __fastcall TForm1::Button1Click(TObject *Sender)
   {
      try
      {
         char sqlStr[250];
	// Стартуем транзакцию
         Database1->StartTransaction();

         Query1->SQL->Clear();

         sprintf(sqlStr, "INSERT INTO PHONE_LIST VALUES (10, 'C++ Builder')");
         Query1->SQL->Add(sqlStr);
         Query1->ExecSQL();
         // Фиксируем все изменения.
         DataBase1->Commit();
      }
      catch(EDBEngineError* dbError)
      {
         for (int i = 0; i < dbError->ErrorCount; i++)
         {
            MessageBox(0, dbError[i].Message.c_str(), "SQL Error", MB_OK);
         }
         // Если ошибка то откатываем все изменения.
         Database1->Rollback();
         return;
      }
      catch (Exception* exception)
      {
         MessageBox(0, exception->Message.c_str(), "Error", MB_OK);
         // Если ошибка то откатываем все изменения.
         Database1->Rollback();
         return;
      }
   }
}

 

2.12 Как управлять параметрами объекта TDatabase

Ответ: Пример показывает как работать с различными параметрами коннекта к InterBase в том числе с именем и паролем пользователя

 void __fastcall TForm1::Button1Click(TObject *Sender)
   {
      try
      {
         // Создаем 2 буффера для имени пользователя
         // и его пароля.
         //
char *nameStr = new char[20];
         char *passStr = new char[20];

         // Закрываем Database1, устанавливаем параметры.
         //
         Database1->Close();
         Database1->DriverName = "INTRBASE";
         Database1->KeepConnection = true;
         Database1->LoginPrompt = false;
         Database1->Params->Add("SERVER NAME=d:\\IntrBase\\EXAMPLES\\EMPLOYEE.GDB");
         Database1->Params->Add("SCHEMA CACHE=8");
         Database1->Params->Add("OPEN MODE=READ/WRITE");
         Database1->Params->Add("SQLPASSTHRU MODE=SHARED NOAUTOCOMMIT");
	 sprintf(nameStr, "USER NAME=%s", Edit1->Text.c_str());
         Database1->Params->Add(nameStr);
         sprintf(passStr, "PASSWORD=%s", Edit2->Text.c_str());
         Database1->Params->Add(passStr);

         // Открываем Database1, и открываем таблицу
         //
         Database1->Open();
         Table1->Open();

         // Заполняем ComboBox именами таблиц в открытой базе данных
         Database1->Session->GetTableNames(Database1->DatabaseName, "*",
                                           true,
                                           true,
                                           ComboBox1->Items);

      }
      catch(EDBEngineError* dbError)
      {
         for (int i = 0; i < dbError->ErrorCount; i++)
         {
            MessageBox(0, dbError[i].Message.c_str(), "Error", MB_OK);
         }
      }
   }
 }

*****
© Банк лекций Siblec.ru
Формальные, технические, естественные, общественные, гуманитарные, и другие науки.