课设复习之数据库学生选课系统

思考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:在学生选课和重置时,如何实现只重置新选的课而保留历史选课记录?

在选课时就要将选课信息保留下来,即当前学号以及所新选的课,存储在全局变量的数组中,在重置选课时,再搜索当前学号,把学号所对应的新选课记录都抹去,后台同时清空记录,腾出空间。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值