C语⾔操作MYSQL简易教程
⽂章⽬录
⼀、连接MYSQL
在使⽤C语⾔操作MYSQL数据库之前,需要先与数据库建⽴连接,下⾯是建⽴连接需要⽤到的函数(按使⽤顺序),只需要将函数例程跟着过⼀遍,我们的C程序就成功连接到我们的数据库了。(附函数参数介绍)
连接实例
int main()
{
MYSQL mysql;
if(mysql_init(&mysql)==NULL)//初始化句柄mysql
{
printf("%d : error : %s\n",__LINE__,mysql_error(&mysql));
exit(1);
}
if(mysql_library_init(0,NULL,NULL)!=0)//初始化mysql数据库
{
fprintf(stderr,"could not initialize MySQL client library\n");
exit(1);
}
if(NULL==mysql_real_connect
(&mysql,
"127.0.0.1",
"root",
"**********",
"testdb",
0,
NULL,
0)
)//与mysql服务器建⽴连接
{
printf("%d : error : %s\n",__LINE__,mysql_error(&mysql));
exit(1);
}
if(mysql_set_character_set(&mysql,"utf8")!=0)//设置中⽂字符集
{
printf("%d : error : %s\n",__LINE__,mysql_error(&mysql));
exit(1);
}
printf("connect success!\n");
//
//中间部分为程序的主题部分
//
mysql_close(&mysql);
mysql_library_end();
return0;
}
1.MYSQL *mysql_init(MYSQL *mysql)
分配或初始化⼀个适⽤于 mysql_real_connect() 的 MYSQL 对象。 如果 mysql 是 NULL 指针,则该函数分配、初始化并返回⼀个新对象。 否则,初始化对象并返回对象的地址。 如果 mysql_init() 分配了⼀个新对象,则在调⽤ mysql_close() 关闭连接时将其释放。
返回值:
⼀个初始化的 MYSQL* 处理程序。 如果没有⾜够的内存来分配新对象,则为 NULL。
使⽤实例:
MYSQL mysql;
if(mysql_init(&mysql)==NULL)
{
mysql下载后的初次使用
printf("%d : error : %s\n",__LINE__,mysql_error(&mysql));
exit(1);
}
2.int mysql_library_init(int argc,char **argv,char **groups)
在⾮多线程环境中,mysql_init() 根据需要⾃动调⽤ mysql_library_init()。 但是,mysql_library_init() 在多线程环境中不是线程安全的,因此 mysql_init() 也不是线程安全的。 在调⽤ mysql_init() 之前,要么在产⽣任何线程之前调⽤ mysql_library_init(),要么使⽤互斥锁来保护 mysql_library_init() 调⽤。 这应该在任何其他客户端库调⽤之前完成。
也就是说,这个函数在单线程的程序中不是必须的;但是在我的聊天室中⽤到了多线程,因此需要调⽤这个函数。
argc、argv 和 groups 参数未使⽤。 在较旧的 MySQL 版本中,它们⽤于链接到不再⽀持的嵌⼊式服务器的应⽤程序。 现在调⽤应该写成 mysql_library_init(0, NULL, NULL)。
返回值:
成功为零。 如果发⽣错误,则⾮零。
使⽤实例
if(mysql_library_init(0,NULL,NULL)!=0)
{
fprintf(stderr,"could not initialize MySQL client library\n");
exit(1);
}
3. MYSQL *mysql_real_connect()
mysql_real_connect() 尝试建⽴与主机上运⾏的 MySQL 服务器的连接。 在执⾏任何其他需要有效 MYSQL 连接处理程序结构的 API 函数之前,客户端程序必须成功连接到服务器。
由于这个函数的参数过多,故将函数原型放在下⾯:
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 long client_flag)
1. MYSQL *mysql
这⾥的mysql就是之前mysql_init()初始化的句柄
2. const char *host
host 的值可以是主机名或 IP 地址,⼀般我们连接⾃⼰主机上的数据库,就写"127.0.0.1"
3. const char *user
user 参数包含⽤户的 MySQL 登录 ID,⼀般都为"root"
4. const char *passwd
passwd 参数包含⽤户的密码
5. const char *db
db 是数据库名称
6. unsigned int port
该值⽤作 TCP/IP 连接的端⼝号
7. const char *unix_socket
我们⼀般⽤NULL
8. unsigned long client_flag
client_flag 的值通常为 0
关于本函数,如果想了解更多更详细的内容,可以参考
使⽤实例:
if(NULL==mysql_real_connect
(&mysql,
"127.0.0.1",
"root",
"**********",//这⾥输⾃⼰的密码
"testdb",
0,
NULL,
0)
)
{
printf("%d : error : %s\n",__LINE__,mysql_error(&mysql));
exit(1);
}
4. int mysql_set_character_set(MYSQL *mysql,const char *csname)设置默认字符集,这⾥我们需要设置中⽂字符集,不然会出现乱码
返回值:
成功为零。 如果发⽣错误,则⾮零
使⽤实例
if(mysql_set_character_set(&mysql,"utf8")!=0)
{
printf("%d : error : %s\n",__LINE__,mysql_error(&mysql));
exit(1);
}
5.void mysql_close(MYSQL *mysql)
在主线程的最后不要忘记断开与MYSQL的连接
为避免在应⽤程序使⽤库完成后(例如,关闭与服务器的连接后)发⽣内存泄漏,请务必显式调⽤ mysql_library_end()。 这使得可以执⾏内存管理来清理和释放库使⽤的资源。
使⽤实例
mysql_close(&mysql);
mysql_library_end();
return0;
⼆、使⽤MYSQL
在使⽤C语⾔操作MYSQL的时候,最重要的还是MYSQL的基本语法。因为使⽤C语⾔操作MYSQL的时候,不过是把sql的语法去掉分号后放到字符数组⾥,再作为参数让函数去执⾏。
使⽤实例
int ret;
char query_str[BUFSIZE];
MYSQL mysql;
MYSQL *res;
MYSQL row;
strcpy(query_str,"select * from UserData");
ret =mysql_real_query(&mysql, query_str,strlen(query_str))
if(ret !=0)
{
printf("%d : error : %s\n",__LINE__,mysql_error(&mysql));
exit(1);
}
res =mysql_store_result(&mysql);
if(res ==NULL)
{
//如果mysql_error()返回NULL的话,证明没有错误发⽣
if(strcmp(mysql_error(&mysql),"")!=0)
{
printf("%d : error : %s\n",__LINE__,mysql_error(&mysql));
exit(1);
}
}
//row(MYSQL_ROW)作为⼀个⼆级指针,我们在使⽤时要注意数组越界问题
while(row =mysql_fetch_row(res))
{
//...
}
1.int mysql_real_query(MYSQL *mysql, const char *stmt_str, unsigned long length)
mysql_real_query() 执⾏ stmt_str 指向的 SQL 语句,字符串长度字节长。 通常,字符串必须由单个 SQL 语句组成,没有终⽌分号或\g。 如果启⽤了多语句执⾏,则字符串可以包含多个⽤分号分隔的语句。
返回值
成功为零。 如果发⽣错误,则⾮零。
2.MYSQL_RES *mysql_store_result(MYSQL *mysql)
得到MYSQL_RES这个句柄。
mysql_store_result()⽤来获得上⼀个语句产⽣的结果集,⽐所说select、show语句产⽣的搜索结果,但如果上⼀个语句没有产⽣结果集,那么函数返回NULL(注意这个NULL要与发⽣错误时返回的NULL作区分)。
返回值
指向带有结果的 MYSQL_RES 结果结构的指针。 如果语句未返回结果集或发⽣错误,则为 NULL。 要确定是否发⽣错误,请检查
mysql_error() 是否返回⾮空字符串、mysql_errno() 是否返回⾮零或 mysql_field_count() 是否返回零。
在得到MYSQL_RES *这个句柄之后,我们就可以知道有关这个数据表的所有信息。
(1).mysql_num_rows(MYSQL_RES *res)
(2).mysql_num_fields(MYSQL_RES *res)
这两个函数分别可以得到数据表中的⾏数和列数,⽐较简单,这⾥不细说。具体可以参考
3.MYSQL_ROW mysql_fetch_row(MYSQL_RES *res)
检索结果集的下⼀⾏
如果我们想要打印出整个数据表的话,可以这样使⽤:
int i;
int fields;
fields =mysql_num_fields(res);//获得数据表的列数
while(row =mysql_fetch_row(res))
{
for(i=0; i<fields; i++)
{
printf("%-20s", row[i]);
}
printf("\n");
}
很重要的⼀个函数sprintf()
在C语⾔操作数据库时,sprintf()函数可以很⽅便的帮我们组装好⼀个语句:
sprintf(query_str,"select * from UserData \
where username = \"%s\"", username);
程序封装
在项⽬中,我们可能会频繁的使⽤MYSQL,为了提⾼编程效率(频繁的对没有结果集的sql语句调⽤mysql_store_result()并不会导致显著的性能下降),我们可以把常⽤的MYSQL函数封装⼀下:
对于有结果集的sql语句,我们可以⽤返回的句柄res对结果进⾏操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论