Как правильно подключить MySQL к Си?

451
20 декабря 2017, 19:41

Не могу понять как нужно подключать MySQL к Си. Некоторые пишут, что это нужно делать через Connecter MySQL C, также говорят, что нужно указывать путь к заголовочному файлу... Мб вы поясните более подробно как именно это нужно делать...

Буду благодарен

Answer 1

В общем, подключать действительно надо через Connector. И заголовочные файлы - нужны. И пути к заголовочным файлам при сборке компилятору - надо. И пути к библиотеке (если библиотека не в стандартном месте для компилятора) - тоже указать надо.

Но вот использовать ли MySQL Connector, изначально заточенный под косяки Visual Studio - это еще большой вопрос. У меня с первого раза с MingW оно не завелось. Но есть еще MariaDB (форк MySQL) и его коннекторы вполне неплохо могут работать как с родной MariaDB, так и с MySQL. Но тут тоже не все гладко :-). Бинарники (библиотеки) тоже собраны под VS. Но можно стащить исходники и собрать со своим компилятором. Я взял отсюда: https://downloads.mariadb.org/f/client-native-2.0.0/src/mariadb_client-2.0.0-src.tar.gz/from/http%3A//ftp.hosteurope.de/mirror/archive.mariadb.org/?serve коннектор версии 2.0.0 (почему-то 2.1.0 не завелся :-( - может я чего не так просил?..), установил себе CMake, сконфигурировал и сгенерил мейкфайлы, а затем просто командой make (в каталоге коннектора/клиента) собрал библиотеки. С mingw-w64 gcc 7.2 (сейчас перепроверил) этот коннектор нормально собрался. Далее, сгенерированную библиотеку (там есть и статическая, и динамическая) подложил к проекту - и все заработало.

Makefile для сборки с библиотекой коннектора можно примерно такой (да он и не нужен для маленького примера, но раз валялся...):

CC = gcc
INCLUDES = -I e:\cpp\mysql\mariadb_client-2.0.0-src\include
LIBS = -L e:\cpp\mysql\mariadb_client-2.0.0-src\libmariadb -llibmariadb.dll
#LIBS = -L e:\cpp\mysql\mariadb_client-2.0.0-src\libmariadb -lmariadbclient # статическая библиотека
all: mysql_query
mysql_query.o: mysql_query.c
      $(CC) -c $(INCLUDES) mysql_query.c
mysql_query: mysql_query.o
      $(CC) -o mysql_query mysql_query.o $(LIBS) 
clean:
      rm -f mysql_query mysql_query.o

Естественное, пример программы я брал тоже из стандартных примеров или из книжки.

И на всякий случай привожу тестовую программу - файл mysql_query.c:

#include <my_global.h>
#include <mysql.h>
#include <errmsg.h>
#include <mysqld_error.h>
int main(int argc, char *argv[])
{
  // Дескриптор соединения
  MYSQL conn;
  // Получаем дескриптор соединения
  if(!mysql_init(&conn))
  {
    fprintf(stderr, "Error: can't create MySQL-descriptor\n");
    exit(1);
  } 
  // Устанавливаем соединение с базой данных
  if(!mysql_real_connect(&conn,
                         "localhost",
                         "root",
                         "",
                         "shop",
                         0,
                         NULL,
                         0))
  {
    // Если соединение не установлено выводим сообщение об ошибке
    fprintf(stderr, "Error: %s\n", mysql_error(&conn));
    exit(1);
  }
  // Устанавливаем кодировку соединения, чтобы предотвратить
  // искажения русского текста
  if(mysql_query(&conn, "SET NAMES 'cp1251'") != 0)
  {
    // Если кодировку установить невозможно - выводим сообщение об ошибке
    fprintf(stderr, "Error: can't set character set\n");
    exit(1);
  }
  // Добавляем новый раздел - "Накопители"
  if(mysql_query(&conn, "INSERT INTO catalogs VALUES (NULL,'Накопители')") != 0)
  {
    // Если добавить запись не получилось - выводим сообщение об ошибке
    fprintf(stderr, "Error: can't execute INSERT-query\n");
    exit(1);
  }
  // Закрываем соединение с сервером базы данных
  mysql_close(&conn);
}
READ ALSO
Возможно ли подружить vba макрос и c#

Возможно ли подружить vba макрос и c#

У меня имеется Sharepoint приложение по сохранению выбранных файлов на файл-сервереНеобходимо перед загрузкой файла обрабатывать xlsx файл VBA макросом

242
Не записывается Master Boot Record раздел в файл

Не записывается Master Boot Record раздел в файл

Пытаюсь создать копию MBR записывая её в файл mbrimg:

298
Встраивание другого приложения в свое

Встраивание другого приложения в свое

Допустим, есть приложение, написанное на каком-то языкеДанное приложение не имеет API, но имеет некоторый интерфейс

336
Не создается база данных в entity framework?

Не создается база данных в entity framework?

Что может быть причиной данной ошибки?

283