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

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.

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

femil

25 коментарів до “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. Ставим его (настраивать не нужно!)

    В билдере: подкл. “в шапке”

    #include 
    #include 
    #include 
    #include 
    

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

    __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 ниже):

    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 -> MessageBox("DSN успешно создан", "Сообщение", MB_OK);
       else
       {
          Application -> MessageBox("Произошла ошибка во время создания DSN",
               "Ошибка", MB_OK);
       }
    }
    //---------------------------------------------------------
    

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

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //---------------------------------------------------------
    DataModule2->ADOConnection1->ConnectionString =
    "Provider=MSDASQL.1;Persist Security Info=False;User ID=enzo;Data Source=reminderDB;Mode=ReadWrite";
    DataModule2->ADOConnection1->Connected = True;
    DataModule2->ADOTable1->Active = True;
    Label1->Caption = "DBstate: ON";
    Button1->Enabled = False;
    }
    //---------------------------------------------------------
    

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

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

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

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

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

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

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

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

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

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

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

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

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

    Error

    AdoTable1: Missing TableName property.

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

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

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

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

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

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

Залишити відповідь