1MySQL C API helloWorld
11关mysqlclient库
C APIs包含mysqlclient库文件中MySQL源代码块发行连接数库执行数库查询
12helloworld应程序编写
int main()
{
int ret NULL
MYSQL mysql
MYSQL *connect
MYSQL_RES *res
MYSQL_ROW row
char *query
int t r
*
if (mysql_library_init(0 NULL NULL)) {
fprintf(stderr could not initialize MySQL library\n)
exit(1)
}
*
mysql_init(&mysql)
*
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)
*
*
unsigned int mysql_errno(MYSQL *mysql)
const char *mysql_error(MYSQL *mysql)
*
connect mysql_real_connect(&mysql localhost root 123456 mydb2 0 NULL 0 )
if (connect NULL)
{
ret mysql_errno(connect)
printf(func mysql_real_connect() err\n)
return ret
}
else
{
printf( ok\n)
}
printf(connectd &mysqld \nconnect &mysql )
mysql_close(connect)
mysql_library_end()
}
13helloworld应程序调试
MySQL开发环境熟悉
q mysq开发头文件目录 usrincludemysql
q mysq开发 动态库
q gcc o dm01_hello dm01_helloc Iusrincludemysql Lusrlib64mysql –lmysqlclient
q 典型错误1
*
usrlib64mysqllibmysqlclienta(dso_dlfcno) In function `dlfcn_globallookup'
dso_dlfcnc(text+0x31) undefined reference to `dlopen'
dso_dlfcnc(text+0x44) undefined reference to `dlsym'
dso_dlfcnc(text+0x4f) undefined reference to `dlclose'
libmysqlclienta dlfcn_globallookup undefined reference to `dlopen'
*
q 典型错误2
*
dm01_helloc49 警告:初始化指针赋整数未作类型转换
usrlib64mysqllibmysqlclienta(net_servcco)(dataDWref__gxx_personality_v0[DWref__gxx_personality_v0]+0x0) undefined reference to `__gxx_personality_v0'
usrlib64mysqllibmysqlclienta(passwordco) In function `scramble_323'
pb2buildsb_012734909140611330548rpmBUILDmysqlcompro5620mysqlcompro5620sqlpasswordc184 undefined reference to `floor'
pb2buildsb_012734909140611330548rpmBUILDmysqlcompro5620mysqlcompro5620sqlpasswordc184 undefined reference to `floor'
pb2buildsb_012734909140611330548rpmBUILDmysqlcompro5620mysqlcompro5620sqlpasswordc184 undefined reference to `floor'
pb2buildsb_012734909140611330548rpmBUILDmysqlcompro5620mysqlcompro5620sqlpasswordc184 undefined reference to `floor'
pb2buildsb_012734909140611330548rpmBUILDmysqlcompro5620mysqlcompro5620sqlpasswordc184 undefined reference to `floor'
usrlib64mysqllibmysqlclienta(passwordco)pb2buildsb_012734909140611330548rpmBUILDmysqlcompro5620mysqlcompro5620sqlpasswordc184 more undefined references to `floor' follow
usrlib64mysqllibmysqlclienta(my_getsystimeco) In function `my_getsystime'
*
q 典型错误3
dm01_helloc70 警告:初始化指针赋整数未作类型转换
导致没链接 libstdc++so
usrlib64mysqllibmysqlclienta(net_servcco)(dataDWref__gxx_personality_v0[DWref__gxx_personality_v0]+0x0) undefined reference to `__gxx_personality_v0'
MySQL开发环境GCC写法
q gcc o dm01_hello dm01_helloc Iusrincludemysql Lusrlib64mysql lmysqlclient ldl lpthread lm lrt lstdc++
q
MySQL开发环境makefile写法
PHONYclean all
CCgcc
CFLAGSWall g
LFLAGSLusrlib64mysql lmysqlclient ldl lpthread lm lrt lstdc++
BINdm01_hello dm02_query
all(BIN)
oc
(CC) (CFLAGS) c < o @
dm01_hellodm01_helloo
(CC) (CFLAGS) ^ (LFLAGS) o @
dm02_querydm02_queryo
(CC) (CFLAGS) ^ (LFLAGS) o @
clean
rm f *o (BIN)
2MySQL C API CRUD
21MYSQL C API常函数
数类型
n MYSQL
ü 该结构代表1数库连接句柄MYSQL函数均
n MYSQL_RES
ü 该结构代表返回行查询结果
n MYSQL_ROW
ü 1行数类型安全表示
n MYSQL_FIELD
ü 该结构包含关字段信息字段名类型等
n MYSQL_FIELD_OFFSET
ü 时MYSQL字段列表偏移量类型安全表示
n my_ulonglong
ü 行数mysql_affected_rows()mysql_num_rows()mysql_insert_id()类型
编程步骤
n 1 通调mysql_library_init()初始化MYSQL库
n 2 通调mysql_init()初始化连接处理程序通调mysql_real_connect()连接服务器
n 3 发出SQL语句处理结果
n 4 通调mysql_close()关闭MYSQL服务器连接
n 5 通调mysql_library_end()结束MYSQL库
数库连接
n 初始化连接句柄结构
#include
MYSQL *mysql_init(MYSQL *)
n 数库建立物理连接
MYSQL *mysql_real_connect(MYSQL *connection
const char *server_hostconst char *sql_user_name
const char *sql_passwordconst char *db_name
unsigned int port_numberconst char
*unix_socket_nameunsigned int flags)
连接参数
Int mysql_options(MYSQL *connectionenum
option_to_setconst char *argument)
错误处理
n unsigned int mysql_errno(MYSQL *connection)
mysql指定连接该函数返回调API函数错误代码该函数调成功失败0返回值表示未出现错误
n char *mysql_error(MYSQL *connection)
果想获错误文信息调该函数
执行SQL语句
n int mysql_query(MYSQL *mysqlconst char *query)
n 功描述:
ü 执行Null终结字符串查询指SQL查询正常情况字符串必须包含1条SQL语句应语句添加终结分号\g
ü 包含二进制数查询应mysql_real_query完成
操语句
n My_ulonglong mysql_affected_rows(MYSQL *mysql)
返回次操语句涉记录行数
n UPDATEDELETEINSERT语句mysql_query()立刻调SELECT语句该函数工作方式mysql_num_rows()类似
查询语言
n MYSQL_RES *mysql_store_result(MYSQL *mysql)
n 功说明:
ü 成功检索数查询必须调mysql_store_result()mysql_use_result()
ü 该函数查询全部结果读取客户端分配1MYSQL_RES结构结果置该结构中
ü 通mysql_num_rows找出结果集中行数
事务处理
n my_bool mysql_autocommit(MYSQL *mysqlmy_bool mode)
ü 函数说明果模式1启动autocommit模式果模式0禁止autocommit模式
n my_bool mysql_commit(MYSQL *mysql)
ü 提交前事务
n my_bool mysql_rollback(MYSQL *mysql)
ü 回滚前事务
处理结果集
n MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
n 功描述
ü 检索结果集行
ü 行值数目mysql_num_fields(result)出
ü 调mysql_fetch_lengths()获行中字段值长度
n void mysql_data_seek(MYSQL_RES *resultmy_ulonglong offset)
n 功描述:
ü 查询结果集中寻找意行偏移值行号
ü 该函数求结果集结构包含查询结果
n MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)
ü 返回光标前位置
n MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *resultMYSQL_ROW_OFFSET offset)
ü 行光标置查询结果集中意行
次接收行数
n MYSQL_RES *mysql_use_result(MYSQL *mysql)
n 功说明:
ü mysql_store_result()样结果集实际读取客户端必须通mysql_fetch_row()调行分进行检索
ü Mysql_store_result()相速度更快存更少
查询执行C API处理
n 支持单字符串中指定语句执行想定连接起该功开连接时必须标志参数中CLIENT_MULTI_STATEMENTS选项指定mysql_real_connect()通调mysql_set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON)已连接设置
详细api列表
MYSQL *mysql_init(MYSQL *mysql)
q 分配初始化mysql_real_connect()相适应MYSQL象
q 果mysqlNULL指针该函数分配初始化返回新象否初始化象返回象址
q 果mysql_init()分配新象调mysql_close()关闭连接时释放该象
void mysql_close(MYSQL *mysql)
q 关闭前面开连接
q 果句柄mysql_init()mysql_connect()动分配mysql_close()解分配mysql指连接句柄
mysql_real_connect函数
q 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)
q 函数功尝试运行机MySQL数库引擎建立连接
q connect mysql_real_connect(&mysql localhost root 123456 mydb2 0 NULL 0 )
查询api
mysql_query()函数mysql_real_query()函数
q int mysql_query(MYSQL *mysql const char *query)
q int mysql_real_query(MYSQL *mysql const char *query unsigned long length)
q 包含二进制数查询必须mysql_real_query()mysql_query()
q mysql_real_query()mysql_query()快会查询字符串调strlen()
获取结果集api
mysql_store_result()函数mysql_use_result
q MYSQL_RES *mysql_store_result(MYSQL *mysql)
q mysql_store_result()查询全部结果读取客户端分配1MYSQL_RES结构结果置该结构中
q 调mysql_num_rows()找出结果集中行数调mysql_fetch_row()获取结果集中行调mysql_row_seek()mysql_row_tell()获取设置结果集中前行位置
q 旦完成结果集操作必须调mysql_free_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql) 次接收行数
q 功说明:
q mysql_store_result()样结果集实际读取客户端必须通mysql_fetch_row()调行分进行检索
q Mysql_store_result()相速度更快存更少
22调思路分析
1 简介
访问MySQL服务器需mysqlclient库MySQL数客户端API(
JavaNET)通库MySQL服务器通讯库正C编写
2代码编写编译
3连接MySQL服务器
初始化MYSQL结构该结构MySQL C API函数(预处理语句相关函数)中会MYSQL *mysql_init(MYSQL *mysql)
连接MySQL服务器MYSQL *mysql_real_connect(MYSQL *mysql const char *host const char *user const char *passwdconst char *db unsigned int port const char *unix_socket unsigned long client_flag)
种方式进行连接先MYSQL_READ_DEFAULT_FILE作选项名调mysql_options() 调mysql_real_connect()连接服务器
mysql_options(*mysql MYSQL_READ_DEFAULT_FILE mycnf)
mysql_real_connect(*mysql NULL NULL NULL NULL 0 NULL 0)
说明:mycnf文件中记录连接MySQL服务器需项参数(址端口户名密
码数库字符集Unix Socket等)样灵活修改连接参数必重新编译程序
关闭连接调mysql_close()
void mysql_close(MYSQL *mysql)
4执行查询
1)调mysql_query()执行SQL语句果语句中包含二进制数需调
mysql_real_query()
int mysql_query(MYSQL *mysql const char *stmt_str)
int mysql_real_query(MYSQL *mysql const char *stmt_str unsigned long length)
2)执行UPDATE DELETEINSERT语句通mysql_affected_rows()获知
受影响记录数my_ulonglong mysql_affected_rows(MYSQL *mysql)
通mysql_insert_id()获取UPDATEINSERT语句生成增值
my_ulonglong mysql_insert_id(MYSQL *mysql)
3)执行SELECT语句两种方式获取结果集
31)种方式通mysql_store_result()整结果集全部取回
MYSQL_RES *mysql_store_result(MYSQL *mysql)
32)种方式调mysql_use_result()初始化获取操作暂时取回记录 MYSQL_RES *mysql_use_result(MYSQL *mysql)
33两种方法均通mysql_fetch_row()访问条记录
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
注意:先前调mysql_store_result() 直接访问记录先前调mysql_use_result() 时服务器获取记录
4)处理完结果集调mysql_free_result()释放占存void mysql_free_result(MYSQL_RES *result)
5)调mysql_errno()mysql_error()获知执行API函数错误代码错误信息
unsigned int mysql_errno(MYSQL *mysql)
const char *mysql_error(MYSQL *mysql)
5 预处理语句(Prepared Statements)
MySQL C API提供种方式执行SQL语句先预处理(prepare)执行
(execute) 次执行SQL语句该方式提高执行效率具体步骤:
1 调mysql_stmt_init()创建语句句柄该句柄函数调中
MYSQL_STMT *mysql_stmt_init(MYSQL *mysql)
2 调mysql_stmt_prepare()SQL语句进行预处理
int mysql_stmt_prepare(MYSQL_STMT *stmt const char *stmt_str unsigned long length)
3 果SQL语句中参数需调mysql_stmt_bind_param()进行参数绑定
my_bool mysql_stmt_bind_param(MYSQL_STMT *stmt MYSQL_BIND *bind)
果参数类型TEXTBLOB 数量调
mysql_stmt_send_long_data()服务器发送数
my_bool mysql_stmt_send_long_data(MYSQL_STMT *stmt unsigned int parameter_number const char *data unsigned long length)
4 调mysql_stmt_execute()执行查询
int mysql_stmt_execute(MYSQL_STMT *stmt)
5 查询产生结果集调
mysql_stmt_affected_rows()
my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt)获改变记录数生成增值
my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt)
my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt)
否执行mysql_stmt_bind_result()结果集中字段进行绑定
my_bool mysql_stmt_bind_result(MYSQL_STMT *stmt MYSQL_BIND *bind)
6 调mysql_stmt_fetch()逐行获取结果集中记录
int mysql_stmt_fetch(MYSQL_STMT *stmt)
调mysql_stmt_fetch()前执行mysql_stmt_store_result()结果
集预先缓存
int mysql_stmt_store_result(MYSQL_STMT *stmt)
7 重复步骤36 次实参执行查询
8 调mysql_stmt_close()关闭句柄释放资源
my_bool mysql_stmt_close(MYSQL_STMT *)
外调mysql_stmt_errno()mysql_stmt_error()获知执行预处
理语句API函数错误代码错误信息
unsigned int mysql_stmt_errno(MYSQL_STMT *stmt)
const char *mysql_stmt_error(MYSQL_STMT *stmt)
9说明:
mysql_stmt_execute()中调案例
httpdevmysqlcomdocrefman51zhapishtml#capimultiplequeries
252711 mysql_stmt_fetch()
23 MYSQL C API预处理语句
参考 22节调思路分析:5预处理语句(Prepared Statements)
MySQL客户端/服务器协议提供预处理语句该功采mysql_stmt_init()初始化函数返回MYSQL_STMT语句处理程序数结构次执行语句预处理执行种效方式首先语句进行解析执行作准备接初始化函数返回语句句柄执行次次
次执行语句预处理执行直接执行快原仅查询执行次解析操作直接执行情况次执行语句时均进行查询外次执行预处理语句时仅需发送参数数减少网络通信量
预处理语句优点采二进制协议客户端服务器间数传输更效率
编程步骤
n 1 mysql_stmt_init()创建预处理语句句柄想服务器准备预处理语句调mysql_stmt_prepare()传递包含SQL语句字符串
n 3 mysql_stmt_bind_param()设置参数值必须设置参数否语句执行返回错误生成法预料结果
n 4 调mysql_stmt_execute()执行语句
n 5 果语句生成结果集捆绑数缓通调mysql_stmt_bind_result()检索行值
n 6 通重复调mysql_stmt_fetch()行数提取缓区直未发现更行止
n 7 通更改参数值次执行语句重复步骤3步骤6
24查询执行C API处理
n 支持单字符串中指定语句执行想定连接起该功开连接时必须标志参数中CLIENT_MULTI_STATEMENTS选项指定mysql_real_connect()通调mysql_set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON)已连接设置
* Connect to server with option CLIENT_MULTI_STATEMENTS *
mysql_real_connect( CLIENT_MULTI_STATEMENTS)
* Now execute multiple queries *
mysql_query(mysqlDROP TABLE IF EXISTS test_table\
CREATE TABLE test_table(id INT)\
INSERT INTO test_table VALUES(10)\
UPDATE test_table SET id20 WHERE id10\
SELECT * FROM test_table\
DROP TABLE test_table)
do
{
* Process all results *
printf(total affected rows lld mysql_affected_rows(mysql))
if ((result mysql_store_result(mysql)))
{
printf(stderr Got fatal error processing query\n)
exit(1)
}
process_result_set(result) * client function *
mysql_free_result(result)
} while (mysql_next_result(mysql))
25
二进制协议允许MYSQL_TIME结构发送接受日期时间值(DATETIMEDATETIMETIMESTAMP)2525节C API预处理语句数类型中介绍该结构成员
int main()
{
int ret 0 status 0
MYSQL *mysql
MYSQL_RES *result
mysql mysql_init(NULL)
mysql mysql_real_connect(mysql localhost root 123456 mydb2 0 NULL CLIENT_MULTI_STATEMENTS )
if (mysql NULL)
{
ret mysql_errno(mysql)
printf(s mysql_error(mysql))
printf(func mysql_real_connect() err d\n ret)
return ret
}
else
{
printf( ok\n)
}
MYSQL_TIME ts
MYSQL_BIND bind[3]
MYSQL_STMT *stmt
注意:
创建表语句
create table test_table (date_field date time_field time timestamp_field timestamp )
char query[1024] INSERT INTO test_table(date_field time_field timestamp_field) VALUES()
stmt mysql_stmt_init(mysql)
if (stmt)
{
fprintf(stderr mysql_stmt_init() out of memory\n)
exit(0)
}
if (mysql_stmt_prepare(stmt query strlen(query)))
{
fprintf(stderr \n mysql_stmt_prepare() INSERT failed)
fprintf(stderr \n s mysql_stmt_error(stmt))
exit(0)
}
* set up input buffers for all 3 parameters *
bind[0]buffer_type MYSQL_TYPE_DATE
bind[0]buffer (char *)&ts
bind[0]is_null 0
bind[0]length 0
bind[1] bind[2] bind[0]
mysql_stmt_bind_param(stmt bind)
* supply the data to be sent in the ts structure *
tsyear 2002
tsmonth 02
tsday 03
tshour 10
tsminute 45
tssecond 20
mysql_stmt_execute(stmt)
Close the statement
if (mysql_stmt_close(stmt))
{
fprintf(stderr failed while closing the statement\n)
fprintf(stderr s\n mysql_stmt_error(stmt))
exit(0)
}
mysql_close(mysql)
}
25事务概念
*
MYSQL默认动提交提交QUERY直接执行通
set autocommit0 禁止动提交
set autocommit1 开启动提交
mysql中INNODB引擎支持事务处理默认动提交
外种常MYISAM引擎支持事务身没事务概念
*
#define BEGIN_TRAN START TRANSACTION
#define SET_TRAN SET AUTOCOMMIT0
#define UNSET_TRAN SET AUTOCOMMIT1
#define COMMIT_TRAN COMMIT
#define ROLLBACK_TRAN ROLLBACK
int mysql_BeginTran(MYSQL *mysql)
{
int ret 0
执行事务开始SQL
ret mysql_query(mysql BEGIN_TRAN)
if (ret 0)
{
printf(func mysql_query() err d\n ret)
return ret
}
设置事务手动提交
ret mysql_query(mysql SET_TRAN)
if (ret 0)
{
printf(func mysql_query() err d\n ret)
return ret
}
return ret
}
int mysql_Rollback(MYSQL *mysql)
{
int ret 0
事务回滚操作
ret mysql_query(mysql ROLLBACK_TRAN)
if (ret 0)
{
printf(func mysql_query() err d\n ret)
return ret
}
恢复事务动提交标志
ret mysql_query(mysql UNSET_TRAN)
if (ret 0)
{
printf(func mysql_query() err d\n ret)
return ret
}
return ret
}
int mysql_Commit(MYSQL *mysql)
{
int ret 0
执行事务提交SQL
ret mysql_query(mysql COMMIT_TRAN)
if (ret 0)
{
printf(func mysql_query() err d\n ret)
return ret
}
恢复动提交设置
ret mysql_query(mysql UNSET_TRAN)
if (ret 0)
{
printf(func mysql_query() err d\n ret)
return ret
}
return ret
}
#define sql01 INSERT INTO test_table(col1col2col3) VALUES(10 '10' '1')
#define sql02 INSERT INTO test_table(col1col2col3) VALUES(20 '20' '2')
#define sql03 INSERT INTO test_table(col1col2col3) VALUES(30 '30' '3')
#define sql04 INSERT INTO test_table(col1col2col3) VALUES(40 '40' '4')
int main(void)
{
int ret NULL
MYSQL *mysql
MYSQL_RES *res
MYSQL_ROW row
char *query
mysql mysql_init(NULL)
mysql mysql_real_connect(mysql localhost root 123456 mydb2 0 NULL 0 )
if (mysql NULL)
{
ret mysql_errno(mysql)
printf(func mysql_real_connect() err\n)
return ret
}
else
{
printf( ok\n)
}
ret mysql_BeginTran(mysql)
if (ret 0)
{
printf(mysql_BeginTran() errd\n ret)
return ret
}
ret mysql_query(mysql sql01)
if (ret 0)
{
printf(mysql_query() errd\n ret)
return ret
}
ret mysql_query(mysql sql02)
if (ret 0)
{
printf(mysql_query() errd\n ret)
return ret
}
ret mysql_Commit(mysql)
if (ret 0)
{
printf(mysql_Commit() errd\n ret)
return ret
}
ret mysql_BeginTran(mysql)
if (ret 0)
{
printf(mysql_BeginTran() errd\n ret)
return ret
}
ret mysql_query(mysql sql03)
if (ret 0)
{
printf(mysql_query() errd\n ret)
return ret
}
ret mysql_query(mysql sql04)
if (ret 0)
{
printf(mysql_query() errd\n ret)
return ret
}
ret mysql_Rollback(mysql)
if (ret 0)
{
printf(mysql_Rollback() errd\n ret)
return ret
}
mysql_close(mysql)
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档