Borland C++ Builder - Ответы на часто задаваемые вопросы
Borland C++ Builder FAQ. Ответы на часто задаваемые вопросы | Материал подготовлен в Демоцентре клиент - серверных технологий фирмы "Borland". тел. 913-5608 913-2934 е-mail cbuilder@demo.ru Составители : Aндрей Сергеев, Дмитрий Кузьменко. 22.12.96 г. Москва | 0. Введение 1. Общие вопросы 2. Технические вопросы 0.1 Какова цель этого документа? 0.2 Как я могу получить последнюю версию FAQ ? 0.3 Замечания 1.1 Что такое Borland C++ Builder? 1.2 Чем отличается от Delphi? 1.3 Borland C++ Builder - это новая версия С/С++ продуктов фирмы Borland? 1.4 Что входит в поставку? 1.5 Когда выходит релиз продукта? 1.6 Сколько стоит этот продукт? 1.7 Как можно с ним ознакомиться? 1.8 Как можно оформить получение последних новостей по С++ Builder? 1.9 Под какие платформы можно разрабатывать программы на С++ Builder? 1.10 В чем выражается соответствие стандарту С++? 1.11 Смогу ли я использовать свои старые наработки на С++? 1.12 Смогу ли я использовать в проектах OWL? 1.13 Какие технологии Win32 поддерживает С++ Builder? 1.14 Что такое компонентная технология? 1.15 Какие компоненты входят в поставку? 1.16 Как организованна VCL библиотека? 1.17 На каком уровне сделана интеграция с другими инструментами? 1.18 Какие параметры машины разработчика требуются для нормальной работы С++ Builder? 1.19 Какого размера создаются исполняемые модули? 1.20 Какие Internet - направленные программы можно создавать c помощью C++ Builder? 1.21 Каким образом в C++ Builder реализован доступ к базам данных? 1.22 С какими SQL серверами может работать программа написанная на C++ Builder? 1.23 Какие дополнительные библиотеки входят в поставку? 2.1. Рекомендации по установке. 2.2. Какие изменения внесены в компилятор 2.3. Какие могут быть типы свойств? 2.4. Как можно перенаправить ввод подсказок (Hints) на свой компонент? 2.5. Как создать форму на этапе исполнения? 2.6. Как работать с функциями Win32 API в С++ Builder 2.7. Как работать с компонентой TQuery и обработкой исключительных ситуаций возникающих при работе с базами данных. 2.8. Как в С++ Builder работать с параметрами SQL запросов. 2.9. Можно ли применять стандартные функции форматирования из RTL [ sprintf() ] 2.10. Когда нужно использовать методы Open(), ExecSQL() объекта TQuery. 2.11. При работе с SQL серверами для разделения уровней изоляции применяются транзакции, как они оформляются в программе на С++ в C++ Builder. 2.12. Как управлять параметрами объекта TDatabase 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); } } } } | Демоцентр клиент-серверных технологий фирмы "Borland" - это маркетинговый проект российской фирмы "Epsylon Technologies" наиболее известного технологического партнера Borland в России.
|