SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 27.01.2009 00:40:22

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Работа с API MySQL

Уважаемы коллеги , начал изучать работу с 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) понятна - не прилинкована библиотека , то остальные не могу понять ???
Может кто сталкивался с схожими траблами ???

Неактивен

 

#2 27.01.2009 11:40:17

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Работа с API MySQL

Ошибка в строке 20 - это не "не прилинкована библиотека", а "не определен символ mysql_connect".
Попробуйте явно указать путь к заголовкам libmysqlclient. Есть стойкое ощущение, что #include <mysql.h>
подсасывает совсем не те файлы, которые Вы ожидаете.

Если он подцепляет правильный файл, то Вам нужно добавить еще несколько заголовков до
подключения mysql.h - те, в которых определяется SOCKET и fd_set.

Неактивен

 

#3 28.01.2009 00:34:08

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Работа с API MySQL

Благодарю за подсказки , но всё же .

1. Баги с ошибками в заглавных файлах решилась добавлением в проект ( чисто на бум) #include<windows.h>;

2. Состоял в половых отношениях с компилятором пытваясь запустить проект.
Просмотрел libmysql.dll при помощи утилиты View Dependencies , и пришёл к удивлению - в перечне функций включённых в dll , "mysql_connect" отсутствует.
Попробывал использовать другую функцию "mysql_real_connect" , с ней всё ОК!!!
По поводу отсутствия функции в dll , не много смущает , ведь она указана в mysql.h и должна вызываться из библиотеки.
Всё что нашёл в интернете по поводу использования API C MySQL ,устаревшая инфа на старые версии сервера , может в новых версиях сервера разработчик отказался от этой функции ???

Неактивен

 

#4 28.01.2009 01:04:06

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Работа с API 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).

+))

Неактивен

 

#5 28.01.2009 14:21:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Работа с API MySQL

Имеет смысл пользоваться документацией на сайте mysql.com - там она актуальная smile
Про mysql_connect - да, я бы мог заметить, но как-то примозолилось название из php.
Конечно же, mysql_real_connect.

Неактивен

 

#6 10.02.2010 05:10:11

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Доброй ночи Господа!
Вот не задача по теме:
.....
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;
.......
Как это полечить можно?
Буду очень признателен, за ранние спасибо!

Неактивен

 

#7 10.02.2010 05:52:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Работа с API MySQL

msdn написал:

Try #include <winsock.h> before #include <mysql.h>.

http://social.msdn.microsoft.com/Forums … 05a598dad2

Неактивен

 

#8 11.02.2010 03:08:55

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Доброй ночи Господа, уже четвёртые сутки бьюсь и всё без толку!
Пожалуйста, очень надо, помогите, залейте на форум рабочие API, такие как mysql.h, mysql_com.h ну и тому подобное, для связки Microsoft Visual Studio 2008 + MySQL5.1, а то я уже весь мозг извёл, не пинайте ногами я только начинаю, и мне надо написать лабораторную... А тут не в какую нейдёт ругается я уже все API пере редактировал, я в ужасе..
Буду очень признателен!

Отредактированно fox (11.02.2010 03:16:50)

Неактивен

 

#9 11.02.2010 04:30:41

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Ну вот как это понимать, поставил занова 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);

}

Очень надо помогите разобраться, за ранние спасибо!

Неактивен

 

#10 11.02.2010 16:42:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Работа с API MySQL

Ну, у Вас происходит ошибка компоновки (link). Нужно сказать компоновщику
путь до библиотеки (-L) и саму библиотеку (-lmysqlclient). Ключи указал для
компоновщика gcc, для msvc они другие, скорее всего, но точно есть, я когда-то
давно под windows строил клиентское приложение. Найти их проще всего через
GUI.

Неактивен

 

#11 11.02.2010 21:44:14

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Вы очень исчерпующе описали ситуацию, я вам блогадарен!
Но, неподскажите как это сделать я с виндовозом не в ладах где там, что надо и как порпавить?
Буду очень признателен!

Неактивен

 

#12 12.02.2010 11:50:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Работа с API MySQL

Для этого нужно иметь две вещи, которых у меня нету: windows и vs smile

В меню настройки проекта, ищите настройки компоновщика и там уже
добавляйте. Что-то вот такое:
http://qtwiki.org/Image:Profile_visual_ … ttings.png

Собственно, по скриншоту видно, что параметры /LIBPATH и непосредственно
mysqlclient.lib (только лучше, кажется, задавать их не из командной
строки, а все-таки через GUI).

Неактивен

 

#13 12.02.2010 21:59:32

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Спасибо огромное за помощь, вот по стопам этой ссылки я добил наконец то этот вопрос:
http://www.prog.org.ru/topic_8256_0.html
Огромное спасибо за помощь!

Неактивен

 

#14 17.02.2010 02:42:54

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Доброй Ночи Господа!
Вот снова не задача, в коде есть такая строка:

mysql_query(conn,"SELECT * FROM test");

и код весь нормально работает, но мне надо вводить имя таблицы, как это сделать?
Пробовал так, как в примере на одном сайте не прокатило(

mysql_query(conn,"SELECT * FROM ['tab']");

Ещё кучу вариантов пробовал тоже не катит, как туда засунуть переменную tab???
За ранние спасибо!

Неактивен

 

#15 17.02.2010 04:14:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Работа с API MySQL

Это ведь речь про C? Переменная tab это char*? Если так, то просто создайте строку запроса.

#include <stdio.h>
#define MAX_QUERY 10000

char query[MAX_QUERY];
sprintf(query, "SELECT * FROM `%s`", tab);
mysql_query(&mysql, query);


Этот метод небезопасен по отношению к длине строк (sprintf не проверяет превышает результат объем буфера query или нет). Для данного запроса это неважно, но для потенциально длинных запросов метод приведет к уязвимости переполнения буфера. Есть другие, безопасные к длине методы. Например, на C++ можно сделать так:

#include <iostream>
#include <string>
#include <sstream>

std::string query;
std:stringstream s;

s << "SELECT * FROM `" << tab << "`";
query = s.str();
mysql_query(&mysql, query.c_str());

Неактивен

 

#16 17.02.2010 04:34:08

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Спасибо Вы мне очень помогли!
Я принял к сведенью о не огроничении, и я вот так сделал:

char que[64];

sprintf(que, "SELECT * FROM `%s`", auen.tab);

mysql_query(conn,que);

Не пинайти меня ногами, я только учусь, мне много не понятно, например заначение вот такой строки:

#define MAX_QUERY 10000

Точнее сам смысел приминения, что это такое:

#define

Ещё раз огромное Спасибо за помощь!
P.S. Не могли бы вы мне подсказать литературу, только толковую, потому, что в инете куча книг но многие нет смысла открывать, точнее есть но там нет нечего нового а много воды!
Есть у вас в арсенале Толковая Книга по C++ или С++ и MySQL, или у вас есть своя настольная книга, порекомендуйте пожалусто...
Ещё раз огромное спасибо!

Неактивен

 

#17 17.02.2010 06:47:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Работа с API MySQL

define это просто определение жесткой константы. Препроцессор C заменит все константы в тексте на их значения до компиляции.

C++ и MySQL достаточно узкая тема, я не думаю, что требуется специальная книга. Изучайте отдельно MySQL, отдельно C++.  По C++ может быть Страуструп подойдет, хотя в нем много философии.

Я невольно научил Вас плохому подходу (а к плохому человек быстро привыкает). auen.tab приходит от пользователя? Представьте себе, что пользователь введет имя таблицы длиннее 60 символов. У вас будет Segmentation fault из-за переполнения буфера. Если используете такой подход, проверяйте strlen(auen.tab) до выполнения sprintf. Если хотите сохранить C-стиль, используйте безопасные функции объединения строк (такие, как strncpy, strncat).

Неактивен

 

#18 17.02.2010 12:37:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Работа с API MySQL

С++ — это в первую очередь философия. Читайте Страуструпа smile

А на чистом C это делается чуть громоздко, но зато правильно:

char *q;

q = strdup("SELECT * FROM `");

/* один байт на закрывающий символ ` и еще один байт на ноль в конце строки */
q = realloc(q, strlen(q) + strlen(tab) + 2);  

strcat(q, tab);
strcat(q, "`");

Неактивен

 

#19 17.02.2010 12:56:18

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Спасибо за помощь!
Приму к сведеньям, я так полагаю Вы говорили о этой книге?

http://masterpc.alfaspace.net/books/dow … up_lang_c/

Отредактированно fox (17.02.2010 12:57:29)

Неактивен

 

#20 17.02.2010 13:07:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Работа с API MySQL

Книга та, но вот «MS Word вариант» меня пугает smile

Неактивен

 

#21 17.02.2010 19:47:24

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Добрый вечер, а какой именно надо искать?
Точное название не подскажите?
Спасибо за внимание!

Неактивен

 

#22 17.02.2010 20:10:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Работа с API MySQL

Ну, книжка именно эта, просто формат испугал smile

Неактивен

 

#23 17.02.2010 20:31:02

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Работа с API MySQL

Ааа, сори...
Не вкурил, я просто в голове ношу свои заморочки MS vs *NIX, вот и сразу пошёл положной ветки размышления)
Я исключительно сторонник FreeBSD, но решил поучится программировать вначале именно на MS, есть на то причины... Конечно GCC я тоже особо не знаю, но пароллельно и там эксперементирую... Очень сильно хочу, изучить C++!!!!

Отредактированно fox (17.02.2010 20:34:06)

Неактивен

 

#24 13.03.2010 01:59:39

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Работа с API MySQL

Страуструп действительно очень хорош (создатель языка все же :-)) ), но "Самоучитель C++" Гербертa Шилдтa практичнее и в чем-то легче читается ). Правда #define - это уже к C относится, а не к c++ :-).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#25 13.03.2010 16:07:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Работа с API MySQL

Подозреваю, что существует масса хороших книг по С++. Тем не менее,
читая Страуструпа я приобрел те знания, которые позволили мне начать
писать на С++. А до этого я думал, что пишу на С++ (хотя писал на С) —
другие книги мне не дали философии языка (хотя, может, просто читал
невнимательно wink ).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson