Mysql интерфейс для с (c api)


Интерфейс для С (C API)

Вы должны подключить файл mysql.h в начале Вашей программы на C:

Вы также должны компоновать программу с математической (для шифрования) и mysqlclient библиотеками:

Включаемые файлы обычно размещены в /usr/include/mysql, а библиотеки могут быть найдены в /usr/lib/mysql.

Если Вы имеете утечку памяти в вашей программе-клиенте, Вы можете компилировать с опцией —with-debug=yes. Это заставит код клиента использовать пакет ‘safe_malloc’ в библиотеке клиентов MySQL. Вызовите TERMINATE(stdout) или my_end(1) в вашей прикладной программе-клиенте перед выходом, чтобы получить список всех утечек памяти. Детали — в файле mysys/safemalloc.c из дистрибутива MySQL.

Рассмотрим простой пример MySQL-клиента, который только выполнит SELECT и выведет все возвращенные строки в STDOUT. В нем использованы далеко не все функции С API, он должен только дать Вам представление о типичном виде программы-клиента.

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Реализация интерфейса для базы данных MySQL

Привет всем, только хотел описать в сложности проблему и попытаться выяснить решение у форумчан, как чел в теме ниже уже попытался ее решить, правда, у меня была sha2, но не суть.

Для курсача нужно выполнить работу, которая будет реализовывать интерфейс для MySQL базы данных на c# (Windows Form, собсна), как уже сказал, возможности добавить что-то через мастер и поиграть в майнкрафтера у меня нет, ибо времени мало, а выяснять почему MySQL так помойно работает с самой известной средой разработки тоже не хочется.

Интефейс нужно реализовать при помощи datagrid(которые, как вы понимаете, создать через мастер тоже нет возможности ), а также добавить форму с авторизацией, к каждой форме с одной таблицей (я решил выбрать такой подход, что форма авторизации будет пускать пользователя на форму администратора, где он сможет переместиться на специально созданные формы под таблицы, и уже там заниматься их редактированием, знаю, муторно, но увы, даже этому методу меня не учили, пришлось самостоятельно разбираться и выкручиваться). Прошу понять и простить, но разбираться в других способах и вариантах разработки пользовательских интерфейсов времени у меня тоже нет (для всех любителей позлорадствовать, я не пинал подушки до дедлайна сдачи), собственно, вопрос таков: а как привязать то таблицы к datagrid без мастера? Нет, не подумайте, я пользовался гуглом и пытался даже что-то сам склепать, благо азы имеются, но мой мозг в состоянии постоянной безумной усталости и нагрузки не позволяет мне стабильно продумать все, разобраться и сделать, да и тем более, что 80% информации — старье, что даже адаптировать толком невозможно.

Еще хотелось бы отметить, со всеми подключениями через код я тоже разобрался, но ввиду того, что ручки у меня не из того места растут, схожу в храм и помолюсь за того человека, что сможет мне вкратце накидать код для присоединения созданной таблицы в базе данных MySQL к Datagrid на c#, если можно, то сразу со строкой подключения. Безусловно, в моей базе есть куча связей и других параметров, но, думаю, просить этого было бы слишком, если буду видеть перед глазами применяемый код в реальных условиях НЫНЕШНИХ, то смогу и адаптировать его под свои нужды.

Для тех, кому лень читать, вопросы в кратце:

— Как должен выглядеть код подключения таблиц базы данных mysql к datagrid? (без связей, лишних сложностей и тд, хотя бы просто подключить).
— Кнопки и как сделать толковое обновление базы данных, что будет подключена к приложению c#? (тобиш, чтобы при взаимодействии с приложением, данные обновлялись и в самой бд)

Заранее благодарю за помощь, на кону стоит моя жизнь! :c

Добавлено через 6 минут
P.S Забыл спросить еще. Ребят, пожалуйста, посоветуйте какие-нибудь книги по основам c# и взаимодействия c# с базами данных (желательно без SQL, он мне известен на должном уровне). Ибо просто по c# я еще могу найти книги, хоть многие из них и потеряли свою актуальность, а вот про взаимодействие языка с базами данных, а также разные интерфейсы и их взаимодействие с базами данных — нет. (вполне возможен вариант, что это я дурачок и плохо искал)

MySQL C API programming tutorial

This is a C programming tutorial for the MySQL database. It covers the basics of MySQL programming with the C API. You may also consider to look at the MySQL tutorial on ZetCode.

About MySQL database

MySQL is a leading open source database management system. It is a multi user, multithreaded database management system. MySQL is especially popular on the web. It is one part of the very popular LAMP platform consisting of Linux, Apache, MySQL, and PHP. MySQL currently owned by Oracle. MySQL database is available on most important OS platforms. It runs on BSD Unix, Linux, Windows, or Mac OS. Wikipedia and YouTube use MySQL. These sites manage millions of queries each day. MySQL comes in two versions: MySQL server system and MySQL embedded system.

To be able to compile C examples, we need to install the MySQL C development libraries. The above line shows how we can do it on Debian based Linux.

This tutorial uses C99. For GNU C compiler, we need to add the -std=c99 option. For Windows users, the Pelles C IDE is highly recommended. (MSVC does not support C99.)

In C99, we can mix declarations with code. In older C programs, we would need to separate this line into two lines.

First example

Our first example will test one MySQL function call.

The mysql_get_client_info() shows the MySQL client version.

We include necessary header files. The mysql.h is the most important header file for MySQL function calls. The my_global.h includes some global declarations a functions. Among other things, it includes the standard input/output header file.

This code line outputs the version of the MySQL client. For this, we use the mysql_get_client_info() function call.


We exit from the script.

Here is how we compile the code example.

Creating a database

The next code example will create a database. The code example can be divided into these parts:

  • Initiation of a connection handle structure
  • Creation of a connection
  • Execution of a query
  • Closing of the connection

The code example connects to the MySQL database system and creates a new database called testdb .

The mysql_init() function allocates or initialises a MYSQL object suitable for mysql_real_connect() function. Remember this is C99.

We check the return value. If the mysql_init() function fails, we print the error message and terminate the application.

The mysql_real_connect() function establishes a connection to the database. We provide connection handler, host name, user name and password parameters to the function. The other four parameters are the database name, port number, unix socket and finally the client flag. We need superuser priviliges to create a new database.

The mysql_query() executes the SQL statement. In our case, the statement creates a new database.

Finally, we close the database connection.

The second example already utilizes features from C99 standard. Therefore, we need to add the -std=c99 option.

This is the proof that the database was created.

Creating and populating a table

Before we create a new table, we create a user that we will use in the rest of the tutorial.

We have created a new user user12 .

Here we grant all priviliges to user12 on testdb database.

The next code example will create a table and insert some data into it.

We don’t use any new MySQL function call here. We use mysql_query() function call to both create a table and insert data into it.

In order to avoid unnecessary repetition, we create a custom finish_with_error() function.

We connect to testdb database. The user name is user12 and password is 34klq* . The fifth parameter is the database name.

Here we create a table named Cars . It has three columns.

We insert one row into the Cars table.

We show tables in the database.

We select all data from the table.

Retrieving data from the database


In the next example, we will retrieva data from a table.

We need to do the following steps:

  • Create a connection
  • Execute query
  • Get the result set
  • Fetch all available rows
  • Free the result set

The example prints all columns from the Cars table.

We execute the query that will retrieve all data from the Cars table.

We get the result set using the mysql_store_result() function. The MYSQL_RES is a structure for holding a result set.

We get the number of fields (columns) in the table.

We fetch the rows and print them to the screen.

We free the resources.

Last inserted row id

Sometimes, we need to determine the id of the last inserted row. We can determine the last inserted row id by calling the mysql_insert_id() function. The function only works if we have defined an AUTO_INCREMENT column in the table.

A new table is created. Three rows are inserted into the table. We determine the last inserted row id.

The Id column has an AUTO_INCREMENT type.

The mysql_insert_id() function returns the value generated for an AUTO_INCREMENT column by the previous INSERT or UPDATE statement.

Илон Маск рекомендует:  Что такое код open

Column headers

In the next example, we will retrieve data from the table and its column names.

We print the first three rows from the Cars table. We also include the column headers.

The MYSQL_FIELD structure contains information about a field, such as the field’s name, type and size. Field values are not part of this structure; they are contained in the MYSQL_ROW structure.

The first row contains the column headers. The mysql_fetch_field() call returns a MYSQL_FIELD structure. We get the column header names from this structure.

This is the output of our program.

Multiple statements

It is possible to execute multiple SQL statements in one query. We must set the CLIENT_MULTI_STATEMENTS flag in the connect method.

In the example, we execute three SELECT statements in one query.

The last option of the mysql_real_connect() method is the client flag. It is used to enable certain features. The CLIENT_MULTI_STATEMENTS enables the execution of multiple statements. This is disabled by default.

The query consists of three SELECT statements. They are separated by the semicolon ; character. The backslash character \ is used to separate the string into two lines. It has nothing to do with multiple statements.

The code is placed between the do/while statements. The data retrieval is to be done in multiple cycles. We will retrieve data for each SELECT statement separately.


We expect multiple result sets. Therefore, we call the mysql_next_result() function. It reads the next statement result and returns a status to indicate whether more results exist. The function returns 0 if the execution went OK and there are more results. It returns -1, when it is executed OK and there are no more results. Finally, it returns value greater than zero if an error occurred.

We check for error.

Inserting images into MySQL database

Some people prefer to put their images into the database, some prefer to keep them on the file system for their applications. Technical difficulties arise when we work with lots of images. Images are binary data. MySQL database has a special data type to store binary data called BLOB (Binary Large Object).

For our examples, we create a new Images table. The image size can be up to 16 MB. It is determined by the MEDIUMBLOB data type.

In this example, we will insert one image into the Images table.

This include is for the strlen() function.

Here we open the image file. In the current working directory, we should have the woman.jpg file.

We move the file pointer to the end of the file using the fseek() function. We are going to determine the size of the image. If an error occurs, the error indicator is set. We check the indicator using the fseek() function. In case of an error, we also close the opened file handler.

For binary streams, the ftell() function returns the number of bytes from the beginning of the file, e.g. the size of the image file. In case of an error, the function returns -1 and the errno is set. The perrro() function interprets the value of errno as an error message, and prints it to the standard error output stream.

In this array, we are going to store the image data.

We read the data from the file pointer and store it in the data array. The total number of elements successfully read is returned.

After the data is read, we can close the file handler.

The mysql_real_escape_string() function adds an escape character, the backslash, \ , before certain potentially dangerous characters in a string passed in to the function. This can help prevent SQL injection attacks. The new buffer must be at least 2*size+1 long.

Here we start building the SQL statement. We determine the size of the SQL string using the strlen() function.

The query must take be long enough to contain the size of the SQL string statement and the size of the image file. Using the snprintf() function, we write the formatted output to query buffer.

We execute the query using the mysql_real_query() function. The mysql_query() cannot be used for statements that contain binary data; we must use the mysql_real_query() instead.

Selecting images from MySQL database

In the previous example, we have inserted an image into the database. In the following example, we will select the inserted image back from the database.

In this example, we will create an image file from the database.

We open a new file handler for writing.

We select the Data column from the Image table with Id 1.

The row contains raw data.

We get the length of the image.

We write the retrieved data to the disk using the fwrite() function call. We check for the error indicator with the ferror() function.

After we have written the image data, we close the file handler using the fclose() function.

Обзор функций интерфейса C


В приведенной ниже таблице перечислены доступные в интерфейсе C функции. Более детально они описаны в следующем разделе (Описание функций интерфейса C).

Функция Описание
mysql_affected_rows() Возвращает количество строк, измененных/удаленных/вставленных последним запросом UPDATE , DELETE или INSERT .
mysql_change_user() Переключает пользователя и базу данных для открытого соединения.
mysql_character_set_name() Возвращает название кодировки, установленной для данного соединения.
mysql_close() Закрывает соединение с сервером.
mysql_connect() Создает соединение с сервером баз данных MySQL. Данная функция не рекомендуется; вместо нее следует использовать функцию mysql_real_connect() .
mysql_create_db() Создает базу данных. Данная функция не рекомендуется; вместо нее следует использовать команду SQL CREATE DATABASE .
mysql_data_seek() Ищет произвольную строку в результирующем наборе запроса.
mysql_debug() Выполняет отладочные операции DBUG_PUSH с заданной строкой.
mysql_drop_db() Удаляет базу данных. Эта функция не рекомендуется; вместо нее следует использовать команду SQL DROP DATABASE .
mysql_dump_debug_info() Заставляет сервер записывать отладочную информацию в журнал.
mysql_eof() Определяет, была ли данная строка последней из прочитанных в результирующем наборе данных. Эта функция не рекомендуется; mysql_errno() или mysql_error() могут быть использованы вместо нее.
mysql_errno() Возвращает номер ошибки для последней запущенной функции MySQL.
mysql_error() Возвращает сообщение об ошибке для последней запущенной функции MySQL.
mysql_escape_string() Экранирует специальные символы в строке, чтобы ее было возможно использовать в команде SQL.
mysql_fetch_field() Возвращает тип следующего поля таблицы.
mysql_fetch_field_direct() Возвращает тип поля таблицы по заданному номеру поля.
mysql_fetch_fields() Возвращает массив структур, содержащих информацию обо всех полях.
mysql_fetch_lengths( ) Возвращает массив длин всех столбцов в текущей строке.
mysql_fetch_row() Извлекает следующую строку из результирующего набора.
mysql_field_seek() Устанавливает курсор столбцов на заданный столбец.
mysql_field_count() Возвращает количество столбцов в результате для последнего запроса.
mysql_field_tell() Возвращает значение положения курсора поля для последнего вызова mysql_fetch_field() .
mysql_free_result( ) Освобождает память, использованную для результирующего набора.
mysql_get_client_info() Возвращает информацию о версии клиента.
mysql_get_host_info() Возвращает строку, описывающую параметры текущего соединения.
mysql_get_server_version() Возвращает номер версии сервера как целое число (новое с 4.1)
mysql_get_proto_info() Возвращает версию протокола, используемого для данного соединения.
mysql_get_server_info() Возвращает номер версии сервера баз данных.
mysql_info() Возвращает информацию о последнем выполненном запросе.
mysql_init() Выделяет или инициализирует какую-либо структуру MYSQL.
mysql_insert_id() Возвращает идентификатор, сгенерированный для столбца AUTO_INCREMENT предыдущим запросом.
mysql_kill() Уничтожает заданный поток.
mysql_list_dbs() Возвращает имена баз данных, совпадающие с простым регулярным выражением.
mysql_list_fields() Возвращает имена полей, совпадающих с простым регулярным выражением.
mysql_list_processes() Возвращает список текущих потоков на сервере.
mysql_list_tables() Возвращает имена таблиц, совпадающих с простым регулярным выражением.
mysql_num_fields() Возвращает количество столбцов в результирующем наборе.
mysql_num_rows() Возвращает количество строк в результирующем наборе.
mysql_options() Устанавливает параметры соединения для mysql_connect() .
mysql_ping() Проверяет, работает ли данное соединение с сервером, и восстанавливает соединение при необходимости.
mysql_query() Выполняет SQL-запрос, заданный в виде строки с нулевым символом в конце.
mysql_real_connect() Создает соединение с сервером баз данных MySQL.
mysql_real_escape_string() Экранирует специальные символы в строке, чтобы обеспечить возможность использования ее в команде SQL, с учетом установленной для данного соединения кодировки.
mysql_real_query() Выполняет SQL-запрос, заданный в виде фиксированной строки.
mysql_reload() Предписывает серверу перегрузить таблицы привилегий.
mysql_row_seek() Устанавливает курсор на заданную строку в результирующем наборе, используя величину, возвращенную из mysql_row_tell() .
mysql_row_tell() Возвращает положение курсора строки.
mysql_select_db() Выбирает базу данных.
mysql_shutdown() Останавливает сервер баз данных.
mysql_stat() Возвращает информацию о текущем статусе сервера баз данных в виде строки.
mysql_store_result() Извлекает полный результирующий набор для данного клиента.
mysql_thread_id() Возвращает идентификатор текущего потока.
mysql_thread_safe() Возвращает 1, если клиенты скомпилированы как поддерживающие потоки.
mysql_use_result() Инициализирует построчное извлечение результирующего набора.

При подсоединения к серверу необходимо вызвать функцию mysql_init() для инициализации дескриптора соединения, затем с этим дескриптором вызвать функцию mysql_real_connect() (которая содержит такую информацию, как имя данного хоста, имя пользователя и пароль). После соединения функция mysql_real_connect() устанавливает флаг reconnect (часть данной структуры MYSQL) в значение 1 . Этот флаг указывает, что в случае, если запрос не может быть выполнен из-за потери соединения, следует попытаться восстановить соединение с сервером до окончательного отказа от него. Для закрытия соединения вызывается функция mysql_close() .

При активном соединении клиент может посылать SQL-запросы на сервер, используя функции mysql_query() или mysql_real_query() . Разница между этими двумя функциями состоит в том, что mysql_query() работает с запросом, представленным в виде строки с нулевыми окончаниями, в то время, как mysql_real_query() работает со строками фиксированной длины. Если данная строка содержит двоичные данные (которые могут состоять из нуля байтов), то необходимо использовать mysql_real_query() .

Для каждого запроса без выборки данных (т.е. не вида SELECT , а, например, INSERT , UPDATE , DELETE ) можно узнать количество измененных (затронутых) строк путем вызова функции mysql_affected_rows() .

Для запросов SELECT можно извлечь выбранные строки как результирующий набор. (Следует учитывать, что некоторые команды сходны с SELECT в том смысле, что они тоже возвращают строки. Это команды SHOW , DESCRIBE и EXPLAIN . Они должны трактоваться тем же образом, что и команды SELECT .)

Для клиента существует два способа обработки результирующих наборов данных. Первый состоит в извлечении сразу всего результирующего набора целиком вызовом функции mysql_store_result() . Эта функция забирает с сервера все строки, возвращенные запросом, и хранит их в данном клиенте. Второй способ заключается в инициализации для клиента построчного извлечения результирующего набора путем вызова функции mysql_use_result() . Эта функция инициализирует указанное извлечение, но фактически не получает с сервера ни одной строки.

Илон Маск рекомендует:  Звук через внутренний динамик

В обоих случаях доступ к строкам происходит с помощью функции mysql_fetch_row() . Совместно с mysql_store_result() mysql_fetch_row() осуществляет доступ к строкам, уже извлеченным с сервера. Совместно с mysql_use_result() mysql_fetch_row() реально получает данную строку с сервера. Информацию о размере данных в каждой строке можно получить вызовом функции mysql_fetch_lengths() .

После выполнения операций с результирующим набором необходимо вызвать функцию mysql_free_result() , чтобы освободить использованную для этого память.

Два описанных выше механизма извлечения данных являются взаимодополняющими. Клиентские программы должны выбирать наиболее подходящий для их требований способ. На практике клиенты обычно стремятся использовать функцию mysql_store_result() .

Преимущество функции mysql_store_result() состоит в том, что, поскольку все строки выбраны и находятся у клиента, то возможен не только последовательный доступ к строкам. В результирующем наборе данных можно перемещаться назад и вперед в, используя функции mysql_data_seek() или mysql_row_seek() , чтобы изменить положение текущей строки внутри результирующего набора. Можно также узнать количество находящихся в нем строк, вызвав функцию mysql_num_rows() . С другой стороны, для mysql_store_result() требования к памяти могут быть очень высокими для обширных результирующих наборов, что может привести к нехватке памяти.

Преимущество функции mysql_use_result() заключается в том, что клиент требует меньше памяти для результирующего набора, поскольку он сохраняет только одну строку единовременно (и, так как это меньше перегружает память, то функция mysql_use_result() может быть быстрее). Недостатками являются: необходимость обрабатывать каждую строку быстро, чтобы избежать связывания сервера, невозможность произвольного доступа к строкам внутри результирующего набора (возможен только последовательный доступ к строкам), невозможность узнать количество строк в результирующем наборе до его полного извлечения. Более того, необходимо извлекать все строки, даже если в середине извлечения станет ясно, что искомая информация найдена.

Благодаря интерфейсу клиенты получают возможность соответствующим образом реагировать на запросы (извлекать строки только при необходимости) без уточнения, являлся или нет данный запрос выборкой. Это можно делать, вызывая функцию mysql_store_result() после каждого вызова mysql_query() (или mysql_real_query() ). Если вызов результирующего набора был успешным, то данный запрос принадлежал к виду SELECT и можно производить чтение строк. Если вызов результирующего набора не удался, можно вызвать функцию mysql_field_count() для определения, можно ли было действительно ожидать результат. Если mysql_field_count() возвращает нуль, то данный запрос не возвратил никаких данных (это указывает, что запрос был вида INSERT , UPDATE , DELETE и т.д.), и не следовало ожидать возвращенных строк. Если функция mysql_field_count() является ненулевой, данный запрос должен был возвратить результат, но не сделал этого. Это указывает, что данный запрос был типа SELECT , но его выполнение оказалось неуспешным (см. пример в описании функции mysql_field_count() ).

Как mysql_store_result() так и mysql_use_result() позволяют получить информацию о полях, составляющих результирующий набор (количество полей, их имена и типы и т.д.). Можно получить последовательный доступ к информации о полях внутри строки путем повторного вызова функции mysql_fetch_field() или к номеру поля внутри строки с помощью функции mysql_fetch_field_direct() . Текущее положение курсора поля может быть изменено вызовом функции mysql_field_seek() . Установка курсора производится последующим вызовом функции mysql_fetch_field() . Можно также получить информацию для всех полей сразу с помощью функции mysql_fetch_fields() .

Для обнаружения ошибок и сообщения о них MySQL обеспечивает доступ к информации об ошибках посредством функций mysql_errno() и mysql_error() . Они возвращают код ошибки или сообщение об ошибке для последней запущенной функции (которая может быть успешной или не выполниться), позволяя определить место возникновения и характер ошибки.

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

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

Страниц: 1

#1 20.07.2008 21:58:34

MySQL C API & C#

Всем доброго времени суток!
Если тема не соответствует профилю форума, модераторы, удалите.
Суть проблемы в следующем. Пишу на С# прогу, которая в том числе работает с MySQL. Для работы необходимы апишные функции из libmysql.dll. Загружаю их из этой dll, в рантайме возникают исключения. На mysql_isert_id() исключение «Attempted to read or write protected memory. This is often an indication that other memory is corrupt.», на разные функции разные исключения))). Если есть у кого опыт подключения и использования апишных функций, поделитесь пожалуйста.

#2 21.07.2008 06:39:27

Re: MySQL C API & C#

Активен

#3 21.07.2008 12:40:42

Re: MySQL C API & C#

Я использую коннектор, но для некоторых запросов удобно использовать функции MySQL C API

#4 21.07.2008 15:27:50


Re: MySQL C API & C#

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

Ошибка не в том, что C API плохой (его использует куча программ без проблем), ошибка в том,
что Вы его плохо подключаете, скорее всего

#5 21.07.2008 16:05:27

Re: MySQL C API & C#

Наверное я плохо подключаю. Но дело в том, что я не нашел примеров использования С API в С#. Если Вы меня научите, буду благодарен.

#6 21.07.2008 16:21:51

Re: MySQL C API & C#

Боюсь, что вы вряд ли найдете человека, который когда-либо это делал. Расскажите, пожалуйста,
какую задачу Вы пытаетесь выполнить, для которой Вам не хватает функциональности коннектора C#?

#7 21.07.2008 16:34:30

Re: MySQL C API & C#

Не то что бы мне не хватает его функциональности, скорее проблемы с отладкой. Например, то же, что делает mysql_insert_id() пытался заменить на коннектор+LAST_INSERT_ID(), вот суть кода:
———————————————————
OdbcConnection connection = new OdbcConnection(connectionString);//connectionString — правильный
connection.Open();
OdbcCommand command;

command = new OdbcCommand(queryString, connection);//queryString=»INSERT. » — работает корректно
command.ExecuteNonQuery();

command = new OdbcCommand(«SELECT LAST_INSERT_ID();», connection);
int i=command.ExecuteNonQuery();

OdbcDataReader reader = command.ExecuteReader();

tbIndex.Text = Convert.ToString(reader.GetInt32(0));/*здесь происходит ошибка «No data exists for the row/column»*/

——————————————————-
Я так понимаю LAST_INSERT_ID() должен вернуть целое значение, но его не получается отловить(((

#8 21.07.2008 17:31:51

Re: MySQL C API & C#

Хым. Насколько я вижу из этого куска кода, Вы не используете коннектор вообще — только ODBC.
Полистайте документацию по коннектору — Вы будете сильно удивлены возможностям C#

#9 21.07.2008 18:00:09

Re: MySQL C API & C#

Разъясните пожалуйста в чем заключается использование коннектора, т.к. полистав экзамплы по Вашей ссылке я не нашел в них принципиального различия по сравнению с моим подходом. Суть все равно остается та же — составление запросов с использованием команд MySQL. А это не решает моих проблем, например у апишной функции mysql_escape_string аналогов я не нашел.

#10 21.07.2008 18:40:54

Re: MySQL C API & C#

Насколько я знаю, mysql_escape_string вообще не нужен при использовании современных
интерфейсов к БД. Посмотрите, например, http://dev.mysql.com/doc/refman/5.0/en/ … nd-prepare

#11 22.07.2008 00:04:17


Re: MySQL C API & C#

А где взять классы MySqlCommand, MySqlCommandBuilder и др? Что-то никак не найду соответствующей сборки/пространства.

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

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

1 ответ 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 для сборки с библиотекой коннектора можно примерно такой (да он и не нужен для маленького примера, но раз валялся. ):

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

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

Графический интерфейс MySQL в Windows

Пользователям Windows близок и роден графический интерфейс (GUI). Не чужд, правда, он и пользователям *nix-систем, но сервера мы привыкли все-же видеть в виде тексовых консолей (core-установка Windows Server 2008, кстати, аналогом текстовой консоли Unix не является — это всего-лишь GUI с натянутым CMD, по большому счету).

Несмотря на то, что многие администраторы MySQL прекрасно рулят этим сервером из командной строки, а если даже нет — то через phpmyadmin, в Windows Вам, вероятно, захочется увидеть некое подобие SQL Server Management Studio или Enterprise Manager.

MySQL разработали такую утилиту и предоставляют ее для пользователей Windows (и не только). Конечно, бесплатно.

Итак, открываем сайт www.mysql.com, идем в раздел «Downloads» и тыкам на ссылку «Download» под надписью «MySQL Workbench (GUI Tool)». На открывшейся странице выбираем необходимый нам вариант (я рекомендую MSI) и загружаем.

Да, оно доступно только в виде x86-32 (32-бит), однако работоспособность этой утилиты проверена на Windows Server 2008 R2 (как известно — нативно 64-битной) — все работает.

Установка

Для установки этой утилиты требуется .NET Framework 4 Client Profile. Не пугайтесь — это не весь .Net Framework 4 — полностью это чудо ставить не придется. Обходится утилита Framework 3.5

Скачать и установить Client Profile можно отсюда:
http://www.microsoft.com/downloads/ru-ru/details.aspx?Family >
После устнаовки Client Profile — запускаем установку Workbench. Установка максимально проста — пара вопросов, один из которых — куда, собственно, ставиться, и мы имеем рабочую утилиты для управления MySQL.

Первые шаги

Если Вы работали с Enterprise Manager в SQL Server 2000 или SQL Management Studio в SQL Server 2005/2008+, то суть работы для Вас будет более-менее ясной.

После запуска у Вас будет виден сразу подсоединенный локальный MySQL сервер. Вход осуществляется под пользователем root. Естественно, Вам необходимо знать пароль этого пользователя (аналог sa в MS SQL).

Вы видите три больших области — слева направо:
а) Управление базами данных сервера
б) EER-моделирование
в) Администрирование (запуск/останов/состояние, пользователи и т.д.)

Для подсоединения к необходимой консоли — кликните на названии сервера в этой консоле и введите пароль пользоватя, под которым Вы заходите.

Сноска. В консоли управления базами данных Вы не увидите системных баз. Они скрыты. Будут видны только пользовательские базы данных.

Илон Маск рекомендует:  Обсуждение содержимого (content negotiation) rfc 2068

В верхней части Вы можете видеть панель с табами. На них будут отображаться открытые окна (т.е. можно открыть несколько окон за раз, например, работать с несколькими консолями баз данных с разных серверов).

Для подключения к другим (не локальным, например) серверам баз данных Вам необходимо создавать «подключения» через «New connection» для консоли управления БД или «New server instance» для консоли администрирования.


Управлять существующими подключениями (например, поменять адрес, порт, пользователя и т.д.) можно через «Manage Connections» или «Manage server instances» соответственно.

Администрирование

Покликав на нужный сервер (начнем, конечно, с «localhost») в 3й панели на «домашней» вкладке и введя пароль для root мы попадаем в панель администрирования сервера.

На странице «Server Status» мы видим текущий статус сервера: потребляемые ресурсы, статус (хотел сказать «демона». ) службы, текущие подключения к серверу и т.д.

Startup/Shutdown: Соответственно, на этой старнице мы можем остановить сервер или снова его запустить.

Status and system variables: Тут мы можем посмотреть во внутренности состояния сервера в реал-тайме.

Server logs: Если логи сконфигурированы для отображения в таблице (table), то они будут видны здесь. Если же логи ведутся в файл — фигу, консоль отображать их не будет.

Options file: Не залазя в дебри файла my.cnf или его заменяющего на этой установке MySQL, мы можем легко и просто рулить опциями прямо отсюда — из графического интерфейса. Для записи изменения служит кнопка «Apply» внизу справа. Не забывайте, что сервер требует перезагрузки (MySQL-сервер, а не Windows Server) для применения изменений.

Users and privileges: Отсюда мы рулим пользователями данного сервера. Отсюда мы их создаем, разрешаем работать с той или иной базой данных, создавать других пользователей, удаляем и назначаем пароли.

Data export and restore: По сути — это инструмент резервного копирования или переноса баз данных. Отсюда мы можем выгрузить или загрузить выбранные базы данных в файл.

Управление базами данных (SQL Editor)

Выбрав нужным нам сервер в самой левой панели мы попадаем в консоль управления базами данных.

Отсюда мы можем создавать, изменять и удалять базы данных, таблицы, записи в таблицах, хранимые процедуры и представления.

Чем-то напоминает SQL Management Studio от Microsoft, не так ли?

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

Для создания базы данных служит пункт «Add schema». Нажав на него, Вы попадете в окно создания базы, где будут заданы стандартные вопросы — имя базы, collation (сравнение), кодировка.

После создания, схема появится в списке схем. Для ее выбора — дважды кликните на ней. Треугольник слева от названия позволяет «раскрыть» схему, увидев ее содержание.

Пункт «Add table» служит для добавления таблицы. При этом схема уже должна быть выбрана. Кликнув на него перед Вами откроется окно создания таблицы. Оно значительно более наполнено опциями, чем окно создания базы. Здесь Вам предлагается задать имя таблицы, ее структуру, ключевые поля, индексы и т.д.

Через «Add view» мы, соответственно, можем создать представление таблицы.

«Add routine» предоставлят нам возможность создать хранимую процедуру для данной базы данных.

Все элементы базы видны после того, как нажать на треугольник слева от ее названия с списке. Отсюда мы можем видеть таблицы, представления и хранимые процедуры (Tables, View и Routines соответственно). По правому клику на элементе можно получить список действий, которые можно осуществлять с этим элементом. Например, у таблицы можно выбрать для просмотра первые 1000 записей (Select rows — Limit 1000), Вызвать редактор таблицы для изменения данных в ней (Edit table rows), Скопировать в буфер обмена те или иные данные таблицы (Copy to clipboard), Открыть те или иные данные во внутреннем SQL-редакторе (Send to SQL Editor), ну или создать новую таблицу, изменить эту или удалить.

Изучаем, пользуемся

Этот топик не предназначен быть мануалом по Workbench — здесь всего-лишь написан ответ на вопрос «А есть ли GUI для MySQL и что это за утилита». Работа с Workbench довольно проста и интуитивно понятна (для того, кто знаком с техническим английским и MySQL в целом, конечно). Поэтому — эстафету я Вам передаю. Утилита, как я уже сказал, проста в освоении.

MySQL Programming: C API

This tutorial shows the use of the MySQL «C» programming API to call native MySQL functions to access the database.

For an introduction to installation, configuration and use of the MySQL database see the YoLinux MySQL tutorial.

Related YoLinux Tutorials:


The MySQL client «C» language API development libraries and «C» header files are available as MySQL development packages. On my Red Hat Enterprise 6 workstation it is mysql-devel-5.1.47-4.el6.x86_64

The MySQL client API has been ported to many platforms with many different compilers. To help developers determine the compiling and linking flags to use on their platform use the mysql_config utility program:

  • C compile flags: mysql_config --cflags
    Result: -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv -fPIC -DUNIV_LINUX
  • Linker flags: mysql_config --libs
    Result: -rdynamic -L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -lssl -lcrypto

This example will use the following example database schema and contents:

Example C/C++ program:

Compile: g++ -o testMySqlAPI testMySqlAPI.cpp `mysql_config --cflags` `mysql_config --libs`

Compile: g++ -o genDatabase genDatabase.cpp `mysql_config --cflags` `mysql_config --libs`

Check MySQL for the database, table and data:

8.4 Интерфейс C для MySQL

8.4 Интерфейс C для MySQL

Исходный код программного интерфейса (API) C распространяется вместе с MySQL. Он включает в себя библиотеку mysqlclient и обеспечивает возможность доступа к базе данных программам на С.

Многие клиенты исходного дистрибутива MySQL написаны на C. Они являются хорошими примерами для демонстрации использования интерфейса C. Их можно найти их в каталоге clients исходного дистрибутива MySQL.

Большинство других клиентских интерфейсов (за исключением Java) для соединения с сервером MySQL используют библиотеку mysqlclient. Это означает, что, например, можно извлечь определенную выгоду, используя те же переменные окружения, что и в других клиентских программах, поскольку на них есть ссылки из библиотеки (see section 4.8 Клиентские сценарии и утилиты MySQL, где приведен список этих переменных).

Клиент имеет максимальный размер буфера связи. Начальный размер этого буфера составляет 16 Kб и автоматически увеличивается до максимального значения 16 Mб. Поскольку размеры буфера увеличиваются только при подтверждении запроса на это, то просто увеличение максимального предела по умолчанию само по себе не обеспечит увеличения используемых ресурсов. Проверка этого размера в основном используется для ошибочных запросов и коммуникационных пакетов.

Буфер связи должен быть достаточно большим, чтобы вмещать целую SQL-команду (для потока клиент-сервер) и целую строку возвращенных данных (для потока сервер-клиент). Буфер связи для каждого из потоков динамически увеличивается до максимального значения, чтобы обработать любой запрос или строку. Например, для данных типа BLOB объемом до 16 Mб необходим предел буфера связи по меньшей мере в 16 Mб (как для сервера, так и для клиента). Максимальное значение по умолчанию для клиента составляет 16 Mб, а для сервера максимум по умолчанию равен 1Mб. Можно увеличить этот объем, изменив величину параметра max_allowed_packet при запуске сервера (see section 5.5.2 Настройка параметров сервера).

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

Программирование с учетом потоков описано в разделе See section 8.4.8 Как создать клиентскую программу с потоками. При создании автономного приложения, включающего и «сервер», и «клиент» в одной и той же программе (и не взаимодействующего с внешним сервером MySQL), обращайтесь к разделу See section 8.4.9 libmysqld, встраиваемая библиотека сервера MySQL.

8.4. Интерфейс C для MySQL

Исходный код программного интерфейса (API) C распространяется вместе с MySQL. Он включает в себя библиотеку mysqlclient и обеспечивает возможность доступа к базе данных программам на С.

Многие клиенты исходного дистрибутива MySQL написаны на C. Они являются хорошими примерами для демонстрации использования интерфейса C. Их можно найти их в каталоге clients исходного дистрибутива MySQL.

Большинство других клиентских интерфейсов (за исключением Java) для соединения с сервером MySQL используют библиотеку mysqlclient . Это означает, что, например, можно извлечь определенную выгоду, используя те же переменные окружения, что и в других клиентских программах, поскольку на них есть ссылки из библиотеки (see Раздел 4.8, «Клиентские сценарии и утилиты MySQL», где приведен список этих переменных).

Клиент имеет максимальный размер буфера связи. Начальный размер этого буфера составляет 16 Kб и автоматически увеличивается до максимального значения 16 Mб. Поскольку размеры буфера увеличиваются только при подтверждении запроса на это, то просто увеличение максимального предела по умолчанию само по себе не обеспечит увеличения используемых ресурсов. Проверка этого размера в основном используется для ошибочных запросов и коммуникационных пакетов.

Буфер связи должен быть достаточно большим, чтобы вмещать целую SQL-команду (для потока клиент-сервер) и целую строку возвращенных данных (для потока сервер-клиент). Буфер связи для каждого из потоков динамически увеличивается до максимального значения, чтобы обработать любой запрос или строку. Например, для данных типа BLOB объемом до 16 Mб необходим предел буфера связи по меньшей мере в 16 Mб (как для сервера, так и для клиента). Максимальное значение по умолчанию для клиента составляет 16 Mб, а для сервера максимум по умолчанию равен 1Mб. Можно увеличить этот объем, изменив величину параметра max_allowed_packet при запуске сервера (see Раздел 5.5.2, «Настройка параметров сервера»).

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

Программирование с учетом потоков описано в разделе See Раздел 8.4.8, «Как создать клиентскую программу с потоками». При создании автономного приложения, включающего и «сервер», и «клиент» в одной и той же программе (и не взаимодействующего с внешним сервером MySQL), обращайтесь к разделу See Раздел 8.4.9, «libmysqld, встраиваемая библиотека сервера MySQL».

Назад Начало Главы Вперед
Пред. Глава След. Глава
Глава 7. Типы таблиц MySQL Начало Книги Глава 9. Расширение MySQL

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL