今天,突然想试试用c语言访问mysql数据库,在网上找了下,发现都是写linux下的,而windows下的比较少,想想windows下和linux下应该差不多,所以就试了一下,发现还是有区别的,我分别用CodeBlocks和CodeGear和 Visual Studio 2005做了试验。
CodeBlocks和Visual Studio 2005方法一样,首先建立win32控制台工程,建立一个c源文件:
#include <stdio.h>
#include <windows.h>
#include “D:/MySQL5/include/mysql.h”
#pragma comment(lib,”ibmysql.lib”)
int main(){
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
mysql_init(&mysql); //初始化mysql结构
mysql_real_connect(&mysql,”localhost”,”root”,”root”,”test”,0,NULL,0);//连接服务器
mysql_query(&mysql,”select * from user”); //进行查询
result=mysql_store_result(&mysql); //获得结果集
while((row=mysql_fetch_row(result))){ //取出结果集中记录
fprintf(stdout,”userID:%s password:%s \n”,row[0],row[1]); //输出这行记录
}
mysql_free_result(result); //释放结果集
mysql_close(&mysql); //释放连接
return 0;
}
然后在工程属性中,修改library加入D:\MySQL5\lib\opt目录,这样才能找到ibmysql.lib。
编译链接后会生成exe文件,但是会提示找不到libmysql.dll文件,我把libmysql.dll文件放到c:\windows\system32目录ok了,运行程序输出所有用户ID和密码,访问数据库成功了。
下面说一下在CodeGear下使用的方法,在CodeGear下与Visual Studio 2005和CodeBlocks不同,因为mysql的lib,CodeGear是无法直接使用的,需要用coff2omf.exe转换一下,方法是cmd下直接输入coff2omf就可以出现使用帮助
使用后生成一个新的lib,我命名为new.lib,然后就可以一样使用这个新的lib了,代码如下:
#include <stdio.h>
#include <windows.h>
#include “mysql.h”
#pragma comment(lib,”new.lib”) //这个位置变成新的lib名字
int main(){
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
mysql_init(&mysql); //初始化mysql结构
mysql_real_connect(&mysql,”localhost”,”root”,”root”,”ngo”,0,NULL,0);//连接服务器
mysql_query(&mysql,”select * from user”); //进行查询
result=mysql_store_result(&mysql); //获得结果集
while((row=mysql_fetch_row(result))){ //取出结果集中记录
fprintf(stdout,”%s-%s\n”,row[0],row[1]); //输出这行记录
}
mysql_free_result(result); //释放结果集
mysql_close(&mysql); //释放连接
return 0;
}
运行效果和 CodeBlocks和Visual Studio 2005一样。
好了就写这些吧,写的肤浅的请大家见谅。
>> 本文固定链接: http://www.vcgood.com/archives/2333
靠 我看得脑袋都大 了
没用C连过数据库 学习下
再接着发一个对上面例子的修改版本:
#include <stdio.h>
#include <windows.h>
#include “D:/MySQL5/include/mysql.h”
#pragma comment(lib,”ibmysql.lib”)
int main(){
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
mysql_init(&mysql); //初始化mysql结构
if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
printf(“\n不能连接到mysql数据库\n”);
}else{
printf(“\n连接数据库成功\n”);
if(mysql_query(&mysql,”select * from book”)){ //如果查询失败
printf(“\n查询book表失败\n”);
}else{
mysql_query(&mysql,”select * from book”); //进行查询
result=mysql_store_result(&mysql); //获得结果集
if(mysql_num_rows(result)!=NULL){ //有记录的情况,只有有记录取数据才有意义
while((row=mysql_fetch_row(result))){ //取出结果集中记录
fprintf(stdout,”ID:%s BookName:%s author:%s bookconcern:%s \n”,row[0],row[1],row[2],row[3]); //输出这行记录
}
}else{
printf(“\n没有一行记录被发现\n”);
}
mysql_free_result(result); //释放结果集
}
}
mysql_close(&mysql); //释放连接
return 0;
}
表结构如下:
CREATE TABLE `book` (
`ID` int(10) unsigned NOT NULL COMMENT ‘ID’,
`bookname` char(50) NOT NULL,
`author` char(50) NOT NULL,
`bookconcern` char(100) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
今天把上次的练习加点功能,增加上字段和记录数的获取,以及mysql标准错误的输出。
下面我在CodeBlocks中进行练习,这个例子在CodeGear下不能编译通过,原因在开始时候说过了,需要转换,这里就不说了
以后我都会以这个为c开发环境,vs2005和CodeGear都只用来查东西和测试用,如果您还没有CodeBlocks可以去下载一个下载
地址为:http://www.codeblocks.org
#include <stdio.h>
#include <windows.h>
#include “D:/MySQL5/include/mysql.h”
#pragma comment(lib,”ibmysql.lib”)
int main(){
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
mysql_init(&mysql); //初始化mysql结构
if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
fprintf(stderr,”数据库连接发生错误”,mysql_error(&mysql)); //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
}else{
printf(“\n连接数据库成功\n”);
if(mysql_query(&mysql,”select * from book”)){
fprintf(stderr,”数据库查询发生错误”,mysql_error(&mysql)); //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
}else{
mysql_query(&mysql,”select * from book”);
printf(“\n开始查询……..\n”);
result=mysql_store_result(&mysql); //获得结果集
if(mysql_num_rows(result)!=NULL){ //有记录的情况
int numRecords=mysql_num_rows(result); //得到表中记录数
int numField=mysql_num_fields(result); //得到表中字段数
printf(“\n共发现:”);
printf(“\t%d个字段”,numField);
printf(“\t%d行记录”,numRecords);
while((row=mysql_fetch_row(result))){ //取出结果集中记录
int i=0;
printf(“\n————————————————\n”);
for(i=0;i<numField;i++){
fprintf(stdout,”第%d个字段值为:%s \n”,i,row[i]); //取出字段的值
}
printf(“\n————————————————\n”);
}
}else{
printf(“\n没有一行记录被发现\n”);
}
mysql_free_result(result); //释放结果集
}
}
mysql_close(&mysql); //释放连接
return 0;
}
运行结果如下:
连接数据库成功
开始查询……..
共发现: 4个字段 2行记录
————————————————
第0个字段值为:1
第1个字段值为:english
第2个字段值为:ranka lee
第3个字段值为:china book concern
————————————————
————————————————
第0个字段值为:2
第1个字段值为:c program
第2个字段值为:sheryl
第3个字段值为:hainan book concern
————————————————
上面的练习,只是指出字段以及值,下面我们看看加上自动获取字段名以后的情况,把代码改一下,如下:
#include <stdio.h>
#include <windows.h>
#include “D:/MySQL5/include/mysql.h”
#pragma comment(lib,”ibmysql.lib”)
int main(){
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
MYSQL_FIELD *field;
mysql_init(&mysql); //初始化mysql结构
if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
fprintf(stderr,”数据库连接发生错误”,mysql_error(&mysql)); //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
}else{
printf(“\n连接数据库成功\n”);
if(mysql_query(&mysql,”select * from book”)){
fprintf(stderr,”数据库查询发生错误”,mysql_error(&mysql)); //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
}else{
mysql_query(&mysql,”select * from book”);
printf(“\n开始查询……..\n”);
result=mysql_store_result(&mysql); //获得结果集
if(mysql_num_rows(result)!=NULL){ //有记录的情况
int numRecords=mysql_num_rows(result); //得到表中记录数
int numField=mysql_num_fields(result); //得到表中字段数
while(field=mysql_fetch_field(result)){ //这里怎么就执行了两次呢?我不明白为什么只读取了两个字段,谁知道请留言
field=mysql_fetch_field(result);
printf(“%s\t”,field->name);
}
printf(“\n”);
while((row=mysql_fetch_row(result))){ //取出结果集中记录
int i=0;
for(i=0;i<numField;i++){
fprintf(stdout,”%s\t”,row[i]); //取出字段的值
}
printf(“\n”);
}
}else{
printf(“\n没有一行记录被发现\n”);
}
mysql_free_result(result); //释放结果集
}
}
mysql_close(&mysql); //释放连接
return 0;
}
运行结果如下:
连接数据库成功
开始查询……..
bookname bookconcern
1 english ranka lee china book concern
2 c program sheryl hainan book concern
这个练习做完了,但是另外迷茫的是字段名字为什么少了两个,如果谁知道请给我留言,谢谢拉。
mysql来做插入,修改,删除的动作
#include <stdio.h>
#include <windows.h>
#include “mysql.h”
#pragma comment(lib,”ibmysql.lib”)
int main(){
MYSQL mysql;
mysql_init(&mysql); //初始化mysql结构
if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
fprintf(stderr,”数据库连接发生错误”,mysql_error(&mysql)); //这里的输出我们换成标准错误输出,这个是mysql自己带的异常。
}else{
printf(“连接数据库成功!\n”);
// if(mysql_query(&mysql,”insert into book (ID,bookname,author,bookconcern) values (4,’aa’,'aa’,'aa’)”)!=0){ //执行插入语句
// if(mysql_query(&mysql,”update book set bookname=’hello beijing’ where ID=3″)!=0){ //执行更新语句
if(mysql_query(&mysql,”delete from book where ID=4″)!=0){ //执行删除语句
fprintf(stderr,”在执行插语句时错误发生”,mysql_error(&mysql));
}else{
printf(“执行插语句成功!\n”);
}
}
mysql_close(&mysql); //释放连接
return 0;
}
修改一下之前的那个例子,少了字段的那个。同时增加二进制blob字段的判断。
#include <stdio.h>
#include <windows.h>
#include “mysql.h”
#pragma comment(lib,”ibmysql.lib”)
int main(){
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
MYSQL_FIELD *field;
mysql_init(&mysql); //初始化mysql结构
if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
fprintf(stderr,”数据库连接发生错误”,mysql_error(&mysql)); //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
}else{
printf(“\n连接数据库成功\n”);
if(mysql_query(&mysql,”select * from book”)){
fprintf(stderr,”数据库查询发生错误”,mysql_error(&mysql)); //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
}else{
mysql_query(&mysql,”select * from book”);
printf(“\n开始查询……..\n”);
result=mysql_store_result(&mysql); //获得结果集
if(mysql_num_rows(result)!=NULL){ //有记录的情况
int numRecords=mysql_num_rows(result); //得到表中记录数
int numField=mysql_num_fields(result); //得到表中字段数
int blobflag=0;
int counter=0;
while(field=mysql_fetch_field(result)){ //这里怎么就执行了两次呢?我不明白为什么只读取了两个字段,谁知道请留言
printf(“%s\t”,field->name);
counter++;
if(field->flags&BINARY_FLAG){
blobflag=counter;
}
}
printf(“\n”);
while((row=mysql_fetch_row(result))){ //取出结果集中记录
int i=0;
for(i=0;i<numField;i++){
if(i!=blobflag-1){
fprintf(stdout,”%s\t”,row[i]); //取出字段的值
}else{
fprintf(stdout,”%s\t”,”[二进制数据]“); //取出字段的值
}
}
printf(“\n”);
}
}else{
printf(“\n没有一行记录被发现\n”);
}
mysql_free_result(result); //释放结果集
}
}
mysql_close(&mysql); //释放连接
return 0;
}
慢慢学习和体会
多谢楼主啊