系统是Windows7旗舰版,编程环境用的是VC6.0。
1. 配置VC。
(1)打开VC6.0工具栏Tools菜单下的Options选项,在Directories的标签页中右边的“Showdirectories for:下拉列表中选中“Includefiles”,然后在中间列表框中添加你本地安装MySQL的include目录路径。(我的是D:\Program Files\MySQL\MySQL Server 5.0\include)。
(2)在上面说到的“Showdirectories for:”下拉列表中选中“Library files”,然后添加你本地安装MySQL的Lib目录路径。Lib目录下还有debug和opt两个目录,建议选debug。(我的是D:\ProgramFiles\MySQL\MySQL Server 5.0\lib\debug)。
注:在安装MySQL时选择“完全安装”(只有这样才会安装VC编译时需要的头文件等),当然也可以选择“自定义安装”,不过要记得把“开发套件”给选上。
2. 开始编程。
如想在程序中用MySQL数据库,则要添加如下代码:
#include <winsock.h>//因为数据库通信用的socket技术
#include <mysql.h>
#pragma comment(lib,"libmysql.lib")
至于更详细的编程,可参看MySQL手册C API进行编程。
3. 实例
#include <winsock.h>//因为数据库通信用的socket技术
//需要在VC的Options设置一个include路径指向'%mysql_home%/inlude'目录
#include <mysql.h>
//设置一个lib路径指向'%mysql_home%/lib/opt'目录 (mysql5.0是个目录)
#include <stdio.h>
#pragma comment(lib,"libmysql.lib")
#define host_name "localhost" //数据库服务器
#define db_name "xiaogu" //数据库名
#define user_name "root" //用户名
#define password "root" //密码
int main( int argc, char * argv[]) {
char szSqlText[500] ;
MYSQL *conn;
MYSQL_RES *rs;
MYSQL_ROW row; //注意它的声明 typedef char**MYSQL_ROW,字符串数组
conn = mysql_init(NULL);
if (conn == NULL)
{
fprintf(stderr, "mysql_init() failed (probably out of memory)\n" );
exit(1);
}
if (mysql_real_connect(conn,host_name,user_name,password,
db_name,MYSQL_PORT,NULL,0) == NULL)
{
//在MYSQL初始化之后的操作如果有错误,可以用mysql_errno(MYSQL*)和
//mysql_errer(MYSQL*) 分别获得出错代号和描述
fprintf(stderr, "mysql_real_connect() failed:\nError %u (%s)\n" ,
mysql_errno(conn),mysql_error(conn));
exit(1);
}
printf( "connect to db successful.\n" );
sprintf(szSqlText, "insert into mytable values('2000-3-1021:01:30','Test','MySQLTest',2000,3)" );
if (mysql_query(conn,szSqlText)) {
printf( "Insert values error:\nError %u (%s)\n" ,
mysql_errno(conn),mysql_error(conn));
mysql_close(conn);
return 0;
}
else {
//insert/delete/update 语句可用mysql-affected_rows()得到受作用的行
printf( "INSERT statement succeeded: %lu rows affected\n" ,
(unsigned long )mysql_affected_rows(conn));
}
//查询数据
sprintf(szSqlText, "select * from mytable" );
//执行成功则返回零
if (mysql_query(conn,szSqlText) != 0) {
mysql_close(conn);
return 0;
}
else {
//立即从服务器返回所有行,存储到本地,产生结果集,失败则返回NULL
rs = mysql_store_result(conn);
//结果集是保留在服务器上,fetch_row时才逐行从服务器上取
//rs = mysql_use_result(conn);
//Get query result.
int count = ( int )mysql_num_rows(rs);
printf( "Query: %s.\n%ld records found.\n" ,szSqlText,count);
//MYSQL_ROW是一个指向数值数组的指针,row[0],row[1]...row[列数-1]
//所有的数据类型都以字符串返回,即使是数字型,要进行串转换
//NULL指针代表数据库字段的NULL,应经常检查列是否为NULL
while ((row = mysql_fetch_row(rs)) != NULL){ //返回NULL,则说明不再有行
for (unsigned int i=0; i<mysql_num_fields(rs);i++){
if (i>0)
fputc('\t',stdout);
printf( "%s" ,row[i]!=NULL ? row[i]: "NULL" );
}
fputc('\n',stdout);
}
//使用完后,释放结果集占用内存
mysql_free_result(rs);
}
mysql_close(conn);
return 0;
}
//最后,注意查询语句中字符串的转义 select a from t where a=''1',是要出错的
//空字符转换为'\0',这里的0 是可打印的ASCII 码0,而不是空。
//反斜线、单引号和双引号分别转换为'\\'、'\'' 和'\"'
//你也可以用mysql_escape_string(to_str,from_str,from_len)转换sql语句