VC使用C API 连接操作MySQL数据库

一切尽在代码中,代码中也太多了if/else,可以对它进行更好的函数及至类的封装,规范的处理好异常。


  1#include <windows.h>
  2
  3//需要在VC的Options设置一个include路径指向'%mysql_home%/inlude'目录
  4#include <mysql.h>
  5
  6//设置一个lib路径指向'%mysql_home%/lib/opt'目录 (mysql5.0是个目录)
  7#pragma comment(lib,"libmysql.lib")
  8
  9#define host_name "localhost"  //数据库服务器
 10#define db_name "test"         //数据库名
 11#define user_name "root"       //用户名
 12#define password ""            //密码 <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-more="more" data-wp-more-text="" class="wp-more-tag mce-wp-more" alt="" title="Read more..." data-mce-resize="false" data-mce-placeholder="1">
 13
 14int main(int argc,char * argv[]) {
 15    char szSqlText[500] ;
 16    MYSQL *conn;
 17    MYSQL_RES *rs;
 18    MYSQL_ROW row;
 19    //注意它的声明 typedef char **MYSQL_ROW,字符串数组
 20
 21 BOOL bCreate = FALSE;
 22    conn = mysql_init(NULL);
 23
 24    if(conn == NULL) {
 25       fprintf(stderr,"mysql_init() failed (probably out of memory)\n");
 26       exit(1);
 27    }
 28
 29    if(mysql_real_connect(conn,host_name,user_name,password, db_name,MYSQL_PORT,NULL,0) == NULL) {
 30
 31        //在MYSQL初始化之后的操作如果有错误,可以用mysql_errno(MYSQL*)和
 32        //mysql_errer(MYSQL*) 分别获得出错代号和描述
 33
 34        fprintf(stderr,"mysql_real_connect() failed:\nError %u (%s)\n",mysql_errno(conn),mysql_error(conn));
 35        exit(1);
 36    }
 37
 38    printf("connect to db successful.\n");
 39
 40    if(bCreate){
 41
 42        //第一次运行创建一个表mytable
 43        sprintf(szSqlText,"create table mytable(time datetime,s1 char(6),s2 char(11),s3 int,s4 int)");
 44
 45        if(mysql_query(conn,szSqlText)) {
 46            printf("Can't create table.\n");
 47            mysql_close(conn);
 48            return 0;
 49        }
 50    }
 51
 52    sprintf(szSqlText,"insert into mytable values('2000-3-10 21:01:30','Test','MySQLTest',2000,3)");
 53
 54    if(mysql_query(conn,szSqlText)) {
 55        printf("Insert values error:\nError %u (%s)\n", mysql_errno(conn),mysql_error(conn));
 56        mysql_close(conn);
 57
 58        return 0;
 59    } else{
 60
 61        //insert/delete/update 语句可用mysql-affected_rows()得到受作用的行
 62         printf("INSERT statement succeeded: %lu rows affected\n",(unsigned long)mysql_affected_rows(conn));
 63    }
 64
 65    //查询数据
 66    sprintf(szSqlText,"select * from mytable");
 67
 68    //执行成功则返回零
 69    if(mysql_query(conn,szSqlText) != 0) {
 70        mysql_close(conn);
 71        return 0;
 72    } else {
 73
 74        //立即从服务器返回所有行,存储到本地,产生结果集,失败则返回NULL
 75        rs = mysql_store_result(conn);
 76
 77        //结果集是保留在服务器上,fetch_row时才逐行从服务器上取
 78
 79        //rs = mysql_use_result(conn);
 80
 81        //Get query result.
 82
 83        int count = (int)mysql_num_rows(rs);
 84        printf("Query: %s.\n%ld records found.\n",szSqlText,count);
 85
 86        //MYSQL_ROW是一个指向数值数组的指针,row[0],row[1]...row[列数-1]
 87        //所有的数据类型都以字符串返回,即使是数字型,要进行串转换
 88        //NULL指针代表数据库字段的NULL,应经常检查列是否为NULL
 89
 90        while((row = mysql_fetch_row(rs)) != NULL){
 91            //返回NULL,则说明不再有行
 92
 93            for(unsigned int i=0; i<mysql_num_fields(rs);i++){
 94                if(i>0)
 95                    fputc('\t',stdout);
 96                printf("%s",row[i]!=NULL ? row[i]:"NULL");
 97            }
 98            fputc('\n',stdout);
 99        }
100
101        //使用完后,释放结果集占用内存
102        mysql_free_result(rs);
103     }
104
105  mysql_close(conn);
106     return 0;
107}
108
109//最后,注意查询语句中字符串的转义 select a from t where a=''1',是要出错的
110//空字符转换为'\0',这里的0 是可打印的ASCII 码0,而不是空。
111//反斜线、单引号和双引号分别转换为‘\\’、‘\'’ 和‘\"’
112//你也可以用mysql_escape_string(to_str,from_str,from_len)转换sql语句

输出结果是:
connect to db successful.
INSERT statement succeeded: 1 rows affected
Query: select * from mytable.
8 records found.
2000-03-10 21:01:30     Test    MySQLTest       2000    3
2000-03-10 21:01:30     Test    MySQLTest       2000    3
2000-03-10 21:01:30     Test    MySQLTest       2000    3
2000-03-10 21:01:30     Test    MySQLTest       2000    3
2000-03-10 21:01:30     Test    MySQLTest       2000    3
Press any key to continue 永久链接 https://yanbin.blog/vc-c-api-access-mysql/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。