思考1:mysql数据库里保存到数据是utf8下的char类型数据,当MFC应用程序获得数据显示时会出现乱码,如何解决?
VS强制使用unicode字符集,因此,把从mysql后台传递过来的char数组强制转换为LPCTSTR(在unicode字符集下为wchar_t)传递给界面后,出现了数据丢失,所以出现了乱码。
解决思路:使用MultiByteToWideChar()和WideCharToMultiByte()
MultiByteToWideChar()该函数映射一个字符串到一个宽字符(unicode)的字符串
WideCharToMultiByte()该函数映射一个unicode字符串到一个多字节字符串
在程序中将其分别编入到 char2CSt 和 CSt2char 两个函数中:
具体函数如下:
CString char2CSt(char * szBuf)
{
//计算char *数组大小,以字节为单位,一个汉字占两个字节
int charLen = strlen(szBuf);
//计算多字节字符的大小,按字符计算。
int len = MultiByteToWideChar(CP_ACP, 0, szBuf, charLen, NULL, 0);
//为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
TCHAR *buf = new TCHAR[len + 1];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP, 0, szBuf, charLen, buf, len);
buf[len] = '\0'; //添加字符串结尾,注意不是len+1
//将TCHAR数组转换为CString
CString pWideChar;
pWideChar.Append(buf);//把字符串加到后尾
//删除缓冲区
delete[]buf;
return pWideChar;
}
char * CSt2char(CString str)
{
//注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
int n = str.GetLength();
//获取宽字节字符的大小,大小是按字节计算的
int len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);
//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
char * buff = new char[len + 1]; //以字节为单位
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP, 0, str, str.GetLength() + 1, buff, len + 1, NULL, NULL);
buff[len + 1] = '\0'; //多字节字符以'\0'结束
return buff;
}
利用这两个函数可实现mysql字符与VS之间的转换,避免了乱码问题。
思考2:在修改和删除学生信息时,如何解决因为学号为sc表的主码外码而导致修改学号和删除学生信息导致的失败?
需要先调用set foreign_key_checks=0的mysql语句来关闭外码属性来进行修改和删除,需要注意的是如果要修改学号不仅要修改student表中的信息还要修改sc表中的信息。修改完成后还需要set foreign_key_checks=1来重新打开外码属性。修改学号还需要注意的问题是要先保留原来的学号来调用mysql语句修改,故需要一个全局变量来保存从界面中选中的学生信息的学号。
思考3:在学生选课和重置时,如何实现只重置新选的课而保留历史选课记录?
在选课时就要将选课信息保留下来,即当前学号以及所新选的课,存储在全局变量的数组中,在重置选课时,再搜索当前学号,把学号所对应的新选课记录都抹去,后台同时清空记录,腾出空间。