一個簡單的mysql與C的交互,使用了一些mysql的C API!
老鳥掠過,新手能夠看看!
/******************************************
本文件學習mysql的database使用
學習mysql的C接口
包括初始化db,檢查數據庫是否存在,不存在就創建。
檢查表是否存在,不存在則創建
*****************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//須要包括mysql的頭文件,/usr/include/mysql/
//編譯的時候須要加上-L/usr/lib/ -lmysqlclient -I/usr/include/mysql選項
#include <mysql.h> //主要的頭文件,一些重要結構體的聲明
#include <errmsg.h>//錯誤信息的存放
#include <mysql_version.h> //包括當前mysql的版本號信息
//////////////////所有變量,宏定義//////////////////////
#define DEBUG
#define SERVER_HOST "localhost" //mysql的遠程地址
#define SERVER_USER "root" //數據庫登錄名
#define SERVER_PWD "123" //數據庫登錄password
#define DB_NAME "tmp_db" //新建數據庫的名字
#define TABLE_NAME "mytables" //庫中的表
int check_tbl(MYSQL* mysql,char *name);
int check_db(MYSQL *mysql,char *db_name);
int init_db()
{
int err=0;
MYSQL mysql;
if(!mysql_init(&mysql)){
perror("mysql_init:");
exit(1);
}
if(!mysql_real_connect(&mysql,SERVER_HOST,SERVER_USER,SERVER_PWD,NULL,0,NULL,0))
{
perror("mysql_real_connect");
exit(1);
}
printf("connected.....\n");
err = check_db(&mysql,DB_NAME);
if(err != 0)
{
printf("create db is err!\n");
mysql_close(&mysql);
exit(1);
}
//select which db
if(mysql_select_db(&mysql,DB_NAME)) //return 0 is success ,!0 is err
{
perror("mysql_select_db:");
mysql_close(&mysql);
exit(1);
}
//chuangjianbiao
if((err=check_tbl(&mysql,TABLE_NAME))!=0)
{
printf("check_tbl is err!\n");
mysql_close(&mysql);
exit(1);
}
mysql_close(&mysql);
return 0;
}
int check_db(MYSQL *mysql,char *db_name)
{
MYSQL_ROW row = NULL;
MYSQL_RES *res = NULL;
res = mysql_list_dbs(mysql,NULL);
if(res)
{
while((row = mysql_fetch_row(res))!=NULL)
{
printf("db is %s\n",row[0]);
if(strcmp(row[0],db_name)==0)
{
printf("find db %s\n",db_name);
break;
}
}
//mysql_list_dbs會分配內存,須要使用mysql_free_result釋放
mysql_free_result(res);
}
if(!row) //沒有這個數據庫,則建立
{
char buf[128]={0};
strcpy(buf,"CREATE DATABASE ");
strcat(buf,db_name);
#ifdef DEBUG
printf("%s\n",buf);
#endif
if(mysql_query(mysql,buf)){
fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql));
exit(1);
}
}
return 0;
}
int check_tbl(MYSQL* mysql,char *name)
{
if(name == NULL)
return 0;
MYSQL_ROW row=NULL;
MYSQL_RES *res = NULL;
res = mysql_list_tables(mysql,NULL);
if(res)
{
while((row = mysql_fetch_row(res))!=NULL)
{
printf("tables is %s\n",row[0]);
if(strcmp(row[0],name) == 0)
{
printf("find the table !\n");
break;
}
}
mysql_free_result(res);
}
if(!row) //create table
{
char buf[128]={0};
char qbuf[128]={0};
snprintf(buf,sizeof(buf),"%s (name VARCHAR(20),sex char(1),score int(3));",TABLE_NAME);
strcpy(qbuf,"CREATE TABLE ");
strcat(qbuf,buf);
//#ifdef DEBUG
printf("%s\n",qbuf);
//#endif
if(mysql_query(mysql,qbuf)){
fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql));
exit(1);
}
}
return 0;
}
int main()
{
int err=0;
err = init_db();
return 0;
}
編譯的方法:最后的-I一定要注意檢查這個文件夾是不是存在,否則會報錯
gcc -o mysql mysql.c -L/usr/lib/ -lmysqlclient -I/usr/include/mysql
報錯:
root@jack-desktop:~# gcc -o mysql mysql.c -L/usr/lib/ -lmysqlclient
gcc: mysql.c: 沒有那個文件或文件夾
root@jack-desktop:~#
root@jack-desktop:~#
root@jack-desktop:~# cd myc/
root@jack-desktop:myc# gcc -o mysql mysql.c -L/usr/lib/ -lmysqlclient
mysql.c:15:73: error: mysql.h: 沒有那個文件或文件夾
mysql.c:16:43: error: errmsg.h: 沒有那個文件或文件夾
mysql.c:17:63: error: mysql_version.h: 沒有那個文件或文件夾
mysql.c:27: error: expected ‘)’ before ‘*’ token
mysql.c:28: error: expected ‘)’ before ‘*’ token
mysql.c: In function ‘init_db’:
mysql.c:34: error: ‘MYSQL’ undeclared (first use in this function)
mysql.c:34: error: (Each undeclared identifier is reported only once
mysql.c:34: error: for each function it appears in.)
mysql.c:34: error: expected ‘;’ before ‘mysql’
mysql.c:36: error: ‘mysql’ undeclared (first use in this function)
mysql.c: At top level:
mysql.c:73: error: expected ‘)’ before ‘*’ token
mysql.c:109: error: expected ‘)’ before ‘*’ token
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

