- #include <stdio.h>
- #include <windows.h>
- #include <mysql.h>
- #define host "localhost"
- #define username "root"
- #define password "root123"
- #define database "ww"
- MYSQL *conn;
- int main()
- {
- MYSQL_RES *res_set;
- MYSQL_ROW row;
- unsigned int i,ret;
- FILE *fp;
- MYSQL_FIELD *field;
- unsigned int num_fields;
- conn = mysql_init(NULL);
- //ret = mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
- ret = mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gb2312");
- mysql_real_connect(conn,host,username,password,database,0,NULL,0);
- fp = fopen ( "ww.out","w");
- fprintf(fp,"char set %s/n", mysql_character_set_name(conn));
- mysql_query(conn,"SELECT * FROM ww ");//WHERE a1='abc'");
- res_set = mysql_store_result(conn);
- while((field = mysql_fetch_field(res_set)))
- {
- printf("field name %s/n", field->name);
- }
- num_fields = mysql_num_fields(res_set);
- for(i = 0; i < num_fields; i++)
- {
- field = mysql_fetch_field_direct(res_set, i);
- printf("Field %u is %s/n", i, field->name);
- }
- while ((row = mysql_fetch_row(res_set)) != NULL)
- {
- for (i=0; i<mysql_num_fields(res_set); i++)
- {
- fprintf(fp,"%s/n",row[i] != NULL ? row[i] : "NULL");
- }
- }
- mysql_close(conn);
- fclose(fp);
- return 0;
- }
还可以如下:
1、设置工程属性
包含目录 D:/amp/MySQL5/lib/debug;D:/amp/MySQL5/include
2、头文件
代码:
#include "mysql.h"
#pragma comment(lib,"libmySQL.lib")
public:
...
MYSQL mysql;
char *sql;
MYSQL_RES *result;
MYSQL_ROW row;
4、连接数据库
//mysql_real_connect(数据库句柄,主机名,用户名,密码,数据库名,端口,命名管道,客户端标记)
代码:
- mysql_init(&mysql);
- if (!mysql_real_connect(&mysql,"localhost","root","1","mydb",3306,NULL,0))
- {
- MessageBox(_T("数据库连接错误!"));
- return FALSE;
- }
- mysql_query(&mysql,"SET NAMES gb2312");
- mysql_query(&mysql,"SET character set gb2312");
5、如果连接成功,就可以进行数据库的读写了:
步骤是:
1.mysql_query()提交查询语句
2.mysql_use_result()获取上一次查询的结果集
3.mysql_fetch_row()从结果集中获取单项内容
4.mysql_free_result()释放结果集
根据建vc工程的属性:
a.如果不是unicode,只需要在输入输出数据库的地方加上mysql_query(&mysql,"SET NAMES gb2312");
b.如果是unicode,文件是ANSI编码,要进行转换,转换是用MultiByteToWideChar()和WideCharToMultiByte()这两个Windows API,前者ANSI > Unicode, 后者Unicode > ANSI。
- ANSI > Unicode:
- WCHAR ch[200];
- MultiByteToWideChar(CP_ACP,0,row[0],nLength[0]+1,ch,sizeof(ch));
- ===============================================
- Unicode > ANSI:
- // 将CString的内容转换为ANSI
- void UnicodeToAnsi( CString str,char *pstr )
- {
- WCHAR *pwtrQuery;
- pwtrQuery = (WCHAR *)(LPCTSTR)str;
- WideCharToMultiByte(CP_ACP,0,pwtrQuery,-1,pstr,strlen(pstr),NULL,NULL);
- }
- 使用方法:
- char ch[200];
- CString str = L"Unicode charactor";
- UnicodeToAnsi(ch, str);
- Unicode版代码:
- sql = "select username,visitelist,remark from mytable";
- if(mysql_query(&mysql, sql)!=0)
- {
- MessageBox(_T("读取表出错!"));
- return;
- }
- if(!(result = mysql_use_result(&mysql)))
- {
- MessageBox(_T("读取数据集失败!"));
- return;
- }
- int i = 0;
- CString tmp;
- WCHAR wsz[100];
- unsigned long *nLength;
- while(row = mysql_fetch_row(result))
- {
- //ANSI > Unicode
- // 获取结果字段的长度
- nLength = mysql_fetch_lengths(result);
- // 获取结果集中第一个字段的内容
- MultiByteToWideChar(CP_ACP,0,row[0],nLength[0]+1,wsz,sizeof(wsz));
- // tmp.Format(_T("%s"),row[0]);
- m_list.InsertItem(0, wsz);
- nLength = mysql_fetch_lengths(result);
- MultiByteToWideChar(CP_ACP,0,row[1],nLength[1]+1,wsz,sizeof(wsz));
- // tmp.Format(_T("%s"),row[1]);
- m_list.SetItemText(0, 1, wsz);
- nLength = mysql_fetch_lengths(result);
- MultiByteToWideChar(CP_ACP,0,row[2],nLength[2]+1,wsz,sizeof(wsz));
- // tmp.Format(_T("%s"),row[2]);
- m_list.SetItemText(0, 2, wsz);
- i++;
- }
- mysql_free_result(result);
- 非Unicode版代码:
- ...
- while(row = mysql_fetch_row(result))
- {
- tmp.Format("%s",row[0]);
- m_list.InsertItem(0, tmp);
- nLength = mysql_fetch_lengths(result);
- tmp.Format("%s",row[1]);
- m_list.SetItemText(0, 1, tmp);
- nLength = mysql_fetch_lengths(result);
- tmp.Format("%s",row[2]);
- m_list.SetItemText(0, 2, tmp);
- i++;
- }