Задавайте вопросы, мы ответим
Вы не зашли.
Уважаемы коллеги , начал изучать работу с C API MySQL и при компиляции простого примера компилятор сразу выдал кучу ошибок - и все в в загаловочных файлах .
ОС ХР , компилятор MSVC6.0 , исходники от MySQL 5.0.51
/*************************************************************************************************/
/*Текст программы : */
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
typedef unsigned int uint;
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[i]);
}
if (!mysql_eof(res)) exiterr(5);
mysql_free_result(res);
mysql_close(&mysql);
return 0;
};
/************************************************************************************************/
Сообщения об ошибках:
-------------------Configuration: example - Win32 Debug--------------------
Compiling...
example.cpp
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(183) : error C2146: syntax error : missing ';' before identifier 'fd'
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(183) : error C2501: 'SOCKET' : missing storage-class or type specifiers
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(183) : error C2501: 'fd' : missing storage-class or type specifiers
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(358) : error C2065: 'SOCKET' : undeclared identifier
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(358) : error C2146: syntax error : missing ')' before identifier 's'
c:\program files\microsoft visual studio\vc98\include\mysql_com.h(359) : error C2059: syntax error : ')'
c:\program files\microsoft visual studio\myprojects\custom_server\example.cpp(20) : error C2065: 'mysql_connect' : undeclared identifier
Error executing cl.exe.
example.obj - 7 error(s), 0 warning(s)
Если ошибка в строке (20) понятна - не прилинкована библиотека , то остальные не могу понять ???
Может кто сталкивался с схожими траблами ???
Неактивен
Ошибка в строке 20 - это не "не прилинкована библиотека", а "не определен символ mysql_connect".
Попробуйте явно указать путь к заголовкам libmysqlclient. Есть стойкое ощущение, что #include <mysql.h>
подсасывает совсем не те файлы, которые Вы ожидаете.
Если он подцепляет правильный файл, то Вам нужно добавить еще несколько заголовков до
подключения mysql.h - те, в которых определяется SOCKET и fd_set.
Неактивен
Благодарю за подсказки , но всё же .
1. Баги с ошибками в заглавных файлах решилась добавлением в проект ( чисто на бум) #include<windows.h>;
2. Состоял в половых отношениях с компилятором пытваясь запустить проект.
Просмотрел libmysql.dll при помощи утилиты View Dependencies , и пришёл к удивлению - в перечне функций включённых в dll , "mysql_connect" отсутствует.
Попробывал использовать другую функцию "mysql_real_connect" , с ней всё ОК!!!
По поводу отсутствия функции в dll , не много смущает , ведь она указана в mysql.h и должна вызываться из библиотеки.
Всё что нашёл в интернете по поводу использования API C MySQL ,устаревшая инфа на старые версии сервера , может в новых версиях сервера разработчик отказался от этой функции ???
Неактивен
Вот ещё нашёл интересную инфу по теме:
"Как использовать базу данных MySQL в своей программе? (под Windows)"
Подключите к проекту libMySql.lib, положите заголовочные файлы из поставки MySQL в директорию заголовочных файлов вашего компилятора, либо в каталог с программой, либо вообще куда душе угодно (лишь бы сами их не потеряли), libmysql.dll в каталог с программой, и пользуетесь функциями API MySQL, которые подробнейшим образом описаны в поставляемой вместе с сервером документацией. libmysql.lib и libmysql.dll берутся после установки дистрибутива MySQL в каталоге lib\opt.
libmysql.lib ОБЯЗАТЕЛЬНО должен работать с libmysql.dll ТОЙ ЖЕ поставки/версии. По этой причине НАСТОЯТЕЛЬНО НЕ рекомендуется хранить libmysql.dll в системном каталоге WINDOWS! Храните свою libmysql.dll в каталоге со своей программой.
Для C++ Builder получить libmysql.lib нужно импортом из libmysql.dll:
> implib libmysql.lib libmysql.dll
Из заголовочных файлов требуются:
mysql.h
mysql_com.h
mysql_version.h
В последних версиях ещё и my_alloc.h
Всё это добро берётся после установки дистрибутива MySQL в каталоге include.
Из всех в программе подключается только mysql.h. Перед ним обязательно должно быть подключен windows.h
#include <windows.h>
#include <mysql.h>
Особенности Билдеровского VCL: В программах, использующих VCL, компилятор ругается на my_socket, объявленную в mysql.h как #define my_socket SOCKET. Заменяем на #define my_socket UINT_PTR и всё работает. (SOCKET в winsock.h объявлен как typedef UINT_PTR SOCKET).
+))
Неактивен
Имеет смысл пользоваться документацией на сайте mysql.com - там она актуальная
Про mysql_connect - да, я бы мог заметить, но как-то примозолилось название из php.
Конечно же, mysql_real_connect.
Неактивен
Доброй ночи Господа!
Вот не задача по теме:
.....
c:\program files\microsoft visual studio 9.0\vc\include\mysql_com.h(417) : error C2065: SOCKET: необъявленный идентификатор
c:\program files\microsoft visual studio 9.0\vc\include\mysql_com.h(417) : error C2226: синтаксическая ошибка: непредвиденный тип "sockaddr"
.......
Вот сама строка 417 из файла mysql_com.h:
.......
int my_connect (my_socket); int s, const struct sockaddr *name, unsigned int namelen, unsigned int timeout;
.......
Как это полечить можно?
Буду очень признателен, за ранние спасибо!
Неактивен
msdn написал:
Try #include <winsock.h> before #include <mysql.h>.
Неактивен
Доброй ночи Господа, уже четвёртые сутки бьюсь и всё без толку!
Пожалуйста, очень надо, помогите, залейте на форум рабочие API, такие как mysql.h, mysql_com.h ну и тому подобное, для связки Microsoft Visual Studio 2008 + MySQL5.1, а то я уже весь мозг извёл, не пинайте ногами я только начинаю, и мне надо написать лабораторную... А тут не в какую нейдёт ругается я уже все API пере редактировал, я в ужасе..
Буду очень признателен!
Отредактированно fox (11.02.2010 03:16:50)
Неактивен
Ну вот как это понимать, поставил занова Visual Studai 2008, затем MySQL 5.1.43, перекоприровал include, затем dll и lib, и вот что он выдаёт:
------ Построение начато: проект: mysql, Конфигурация: Debug Win32 ------
Компиляция...
mysql.cpp
Компоновка...
mysql.obj : error LNK2019: ссылка на неразрешенный внешний символ _mysql_close@4 в функции _main
mysql.obj : error LNK2019: ссылка на неразрешенный внешний символ _mysql_query@8 в функции _main
mysql.obj : error LNK2019: ссылка на неразрешенный внешний символ _mysql_real_connect@32 в функции _main
mysql.obj : error LNK2019: ссылка на неразрешенный внешний символ _mysql_errno@4 в функции _main
mysql.obj : error LNK2019: ссылка на неразрешенный внешний символ _mysql_error@4 в функции _main
mysql.obj : error LNK2019: ссылка на неразрешенный внешний символ _mysql_init@4 в функции _main
C:\CPP\Projects\mysql\Debug\mysql.exe : fatal error LNK1120: 6 неразрешенных внешних элементов
Журнал построения был сохранен в "file://c:\CPP\Projects\mysql\mysql\Debug\BuildLog.htm"
mysql - ошибок 7, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
При попытки скампелить вот что:
#include "stdafx.h"
//
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;
conn = mysql_init(NULL);
if (conn == NULL) {
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
exit(1);
}
if (mysql_real_connect(conn, "localhost", "root", "password", NULL, 0, NULL, 0) == NULL) {
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
exit(1);
}
if (mysql_query(conn, "create database testdb")) {
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
exit(1);
}
mysql_close(conn);
}
Очень надо помогите разобраться, за ранние спасибо!
Неактивен
Ну, у Вас происходит ошибка компоновки (link). Нужно сказать компоновщику
путь до библиотеки (-L) и саму библиотеку (-lmysqlclient). Ключи указал для
компоновщика gcc, для msvc они другие, скорее всего, но точно есть, я когда-то
давно под windows строил клиентское приложение. Найти их проще всего через
GUI.
Неактивен
Вы очень исчерпующе описали ситуацию, я вам блогадарен!
Но, неподскажите как это сделать я с виндовозом не в ладах где там, что надо и как порпавить?
Буду очень признателен!
Неактивен
Для этого нужно иметь две вещи, которых у меня нету: windows и vs
В меню настройки проекта, ищите настройки компоновщика и там уже
добавляйте. Что-то вот такое:
http://qtwiki.org/Image:Profile_visual_ … ttings.png
Собственно, по скриншоту видно, что параметры /LIBPATH и непосредственно
mysqlclient.lib (только лучше, кажется, задавать их не из командной
строки, а все-таки через GUI).
Неактивен
Спасибо огромное за помощь, вот по стопам этой ссылки я добил наконец то этот вопрос:
http://www.prog.org.ru/topic_8256_0.html
Огромное спасибо за помощь!
Неактивен
Доброй Ночи Господа!
Вот снова не задача, в коде есть такая строка:
mysql_query(conn,"SELECT * FROM test");
и код весь нормально работает, но мне надо вводить имя таблицы, как это сделать?
Пробовал так, как в примере на одном сайте не прокатило(
mysql_query(conn,"SELECT * FROM ['tab']");
Ещё кучу вариантов пробовал тоже не катит, как туда засунуть переменную tab???
За ранние спасибо!
Неактивен
Это ведь речь про C? Переменная tab это char*? Если так, то просто создайте строку запроса.
Неактивен
Спасибо Вы мне очень помогли!
Я принял к сведенью о не огроничении, и я вот так сделал:
char que[64];
sprintf(que, "SELECT * FROM `%s`", auen.tab);
mysql_query(conn,que);
Не пинайти меня ногами, я только учусь, мне много не понятно, например заначение вот такой строки:
#define MAX_QUERY 10000
Точнее сам смысел приминения, что это такое:
#define
Ещё раз огромное Спасибо за помощь!
P.S. Не могли бы вы мне подсказать литературу, только толковую, потому, что в инете куча книг но многие нет смысла открывать, точнее есть но там нет нечего нового а много воды!
Есть у вас в арсенале Толковая Книга по C++ или С++ и MySQL, или у вас есть своя настольная книга, порекомендуйте пожалусто...
Ещё раз огромное спасибо!
Неактивен
define это просто определение жесткой константы. Препроцессор C заменит все константы в тексте на их значения до компиляции.
C++ и MySQL достаточно узкая тема, я не думаю, что требуется специальная книга. Изучайте отдельно MySQL, отдельно C++. По C++ может быть Страуструп подойдет, хотя в нем много философии.
Я невольно научил Вас плохому подходу (а к плохому человек быстро привыкает). auen.tab приходит от пользователя? Представьте себе, что пользователь введет имя таблицы длиннее 60 символов. У вас будет Segmentation fault из-за переполнения буфера. Если используете такой подход, проверяйте strlen(auen.tab) до выполнения sprintf. Если хотите сохранить C-стиль, используйте безопасные функции объединения строк (такие, как strncpy, strncat).
Неактивен
С++ — это в первую очередь философия. Читайте Страуструпа
А на чистом C это делается чуть громоздко, но зато правильно:
Неактивен
Спасибо за помощь!
Приму к сведеньям, я так полагаю Вы говорили о этой книге?
http://masterpc.alfaspace.net/books/dow … up_lang_c/
Отредактированно fox (17.02.2010 12:57:29)
Неактивен
Книга та, но вот «MS Word вариант» меня пугает
Неактивен
Добрый вечер, а какой именно надо искать?
Точное название не подскажите?
Спасибо за внимание!
Неактивен
Ну, книжка именно эта, просто формат испугал
Неактивен
Ааа, сори...
Не вкурил, я просто в голове ношу свои заморочки MS vs *NIX, вот и сразу пошёл положной ветки размышления)
Я исключительно сторонник FreeBSD, но решил поучится программировать вначале именно на MS, есть на то причины... Конечно GCC я тоже особо не знаю, но пароллельно и там эксперементирую... Очень сильно хочу, изучить C++!!!!
Отредактированно fox (17.02.2010 20:34:06)
Неактивен
Страуструп действительно очень хорош (создатель языка все же :-)) ), но "Самоучитель C++" Гербертa Шилдтa практичнее и в чем-то легче читается ). Правда #define - это уже к C относится, а не к c++ :-).
Неактивен
Подозреваю, что существует масса хороших книг по С++. Тем не менее,
читая Страуструпа я приобрел те знания, которые позволили мне начать
писать на С++. А до этого я думал, что пишу на С++ (хотя писал на С) —
другие книги мне не дали философии языка (хотя, может, просто читал
невнимательно ).
Неактивен