要使用mysql的C API来操作数据库,则在安装数据库的时候必须选择安装其开发组件,主要是一些头文件和库文件的安装,在编程的时候需要使用这些库。在程序开发的时候,需要包含头文件文件夹include,以及库文件夹lib/debug,在外部库依赖中填写libmysql.lib,另外,由于需要使用网络连接,还需要开启windows socket 支持。
在我的测试程序中,我建立的表结构为:
其中的数据有:
测试代码(测试代码没有处理编码方面的问题,本人发现当user_name字段中存在汉字时,对话框中显示的是问号):
//测试连接mysql
void CServerDlg::OnBnClickedConnMysqlButton()
{
// TODO: Add your control notification handler code here
MYSQL mysql; //数据库连接句柄
mysql_init (&mysql);
//建立连接
if(!mysql_real_connect(&mysql,"127.0.0.1","root","123456","test",3306,NULL,0))
{//mydb为你所创建的数据库,3306为端口号,可自行设定
AfxMessageBox(_T("数据库连接失败!"));
}
else
{
AfxMessageBox(_T("数据库连接成功!"));
}
//修改操作
char * update_query = "update user set user_name=\'sabi-No1\' where user_id=\'2340230\'";
int length = strlen(update_query);
if(mysql_real_query(&mysql, update_query, length)!=0)
{
AfxMessageBox(_T("修改失败!"));
}
else
{
AfxMessageBox(_T("修改成功!"));
}
//添加操作
char * add_query = "insert into user (user_id,pwd,user_name) values (\'8220334\',\'123456\',\'test2\')";
length = strlen(add_query);
if(mysql_real_query(&mysql, add_query, length)!=0)
{
AfxMessageBox(_T("添加失败!"));
}
else
{
AfxMessageBox(_T("添加成功!"));
}
//删除操作
char * del_query = "delete from user where user_id=\'8220334\'";
length = strlen(del_query);
if(mysql_real_query(&mysql, del_query, length)!=0)
{
AfxMessageBox(_T("删除失败!"));
}
else
{
AfxMessageBox(_T("删除成功!"));
}
//查询操作
char * sel_query = "select * from user";
length = strlen(sel_query);
MYSQL_RES * result;
MYSQL_ROW row;
unsigned long * collen;
if((mysql_real_query(&mysql, sel_query, length)==0) && ((result = mysql_use_result(&mysql)) != NULL))
{
AfxMessageBox(_T("查询成功!"));
int num_col = mysql_num_fields(result);
while (row = mysql_fetch_row(result))
{
AfxMessageBox(row[0]);
AfxMessageBox(row[1]);
AfxMessageBox(row[2]);
}
mysql_free_result(result);
}
else
{
AfxMessageBox(_T("查询失败!"));
}
//
mysql_close(&mysql);
}
(20120704注:)
关于乱码的问题,今天解决了。数据库中存储数据使用的是utf8编码,这是一种三字节的编码,我的VC使用的是双字节的unicode编码。具体的处理过程是:
1、在建立连接前设置选项
mysql_options(&mysql,MYSQL_SET_CHARSET_NAME, "utf8");
2、从数据库读取数据时,获取他的字段长度
row = mysql_fetch_row(result);
unsigned long * collen = mysql_fetch_lengths(result);
3、使用MultiByteToWideChar方法将三字节数据转换为双字节数据(详见
MSDN)
WCHAR wsz[100];
MultiByteToWideChar(CP_UTF8,0,row[0],collen[0]+1,wsz,sizeof(wsz));
CString str;
str.Format(L"%s",wsz);
AfxMessageBox(str);
MultiByteToWideChar(CP_UTF8,0,row[1],collen[1]+1,wsz,sizeof(wsz));
str.Format(L"%s",wsz);
AfxMessageBox(str);
MultiByteToWideChar(CP_UTF8,0,row[2],collen[2]+1,wsz,sizeof(wsz));
str.Format(L"%s",wsz);
AfxMessageBox(str);