连接到数据库
mysql_init(MYSQL *pmysql);
MYSQL *mysql_real_connect(MYSQL * pmysql,const char * hostname,const char *usename,const char *passwd,const char *dbname,0,0,0);
连接到MySQL必须先调用mysql_init初始化
之后调用mysql_real_connect连接到数据库
mysql_real_connect成功返回指向MySQL连接的指针,失败返回NULL;
执行SQL语句
int mysql_query(MYSQL *pmysql,const char *sql);
参数pmysql是连接到mySQL的指针。
参数sql是要执行的SQL语句。
成功返回0,失败返回非0。
Linux下,printf函数必须以'
'结尾才可以输出到屏幕,如果没有'
'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),这里可以使用write函数代替。
//数据库编程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "mysql/mysql.h"
#define GTC_DEBUG
#ifdef GTC_DEBUG
#define GTC_LOG(format,...) fprintf(stderr, format, ##__VA_ARGS__); fprintf(stderr, "
")
#else
#define GTC_LOG(format,...)
#endif
/*
* mysql编程步骤
* 第一步:头文件 #include "mysql/mysql.h"
* 第二步:makefile文件链接时添加动态库-lmysqlclient
*
*
* 数据库client与server之间也是采用TCP/IP协议
* 1.初始化client
* 2.建立连接
* 3.client向server发送SQL语句,server将执行SQL语句的结果返回client
* 4.断开连接
* */
int test()
{
int errCode = 0;
MYSQL *handler = NULL;
/*
知识补充:
在一个非多线程的环境中,调用mysql_library_init()可能可以省略,因为 mysql_init()将在必要的时候自动调用它。
然而mysql_library_init()在多线程环境中并不是安全的,mysql_init()自动调用mysql_library_init()时也同样不安全。
因此,要么你在增加任何线程之前调用mysql_library_init(),要么使用mutex来保护这个调用(不管是直接调用mysql_library_init()
还是间接通过调用mysql_init()调用)。
这个步骤必须在任何其他客户端库调用之前完成。
*/
//1.全局初始化
mysql_library_init(0, NULL, NULL);
do
{
/*
知识补充:
配或初始化与mysql_real_connect()相适应的MYSQL对象
如果mysql是NULL指针,该函数将分配、初始化、并返回新对象(即系统分配内存)
否则,将初始化对象,并返回对象的地址(即用户自己分配了内存)
如果mysql_init()是由系统分配内存,当调用mysql_close()来关闭连接时。将释放该内存
注意:如果是用户分配了内存,返回的对象就是用户定义变量的地址
*/
//2.初始化句柄
handler = mysql_init(NULL);
if (NULL == handler)
{
errCode = -1;
GTC_LOG("fail: mysql_init");
break;
}
/*
知识补充:
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。
对于成功的连接,返回值与第1个参数的值相同。
*/
//3.连接数据库
if (NULL == mysql_real_connect(handler, "192.168.88.120", "root", "ynt#123456", "transaction", 3306, NULL, 0))
{
errCode = -1;
GTC_LOG("mysql: %s", mysql_error(handler));
break;
}
{
// 4.设置自动重连
my_bool reconnect = 1;
mysql_options(handler, MYSQL_OPT_RECONNECT, &reconnect);
}
//5.设置数据库连接(重要,如果不执行这个SQL语句,mysql不知道需要访问的数据库)
mysql_select_db(handler, "transaction");
//6.字符集设置(重要,如果不执行这个SQL语句,数据库不能识别用户输入的sql语句中的中文)
mysql_set_character_set(handler, "utf8mb4");
//7.数据库操作
} while (0);
//资源释放
if (handler)
{
mysql_close(handler);
handler = NULL;
}
//全局资源释放(重要,如果不执行mysql_library_end(),将会有部分资源不会被释放)
mysql_library_end();
return errCode;
}
int main(int arg, char *args[])
{
test();
printf("------ok-----
");
return 0;
}
mysql C语音API进行远程数据查询时,对sql语句的长度有限制,会报的错误经常是语法错误
例如
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right
syntax to use near 'DROP TABLE default_gh11_1;DROP TABLE default_gh11_10;DROP TABLE d
执行SELECT语句得到查询结果
MYSQL_RES *mysql_store_result(MYSQL *pmysql);
成功返回一个查询结果指针,查询无结果或者错误返回NULL。
mysql_free_result(MYSQL_RES *res)
调用完mysql_store_result,一定要用mysql_free_result释放相关的资源。
查看查询结果
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
例子
while(row=mysql_fetch_row(result)!=NULL)
{
printf("name:%s,sec:%s,age:%s,class:%s
",row[0],row[1],row[2],row[3]);
}
尽管在表中age是数字,但是Mysql返回的只不过是以NULL结尾的字符串
//数据库编程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <mysql/mysql.h>
int main(int arg, char *args[])
{
MYSQL mysql, *connection;
mysql_init(&mysql);
connection = mysql_real_connect(&mysql, "localhost", "dbuser1", "123456",
"db1", 0, 0, 0);
if (connection == NULL)
{
/*mysql_error()打印错误原因*/
printf("mysql_real_connect() failed ! error message:%s
",
mysql_error(&mysql));
return -1;
}
/*执行任何mysql都必须设置字符集*/
if (mysql_query(connection, "SET NAMES utf8") != 0)
{
printf("SET NAMES failed!
");
}
/*mysql_query函数只适合更新操作,因为mysql_query()无法返回数据集,所以需要更多的处理*/
if (mysql_query(connection, "SELECT * FROM table1") != 0)
{
printf("SELECT failed!
");
}
/*
* 调用mysql_store_result()获取查询结果,结果放到结构MYSQL_RES中
* */
MYSQL_RES *result = mysql_store_result(connection);
if(result==NULL)
{
printf("mysql_store_result() failed!
");
}
MYSQL_ROW row ;
while(1)
{
row= mysql_fetch_row(result);
if(row==NULL) break;
printf("name:%s;sex:%s;age:%s;class:%s
", row[0], row[1], row[2], row[3]);
}
//释放相关资源
mysql_free_result(result);
mysql_close(connection);
return 0;
}
查看查询结果中的字段信息
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
例子
while(sqlfield=mysql_fetch_field(result)!=NULL)
{
printf("%s
",sqlfield->name);
}
//数据库编程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <mysql/mysql.h>
int main(int arg, char *args[])
{
MYSQL mysql, *connection;
mysql_init(&mysql);
connection = mysql_real_connect(&mysql, "localhost", "dbuser1", "123456",
"db1", 0, 0, 0);
if (connection == NULL)
{
/*mysql_error()打印错误原因*/
printf("mysql_real_connect() failed ! error message:%s
",
mysql_error(&mysql));
return -1;
}
/*执行任何mysql都必须设置字符集*/
if (mysql_query(connection, "SET NAMES utf8") != 0)
{
printf("SET NAMES failed!
");
}
/*mysql_query函数只适合更新操作,因为mysql_query()无法返回数据集,所以需要更多的处理*/
if (mysql_query(connection, "SELECT * FROM table1") != 0)
{
printf("SELECT failed!
");
}
/*
* 调用mysql_store_result()获取查询结果,结果放到结构MYSQL_RES中
* */
MYSQL_RES *result = mysql_store_result(connection);
if(result==NULL)
{
printf("mysql_store_result() failed!
");
}
/*这里的列是指SELECT查询结果的列,并非是指表所对应的列*/
MYSQL_FIELD *field ;
while(1)
{
field= mysql_fetch_field(result);
if(field==NULL) break;
printf("name=%s
",field->name);
}
//释放相关资源
mysql_free_result(result);
mysql_close(connection);
return 0;
}