вторник, 29 марта 2011 г.

1-я статья по взаимодействию с СУБД MySQL из программы на C++

Немного теории


Код:

// Дескриптор соединения. 
// Структура, содержащая HANDLE для одного подключения к серверу.
MYSQL mysql;
MYSQL_RES *res; // Дескриптор результирующей таблицы
MYSQL_ROW row; //  Массив полей текущей строки
// Структура, которая содержит всю информацию, 
// касающуюся отдельного поля таблицы
MYSQL_FIELD *field;
Функиции которые понабодятся:

Функция инициализации.
Код:

MYSQL *mysql_init(MYSQL *mysql);
Где соответственно host — компьютер, на котором запущена СУБД MySQL, user — имя юзера для подключения, passwd — пароль, db — название предполагаемой для использования базы данных, port — порт, unix_socket — сокет или pipe-канал, который необходимо использовать.
Код:

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, 
                          const char *passwd, const char *db,
                          unsigned int port, const char *unix_socket, 
                          unsigned int client_flag);
client_ flag может принимать несколько значений:

CLIENT_COMPRESS — используется сжатие.
CLIENT_FOUND_ROWS — возвращать число найденных строк.
CLIENT_IGNORE_SPACE — делает все имена функций зарезервированными словами.
CLIENT_INTERACTIVE — разрешает interactive_timeout секунд бездействовать (вместо wait_timeout) перед закрытием подключения.
CLIENT_NO_SCHEMA — запрещает синтаксис вида "db_name.tbl_name.col_name" (имя_базы_данных.имя_таблицы.имя_ко лонки). Используется для ODBC.
CLIENT_ODBC — устанавливает то, что это клиент ODBC.
CLIENT_SSL — используется защищенный протокол SSL.

Мы флагами пользоваться не будем.

Функция выполняющая запрос
Код:

int mysql_query(MYSQL *mysql, const char *query);
Функция возвращающая строку с описанием ошибки
Код:

char *mysql_error(MYSQL *mysql);
Функция, которая получает все строки результата запроса и хранит их в буфере-клиенте
Код:

MYSQL_RES * mysql_store_result(MYSQL *mysql);
Функция получает количество строк в результате запроса
Код:

my_ulonglong mysql_num_rows(MYSQL_RES *res);
Функция получает количество полей (столбцов) в результате запроса
Код:

unsigned int mysql_num_fields(MYSQL_RES *res);
Функция заполняет массив полей для текущей строки
Код:

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
Функция заполняет структуру для текущего поля (fieldnr)
Код:

MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *res, unsigned int fieldnr);
Начальная "настройка"

Для работы в Builder необходимо конвертировать libmysql.lib.
Для этого, нужно открыть консоль и набрать там это

Код:

C:\>"C:\Program Files\Borland\CBuilder6\Bin\coff2omf.exe" 
-lib:st "C:\Program Files\Borland\CBuilder6\Lib\libmysql.lib" 
"C:\Program Files\Borland\CBuilder6\Lib\libmysql_.lib"
Здесь "C:\Program Files\Borland\CBuilder6\Lib\libmysq l.lib" оригинальная библиотека,
а "C:\Program Files\Borland\CBuilder6\Lib\libmysq l_.lib" конвертированная

У каждого пути будут свои.
Также в папке с программой (или в "C:\Program Files\Borland\CBuilder6\Lib\") должны быть libmysql_.lib, а для VS libmysql.dll.
Заголовочные файлы можно бросить в папку с программой или в "C:\Program Files\Borland\CBuilder6\Include\".
Для VS "C:\Program Files\Microsoft Visual Studio Х.0\VC\include". Где Х - версия VS.
В среде MS VC++ можно использовать библиотеку без конвертации, т.е. libmysql.lib.
Все заголовочные файлы могут быть в папке с программой, но тогда нужно подключать их локально.

Есть замечания для VC++ WinForms.
Так как типы String^ и char[] несовместимы, то для конвертирования из String^ в char[] можно использовать следующие функции (взято из MySQL++):
Код:

private: String^ ToUCS2(const char* utf8)
{
     try
     {
  return gcnew String(utf8, 0, strlen(utf8), System::Text::Encoding::Default);
     }
     catch(...)
     {
  return "";
     }
}
private: Void ToUTF8(char* pcOut, int nOutLen, String^ sIn)
{
    try
    {
  array^ bytes = System::Text::Encoding::Default->GetBytes(sIn);
  nOutLen = Math::Min(nOutLen - 1, bytes->Length);
  System::Runtime::InteropServices::Marshal::Copy(bytes, 0, IntPtr(pcOut), nOutLen);
  pcOut[nOutLen] = '\0';
    }
    catch (...)
    {
  pcOut[nOutLen] = '\0';
    }
}
Пример использования
Код:

const int buf = 512;
char host[buf];
ToUTF8(host, buf, hostText->Text); // Перевод из String^ в char[]
String ^tmp = ToUCS2(mysql_error(&mysql)); // Перевод из char* в String^
 
 
 
psycho-coder
(http://programmersforum.ru/showthread.php?t=59147)

Комментариев нет:

Отправить комментарий