您的位置:首页 > 编程语言 > C语言/C++

C++连接MYSQL

2009-09-05 12:09 337 查看
#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++;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: