要使用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);