MySQL C API (на MS Visual C++)

Tilk

Новичок
MySQL C API (на MS Visual C++)

Доброго времени суток.

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

Как пользопаться MySQL C API на MS Visual C++? (пользуюсь версией 9.0 Express Edition)

В частности не выходит запустить пример вот из этой статьи
http://www.citforum.ru/database/mysqldoc/mysqldoc_03.shtml

libmysql.lib добавлял в свойствах проекта.

Возможно это связано с тем, что статья старая и написана для версии MySQL 3.20.29? (Я пользуюсь 5.1.30 )
 

Tilk

Новичок
Вот билд лог.

------ Build started: Project: sqll, Configuration: Debug Win32 ------
Compiling...
main.cpp
e:\projects\sqll\sqll\mysql_com.h(243) : error C2146: syntax error : missing ';' before identifier 'fd'
e:\projects\sqll\sqll\mysql_com.h(243) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\projects\sqll\sqll\mysql_com.h(243) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\projects\sqll\sqll\mysql_com.h(245) : error C2146: syntax error : missing ';' before identifier 'The'
e:\projects\sqll\sqll\mysql_com.h(245) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\projects\sqll\sqll\mysql_com.h(245) : error C2146: syntax error : missing ';' before identifier 'following'
e:\projects\sqll\sqll\mysql_com.h(245) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\projects\sqll\sqll\mysql_com.h(245) : error C2146: syntax error : missing ';' before identifier 'variable'
e:\projects\sqll\sqll\mysql_com.h(245) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\projects\sqll\sqll\mysql_com.h(245) : error C2146: syntax error : missing ';' before identifier 'is'
e:\projects\sqll\sqll\mysql_com.h(245) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\projects\sqll\sqll\mysql_com.h(245) : error C2146: syntax error : missing ';' before identifier 'set'
e:\projects\sqll\sqll\mysql_com.h(245) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\projects\sqll\sqll\mysql_com.h(245) : error C2143: syntax error : missing ';' before 'if'
e:\projects\sqll\sqll\mysql_com.h(245) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\projects\sqll\sqll\mysql_com.h(248) : warning C4138: '*/' found outside of comment
e:\projects\sqll\sqll\mysql_com.h(249) : error C2238: unexpected token(s) preceding ';'
e:\projects\sqll\sqll\mysql_com.h(417) : error C2065: 'SOCKET' : undeclared identifier
e:\projects\sqll\sqll\mysql_com.h(417) : error C2146: syntax error : missing ')' before identifier 's'
e:\projects\sqll\sqll\mysql_com.h(418) : error C2059: syntax error : ')'
e:\projects\sqll\sqll\main.cpp(14) : error C2065: 'uint' : undeclared identifier
e:\projects\sqll\sqll\main.cpp(14) : error C2146: syntax error : missing ';' before identifier 'i'
e:\projects\sqll\sqll\main.cpp(14) : error C2065: 'i' : undeclared identifier
e:\projects\sqll\sqll\main.cpp(15) : error C3861: 'mysql_connect': identifier not found
e:\projects\sqll\sqll\main.cpp(22) : error C2065: 'i' : undeclared identifier
e:\projects\sqll\sqll\main.cpp(22) : error C2065: 'i' : undeclared identifier
e:\projects\sqll\sqll\main.cpp(22) : error C2065: 'i' : undeclared identifier
e:\projects\sqll\sqll\main.cpp(23) : error C2065: 'i' : undeclared identifier
Build log was saved at "file://e:\projects\sqll\sqll\Debug\BuildLog.htm"
sqll - 27 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
 

Alexandre

PHPПенсионер
я не работал с MS Visual C++ а только gcc
очевидно у тебя не подключена одна из требуемых библиотек
mysqlclien zlib ssl crypto
 

Tilk

Новичок
Alexandre
Попробовал добавить все сразу. mysqlclient.lib zlib.lib ssl.lib crypto.lib - никаких изменений. Как мне объяснили, за все что можно делать благодаря #include "mysql.h" отвечает библиотека libmysql.lib. Она у меня подключена...

Сергей Тарасов
Сорс 1 в 1, как в статье.

#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
void exiterr(int exitcode)
{
fprintf(stderr, "%s\n", mysql_error(&mysql));
exit(exitcode);
}
int main()
{
uint i = 0;
if (!(mysql_connect(&mysql,"host","username","password")))
exiterr(1);
if (mysql_select_db(&mysql,"payroll")) exiterr(2);
if (mysql_query(&mysql,"SELECT name,rate FROM emp_master"))
exiterr(3);
if (!(res = mysql_store_result(&mysql))) exiterr(4);
while((row = mysql_fetch_row(res))) {
for (i=0 ; i < mysql_num_fields(res); i++)
printf("%s\n",row);
}
if (!mysql_eof(res)) exiterr(5);
mysql_free_result(res);
mysql_close(&mysql);
}


Файлы mysql.h и все что к нему прилагаются (включая libmysql.lib) взял отсюда:
Program Files\MySQL\MySQL Server 5.1\include
 

fixxxer

К.О.
Партнер клуба
1)
-if (!(mysql_connect(&mysql,"host","username","password")))
+if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))

ибо mysql_connect может уже и не быть (если новая либа)

2) не корячимся и делаем Makefile
$ cat Makefile
PHP:
CC = gcc
INCLUDES = -I/usr/local/include/mysql
LIBS = -L/usr/local/lib/mysql -lmysqlclient

all: test

test.o: test.c
        $(CC) -c $(INCLUDES) test.c

test: test.o
        $(CC) -o test test.o $(LIBS)

clean:
        rm -f test test.o
в VC++ там cl/link/nmake пути другие итд, но смысл такой же
 

phprus

Moderator
Команда форума
Tilk
Файлы mysql.h и все что к нему прилагаются (включая libmysql.lib) взял отсюда:
Как понять взял отсюда? Не надо ничего брать. Надо прописывать путь к инклуд-директории в настройках проекта. Точно так-же и с *.lib. Не надо ее копировать, а нужно в настройках ее подключить и прописать к ней путь, чтобы компилятор знал где она находится.
 

Alexandre

PHPПенсионер
Как понять взял отсюда? Не надо ничего брать. Надо прописывать путь к инклуд-директории в настройках проекта. Точно так-же и с *.lib. Не надо ее копировать, а нужно в настройках ее подключить и прописать к ней путь, чтобы компилятор знал где она находится.
короче - нужно найти include файлы для всех вышеописанных библиотек и прописать к ним пути в свойствах проекта
инклуды можно найти в источниках mysql - директория includes
или начни с инклудов для mysql, возможно для инклуды др библиотек не понадобится


а вообще-то совет fixxxer - сделай nmake файл и не парься
 

Tilk

Новичок
Еще раз всем привет.

Во-первых огромное спасибо всем, отписавшимся здесь. Если честно ожидал, что снова пошлют на гугл, или еще подальше. И так не вылезаю оттуда...

phprus
Alexandre
Проблема была именно в этом. Вместо того, чтобы кидать все в папку проекта - прописал пути - помогло, куча ошибок пропала. А именно пропали все ошибки C2146 и C4430.

Кроме того
e:\projects\sqll\sqll\main.cpp(14) : error C2065: 'uint' : undeclared identifier

Заменил uint i = 0; на unsigned int i = 0;
Вроде помогло, во всяком случае ошибки вида "undeclared identifier" исчезла, без появления новых...

В итоге осталось вот это:

Compiling...
main.cpp
d:\program files\mysql\mysql server 5.1\include\mysql_com.h(243) : error C2146: syntax error : missing ';' before identifier 'fd'
d:\program files\mysql\mysql server 5.1\include\mysql_com.h(243) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\program files\mysql\mysql server 5.1\include\mysql_com.h(243) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\program files\mysql\mysql server 5.1\include\mysql_com.h(417) : error C2065: 'SOCKET' : undeclared identifier
d:\program files\mysql\mysql server 5.1\include\mysql_com.h(417) : error C2146: syntax error : missing ')' before identifier 's'
d:\program files\mysql\mysql server 5.1\include\mysql_com.h(418) : error C2059: syntax error : ')'
e:\projects\sqll\sqll\main.cpp(15) : error C3861: 'mysql_connect': identifier not found

Скажите пожалуйста, правильно ли я понимаю следующее - проблема в том, что для связи с MySQL базой программа использует сокеты, значит надо подключить библиотеку, отвечающую за сокеты и все будет работать?
 

Tilk

Новичок
d:\program files\mysql\mysql server 5.1\include\mysql_com.h(243) : error C2146: syntax error : missing ';' before identifier 'fd'
по дабл клику переносит сюда:
my_socket fd;

а вот это
d:\program files\mysql\mysql server 5.1\include\mysql_com.h(417) : error C2065: 'SOCKET' : undeclared identifier
по дабл клику переносит сюда:
int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen, unsigned int timeout);
 

Tilk

Новичок
Еще раз всем огромное спасибо, тему можно закрывать.

На случай если у кого-то есть такая же проблема

#include <winsock2.h> и подключение ws2_32.lib помогло

e:\projects\sqll\sqll\main.cpp(15) : error C3861: 'mysql_connect': identifier not found
решается тем, что надо использовать новую функцию mysql_real_connect
 
Сверху