C++ Builder: создаем соединение с БД MySQL

Для того, чтоб создать соединение с базой данных MySQL из проекта в C++ Builder нам, прежде всего, понадобится соответствующий драйвер. Я использовала этот – mysql-connector-odbc-5.1.6-win32 (требуется установка).

После нам нужно произвести настройку. Для этого открываем Пуск → Настройка → Панель управления → Администрирование → Источники данных (ODBC).

Здесь нам предстоит добавить новый источник данных пользователя (на вкладке «Пользовательский DSN»). После нажатия на кнопку «Добавить» выбираем установленный драйвер – MySQL ODBC 5.1 Driver.

Заполняем данные в окошке «MySQL Connector/ODBC Data Source Configuration», например так, как представлено на скрине ниже. После тестируем соединение (кнопочка «Test»). Если все successful – закрываем окно.

MySQL Connector/ODBC Data Source Configuration

Теперь переходим непосредственно к проекту. Для создания соединения будем использовать такие компоненты: ADOTable (с вкладки ADO), DataSource (с вкладки Data Access), DBGrid (с вкладки Data Controls).

Начнем с настройки ADOTable, а именно со свойства ConnectionString. В качестве поставщика данных следует выбрать Microsoft OLE DB Provider for ODBC Drivers. Далее, в выпадающем списке «Использовать имя источника данных» следует выбрать название созданного источника данных (в примере – MySQL). После этого – проверьте подключение. Если все успешно – значит вы все сделали верно.

Дальнейшую настройку компонентов (для создания самого простого варианта подключения) я описывала в этой заметке – C++ Builder: подключение к Access.

Удачных экспериментов!

25 comments on “C++ Builder: создаем соединение с БД MySQL

  1. Это здорово, вот только после «release» сборки проекта это программа на другой машине за базу не зацепится. Как собрать драйвер из mysql-connector-odbc-5.* для С++ builder6 не подскажите, чтобы можно было программу использовать на «любой» машине с Windows? Был бы очень признателен за такую инструкцию или ссылку на подробное обсуждение вопроса)

  2. А предполагается, что на другой машине уже будет установлен мускул?
    Если так, тогда нужно создать файловый DNS (вкладка Администрирование -> Источники данных (ODBC)). После коннект создавать на базе данного файла (ну и переносить его на каждую машину).
    И еще: спасибо за идею — в ближайшем будущем постараюсь рассмотреть данный момент подробнее. =)

  3. Вам тоже не удалось осуществить соединение штатными средствами через dbExpress или Вы этот вариант не смотрели. У меня в паре C++ Builder 2010 — MySQL Server 5.0 при клике на Connect компонента TSQLConnection устойчиво возникает ошибка «Cannot load libmysql.dll driver (Error code 126)…»
    После перемещения этого драйвера из папки «…MySQL Server 5.0bin» в «…EmbarcaderoRad Studio7.0bin» осталось то же соотщение об ошибке, но с кодом ошибки 0, который означает, что ошибки нет.
    Пробовали ли Вы работу через dbExpress?
    Привет!

    1. Привет =)
      Честно говоря, создать коннект стандартными средствами я пробовала года четыре назад. И… ничего не вышло. Не хватало какой-то библиотеки (естественно, какой именно я уже не помню). А посему соединение было создано при помощи драйвера. С ним проще ))

  4. Выход нашел, для Builder, но есть трудность. О ней напишу в заключении.
    Цель: Связать mysql в builder С++ 6
    1. Качаем мускул коннектор тут: http://dev.mysql.com/downloads/connector/odbc
    2. Ставим его (настраивать не нужно!)

    В билдере: подкл. «в шапке»

    1
    2
    3
    4
    
    #include <odbcinst.h>
    #include <sysutils.hpp>
    #include <odbcss.h>
    #include <odbcver.h>

    3. При создании формы добавить это:

    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    __fastcall TForm1::TForm1(TComponent* Owner)//функ.создания формы
            : TForm(Owner)
    {
    //---------------------------------------------------------
    RETCODE SQLDataSources(HENV hEnv, UWORD fDirection, UCHAR * szDSN,
          SWORD cbDSNMax, SWORD *pcbDSN, UCHAR * szDescription,
          SWORD cbDescriptionMax, SWORD * pcbDescription );
     
    BOOL SQLConfigDataSources(HWND hwndParent, WORD fRequest,
          LPCSTR lpszDriver, LPCSTR lpszAttributes);
     
    RETCODE SQLAlocEnv(HENV * hEnv);
    RETCODE SQLFreeEnv(HENV hEnv);
    }
    //---------------------------------------------------------

    4. Далее: Создание системного источника данных ODBC программно[ODBC Connector должен быть установлен](процедура нажатия на кнопку3 ниже):

    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    //---------------------------------------------------------
    WORD fRequest = ODBC_ADD_SYS_DSN;
    // UCHAR lpszDriver[] = "Microsoft Access Driver (*.mdb)";
       UCHAR lpszDriver[] = "MySQL ODBC 5.1 Driver";
       UCHAR lpszAttributes[255] = "PWD=alien;UID=enzo;DSN=reminderDB;DATABASE=reminder;SERVER=192.168.1.98";
       bool retCode;
     
       retCode = SQLConfigDataSource(NULL, fRequest, lpszDriver, lpszAttributes);
       if (retCode == true)
          Application -&gt; MessageBox("DSN успешно создан", "Сообщение", MB_OK);
       else
       {
          Application -&gt; MessageBox("Произошла ошибка во время создания DSN",
               "Ошибка", MB_OK);
       }
    }
    //---------------------------------------------------------

    5. В ADOConnection(тоже на кнопку):

    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //---------------------------------------------------------
    DataModule2-&gt;ADOConnection1-&gt;ConnectionString =
    "Provider=MSDASQL.1;Persist Security Info=False;User ID=enzo;Data Source=reminderDB;Mode=ReadWrite";
    DataModule2-&gt;ADOConnection1-&gt;Connected = True;
    DataModule2-&gt;ADOTable1-&gt;Active = True;
    Label1-&gt;Caption = "DBstate: ON";
    Button1-&gt;Enabled = False;
    }
    //---------------------------------------------------------

    6. Дальше все стандартно, аналогично работе с аксесом.(по-сути это и была переделка из аксеса под мускул, взятая с «codenet»)
    //при коннете потребует библиотеку, она есть в системе(system32), ее нужно закинуть в папку с проектом

    А теперь вопрос, в котором возникла трудность:
    Источник данных создается программно, но только если установлен ОДБЦшный коннектор. Пробовал брать эти 4 библиотеки из папки ODBCConnector, прогонял через билдеровскую утилиту implib добавлятл в проект. Тщетно — программа из ищет все равно по пути установки коннектора(((
    Пробовал переименовать папку с коннектором, тогда источник данных не создается вообще.
    з.ы. Прошу прощения за ошибки в тексте и разметку. торопился написать, да и блог не очень подходит для приведения примеров кода, так что сорри) Надеюсь на вашу помощь..

  5. в #inclede косяк вышел — тэги помешали. Там в треугольных скобках это:

    #include odbcinst.h
    #include sysutils.hpp
    #include odbcss.h
    #include odbcver.h

  6. ээ.. Чуть не забыл:
    Программа подключается к выделенному mysql серверу на линукс
    машине с ip 192.168.1.98
    на стд. порт 3306
    с именем пользователя ‘enzo’ и паролем доступа к базе ‘alien’

  7. Вы забыли упомянуть прописан ли CLASSPATH под это все дело. И, если да, то какой?
    А если не прописан, то, скорее всего, именно из-за его отсутствия вся беда.

    P.S.: «Пост ваш немного отредактировала — для повышения удобочитаемости»

  8. Спасибо) ээ — «CLASSPATH» не раз не слышал, если честно. По логике вещей это какой то путь к классу.. Но к какому.. Спасибо за наводку, буду искать в чем трабл)

  9. Та нее, пока 0. отложил в долгий ящик, до востребования. Такое чувство что builder-client > ODBC-driver > mysql server(on UNIX) стало не актуально, т.к. решения проблемы найти пока не удалось. а бегать ставить «коннекторы» на кучу машин религия не позволяет)) А коннект то давно работает, нет просто возможности перенести на любую тачку без пляски с установкой вышеупомянутого коннектора, что очень печально.

  10. Если начать писать на Вижуале то должно быть лучше, но после builder как то не хочется писать все ручками, ох как не хочется!

    1. Естественно, ручками писать не хочется. Плюс, не факт, что будет лучше.
      А «транспортабельный» источник данных ODBC создать не получилось? Или под линуксом его использовать нельзя?..

  11. «Транспортабельный» — можно, но очень мучительно. Оказалось ODBC коннектор прописывается в реестре, эту ветку нашел, поправил пути к библиотекам, но запускать регу на каждой машине тоже не хочется. Да и пути в разных архитектурах 32 и x64 различаются, также влияет и дистрибутив системы XP и 7.
    Под линуксом нельзя использовать клиента, созданного на C++ builder, необходимость в коннекторе отпадает сама собой)

    1. Это «транспортабельностью» нельзя назвать. Если необходимо вносить запись в реестр — значит нужен инсталлер, а не танцы с бубном возле каждой машины.

      > Под линуксом нельзя использовать клиента, созданного на C++ builder…

      Судя по всему, я вас не верно поняла. Со мной бывает =)

  12. Приветствую, такой вопросик, я когда уже все практически настроил в проекте, связал Mysql с C++ Билдером, в конце настройки нужно во вкладке ADOTable поставить True в Active, я ставлю и он выводит ошибку:

    Error

    AdoTable1: Missing TableName property.

    Низнаю что и делать. Весь инет перерыл. Прошу помощи 🙂

    1. Добрый день.
      А вы задали название таблицы (свойство TableName компонента ADOTable1)? Она точно в той БД с которой вы создали коннект?

      Эта ошибка («AdoTable1: Missing TableName property») говорит о том, что компилятор нашел трабл в названии таблицы.

      1. Понял что за ошибка, я не указал к какой таблице коннектить, их в бд у меня много.

        1. Даже если бы она (таблица) была одна — все равно следовало бы указать, с какой именно таблицей необходимо создать связь.

  13. ИМХО лучше все ручками в коде прикреплять(соединять) и выносить в отдельный include, иначе путаницы в серьезном проекте не избежать..

    1. Если речь о большом проекте — тогда да, отдельно следует делать модуль коннекта. Для удобства. Ну, а в случае с небольшими программами это просто нецелесообразно. Мне кажется…

    1. не хочу капчу =(
      но они действительно разбушевались, т.ч. временно (а как известно, нет ничего более постоянного, чем временное) поставлю галочку напротив «автор должен иметь ранее одобренные комментарии». Вот.

      P.S.: «По поводу фото: главный вопрос — зачем? И да, письма вам приходят с моего основного мыла — никто не мешает посетить «Мой Мир» или как там эта соц.сеть называется )))»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *