windows程序设计——飞机大战笔记(Access数据库的使用)

//////////////////2015/07/22///////////////////

/////////////////by xbw /////////////////////////

////////////////环境 VS2013/////////////////

为了登陆界面的注册用的数据库鼓捣的一天了,必须得写篇文章发泄一下了,

昨天发表的文章还是存在一点bug的,不足之处很容易就看出来了,这样的,今天有修改了一下,是大改哦

int first = 1;
	while (!Dbset.IsEOF())	// 有没有到表结尾
	{
		Dbset.GetFieldValue(_T("Name"), var);
		Sname = (LPCSTR)var.pbstrVal;
		Dbset.GetFieldValue(_T("Psw"), var);
		Spsw = (LPCSTR)var.pbstrVal;
		Dbset.GetFieldValue(_T("Score"), var);
		Sscore = (LPCSTR)var.pbstrVal;
		if (Sname.Compare(m_logname) == 0 && Spsw.Compare(m_logpsw) == 0)//如果密码和账户与数据库一致
		{
			MessageBox(_T("登入成功!"), _T("温情提示"));
			CDialog::OnOK();
			first = 0;
			break;
		}
		else
		{
			Dbset.MoveNext();
		}
	}
	if (first)
	{
		MessageBox(_T("用户或密码错误!"), _T("温情提示"));
	}

这就是修改的地方,资料查了半天,才知道MFC调用数据库有这么多方法,这个呢是适合我的,

因为我的定义是

CDaoDatabase db;                                       //数据库

CDaoRecordset RecSet(&db);                   //记录集

头文件 #include "afxdao.h"

唉,不多说了,直接上完整代码,贴出来好心疼,大家互相交流学习吧,,,,,,

// loading.cpp : 实现文件
//

#include "stdafx.h"
#include "PlaneGame.h"
#include "loading.h"
#include "afxdialogex.h"
#include "afxdao.h"
#include "zhuce.h"
// loading 对话框

IMPLEMENT_DYNAMIC(loading, CDialogEx)
CDaoDatabase db;                                       //数据库

CDaoRecordset RecSet(&db);                   //记录集
loading::loading(CWnd* pParent /*=NULL*/)
	: CDialogEx(loading::IDD, pParent)
	, open(false)
	, open1(false)
	, m_logname(_T(""))
	, m_logpsw(_T(""))
{

	CString Filepath = _T("Database.mdb");
	CDaoRecordset Dbset(&db);
	CFileFind Ffind;
	BOOL flag = Ffind.FindFile(Filepath);
	Ffind.Close();
	if (!flag)
	{
		CString sqlcmd = _T("CREATE TABLE DataTable(Name VARCHAR(20),Psw VARCHAR(20),Score VARCHAR(20))");
		db.Create(Filepath);
		db.Execute(sqlcmd);
		Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable", 0));
		Dbset.AddNew();
		Dbset.SetFieldValue(_T("Name"), _variant_t(_T("plucky")));
		Dbset.SetFieldValue(_T("Psw"), _variant_t(_T("MFC_py")));//设置初始用户名和密码
		Dbset.SetFieldValue(_T("Score"), _variant_t(_T("0")));
		Dbset.Update();
		Dbset.Close();
		db.Close();
	}//这样就创建好了数据库文件,而且设置了初始化账号
}

loading::~loading()
{

}

void loading::DoDataExchange(CDataExchange* pDX)
{

	DDX_Text(pDX, IDC_EDIT3, m_logname);
	DDX_Text(pDX, IDC_EDIT4, m_logpsw);
}

BEGIN_MESSAGE_MAP(loading, CDialogEx)
	ON_WM_NCHITTEST()
	ON_WM_CTLCOLOR()
	ON_BN_CLICKED(IDCANCEL, &loading::OnBnClickedCancel)
	ON_BN_CLICKED(IDOK, &loading::OnBnClickedOk)
	ON_BN_CLICKED(IDOK2, &loading::OnBnClickedOk2)
	ON_NOTIFY(NM_CLICK, IDC_SYSLINK1, &loading::OnNMClickSyslink1)
	ON_NOTIFY(NM_CLICK, IDC_SYSLINK2, &loading::OnNMClickSyslink2)
END_MESSAGE_MAP()

// loading 消息处理程序

//鼠标拖动窗口移动
//CDaoDatabase db;                                       //数据库

//CDaoRecordset RecSet(&db);                   //记录集

LRESULT loading::OnNcHitTest(CPoint point)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	ScreenToClient(&point);

	CRect rc;
	GetClientRect(&rc);

	if (rc.PtInRect(point))
	{
		return HTCAPTION;
	}
	else
	{
		return CDialogEx::OnNcHitTest(point);
	}
}

HBRUSH loading::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	//HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	//CFont font;
	//font.CreatePointFont(200, _T("宋体"), NULL);
	//GetDlgItem(IDC_STATIC)->SetFont(&font);
	// TODO:  在此更改 DC 的任何特性

	//在OnInitDialog()函数中添加:

	// TODO: 在此添加额外的初始化代
	if (nCtlColor == CTLCOLOR_STATIC)
	{
		pDC->SetTextColor(RGB(200, 100, 50));
		pDC->SetBkMode(RGB(200, 100, 50));   //设置背景透明
		return   HBRUSH(GetStockObject(HOLLOW_BRUSH));

	}

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	//return hbr;
	return 0;

}

void loading::OnBnClickedCancel()
{
	// TODO:  在此添加控件通知处理程序代码
	open = FALSE;
	CDialogEx::OnCancel();
}

void loading::OnBnClickedOk()
{
	// TODO:  在此添加控件通知处理程序代码
//	CString Filepath = _T("Database.mdb");
//	CDaoRecordset Dbset(&db);
//	CFileFind Ffind;
//	BOOL flag = Ffind.FindFile(Filepath);
//	Ffind.Close();
	/*if (!flag)
	{
		CString sqlcmd = _T("CREATE TABLE DataTable(Name VARCHAR(20),Psw VARCHAR(20),Score VARCHAR(20))");
		db.Create(Filepath);
		db.Execute(sqlcmd);
		Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable", 0));
		Dbset.AddNew();
		Dbset.SetFieldValue(_T("Name"), _variant_t(_T("plucky")));
		Dbset.SetFieldValue(_T("Psw"), _variant_t(_T("MFC_py")));//设置初始用户名和密码
		Dbset.SetFieldValue(_T("Score"), _variant_t(_T("0")));
		Dbset.Update();
		Dbset.Close();
		db.Close();
	}//这样就创建好了数据库文件,而且设置了初始化账号*/

	/*CString sPath;
	GetModuleFileName(NULL, sPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
	sPath.ReleaseBuffer();
	int nPos;
	nPos = sPath.ReverseFind('\\');
	sPath = sPath.Left(nPos);
	CString strFile = sPath + _T("\\Database.mdb");
	db.Open(strFile);               // 打开已创建的demo数据库及DemoTable表
	RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT* FROM DataTable"), NULL);*/

	//UpdateData(TRUE);
	//CString m_tablefield, m_searchSQL;
	//if (m_sfield.Compare("姓名") == 0)
	//{
	//	m_tablefield.Format("Name");
	//}

	/*UpdateData(true);
	CDaoRecordset Dbset(&db);
	CString Filepath =_T( "Database.mdb");
	CString Sname, Spsw,Sscore;
	_variant_t varname, varpsw,varscore;
	db.Open(Filepath);
	Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable"), 0);
	varname = Dbset.GetFieldValue(_T("Name"));
	varpsw = Dbset.GetFieldValue(_T("Psw"));
	varscore = Dbset.GetFieldValue(_T("Score"));
	Sname = (LPCSTR)_bstr_t(varname);
	Spsw = (LPCSTR)_bstr_t(varpsw);
	Sscore = (LPCSTR)_bstr_t(varscore);
	Dbset.Close();
	db.Close();
	if (Sname.Compare(m_logname)==0&&Spsw.Compare(m_logpsw) == 0)//如果密码和账户与数据库一致
	{
		MessageBox(_T("登入成功!"), _T("温情提示"));
		CDialog::OnOK();
	}
	else
	{
		MessageBox(_T("用户或密码错误!"), _T("温情提示"));
		return;
	}*/
	UpdateData(true);
	COleVariant var;		// 字段类型
	var.ChangeType(VT_BSTR, NULL);
	//CString strName, strAge, strFile;
	CString Sname, Spsw, Sscore;
	CDaoRecordset Dbset(&db);
	CString Filepath = _T("Database.mdb");
	db.Open(Filepath);
	Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable"), 0);
	int first = 1;
	while (!Dbset.IsEOF())	// 有没有到表结尾
	{
		Dbset.GetFieldValue(_T("Name"), var);
		Sname = (LPCSTR)var.pbstrVal;
		Dbset.GetFieldValue(_T("Psw"), var);
		Spsw = (LPCSTR)var.pbstrVal;
		Dbset.GetFieldValue(_T("Score"), var);
		Sscore = (LPCSTR)var.pbstrVal;
		if (Sname.Compare(m_logname) == 0 && Spsw.Compare(m_logpsw) == 0)//如果密码和账户与数据库一致
		{
			MessageBox(_T("登入成功!"), _T("温情提示"));
			CDialog::OnOK();
			first = 0;
			break;
		}
		else
		{
			Dbset.MoveNext();
		}
	}
	if (first)
	{
		MessageBox(_T("用户或密码错误!"), _T("温情提示"));
	}
	db.Close();
	Dbset.Close();

	/*UINT nIndex = 0;
	CString TempStr;
	COleVariant OleVariant;
	// 删除列表控件所有记录
	BookList.DeleteAllItems();
	// 定义记录集对象,并打开记录集
	CDaoRecordset Record(&db);
	Record.Open(dbOpenDynaset, L"SELECT * FROM BOOK");
	// 移动到第一条记录
	Record.MoveFirst();
	while (!Record.IsEOF())
	{
		// 在列表控件添加记录
		TempStr.Format(L"%d", nIndex + 1);
		this->BookList.InsertItem(nIndex, TempStr);
		for (int i = 1; i <= 3; i++)
		{
			Record.GetFieldValue(i, OleVariant);
			this->BookList.SetItemText(nIndex, i, OleVariant.bstrVal);
		}
		Record.GetFieldValue(4, OleVariant);
		TempStr.Format(L"%d", OleVariant.uintVal);
		this->BookList.SetItemText(nIndex, 4, TempStr);
		// 移到下一条记录Record.MoveNext () ;nIndex++ ;
	}
	// 关闭记录集
	Record.Close();*/
}

void loading::OnBnClickedOk2()
{
	open1 = FALSE;
	// TODO:  在此添加控件通知处理程序代码
}

void loading::OnNMClickSyslink1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO:  在此添加控件通知处理程序代码
	zhuce dlg;
	//opening = TRUE;
	if (dlg.DoModal() == IDOK)
	{
		Invalidate();
	}
	*pResult = 0;
}

void loading::OnNMClickSyslink2(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO:  在此添加控件通知处理程序代码
	MessageBox(_T("暂无此功能,请联系开发者"), _T("温情提示"));
	*pResult = 0;
}

中间太多注释的部分,因为改了又改,不怕辛苦,弄出来了真的很开心,,,,,,给你们分享了;

这个注册部分呢也修改了;;;

直接上代码吧;;;;

// zhuce.cpp : 实现文件
//

#include "stdafx.h"
#include "PlaneGame.h"
#include "zhuce.h"
#include "afxdialogex.h"
#include "afxdao.h"

// zhuce 对话框

IMPLEMENT_DYNAMIC(zhuce, CDialogEx)

zhuce::zhuce(CWnd* pParent /*=NULL*/)
	: CDialogEx(zhuce::IDD, pParent)
	, m_regname(_T(""))
	, m_regpsw(_T(""))
{

}

zhuce::~zhuce()
{
}

void zhuce::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, m_regname);
	DDX_Text(pDX, IDC_EDIT2, m_regpsw);
}

BEGIN_MESSAGE_MAP(zhuce, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &zhuce::OnBnClickedButton1)
	ON_BN_CLICKED(IDOK, &zhuce::OnBnClickedOk)
END_MESSAGE_MAP()

// zhuce 消息处理程序

void zhuce::OnBnClickedButton1()
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(true);//上一次视频里已经讲过,续及时更新数据
	CString Filepath = _T("Database.mdb");
	//CString Sname;
	CDaoDatabase db;
//	_variant_t varname;
	CDaoRecordset Dbset(&db);
	db.Open(Filepath);
	Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable"), 0);
	//varname = Dbset.GetFieldValue(_T("Name"));
	//Sname = (LPCSTR)_bstr_t(varname);

	if (m_regname.IsEmpty() || m_regpsw.IsEmpty())
	{
		MessageBox(_T("信息不能为空!"), _T("温情提示"));
	}
	else
	{
		CString Sname;
		COleVariant var;		// 字段类型
		var.ChangeType(VT_BSTR, NULL);
		int first = 1;
		while (!Dbset.IsEOF())	// 有没有到表结尾
		{
			Dbset.GetFieldValue(_T("Name"), var);
			Sname = (LPCSTR)var.pbstrVal;
			if (Sname.Compare(m_regname) == 0)//如果密码和账户与数据库一致
			{
				MessageBox(_T("该用户已存在!"), _T("温情提示"));
				CDialog::OnOK();
				first = 0;
				//break;
			}
			else
			{
				Dbset.MoveNext();
			}
		}
		if (first)
		{
			Dbset.MoveLast();
			//Dbset.Edit();//因为表里只允许有一个数据,所以就将新数据代替旧数据
			Dbset.AddNew();
			Dbset.SetFieldValue(_T("Name"), _variant_t(m_regname));
			Dbset.SetFieldValue(_T("Psw"), _variant_t(m_regpsw));
			Dbset.SetFieldValue(_T("Score"), _variant_t(_T("0")));
			Dbset.Update();
			MessageBox(_T("用户注册成功!"), _T("温情提示"));
		}
	}
	Dbset.Close();
	db.Close();
}

void zhuce::OnBnClickedOk()
{
	// TODO:  在此添加控件通知处理程序代码
	CDialogEx::OnOK();
}

这段代码让我哭笑不得,,出了个bug,在群里跟别人分享都说这要是加上开机自动启动就无敌了,其实没这么可怕,只是死循环,一直显示该用户已存在,避免这个的方法是什么清楚吧,就是不要重复注册,开玩笑了,你只要把break那个地方取消注释就好了,千万不要乱用哦,要维护好网络安全哦;;;;;;

好了,我也是个渣渣,只能整理资料,并不能讲的很透彻,,,,,,制作登陆账号注册的可以试试此代码;;;不错的哦;;;

累死咯,不玩了,,,,接下来弄一下MFC套接字,争取把数据放到服务器上,用客户端调用服务器注册,,,,,

有懂的给我留言吧,谢谢啦;;;;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 03:21:40

windows程序设计——飞机大战笔记(Access数据库的使用)的相关文章

windows程序设计——飞机大战笔记(数据库记录游戏得分)

//////////////////2015/07/23//////////////// //////////////////by xbw////////////////////// /////////////////环境 VS2013//////////// 这个飞机大战呢,做了也有好几天了,我一半以上时间在鼓捣这个数据库,第一次弄,也学到了不少东西,在此记录一下,也分享一下经验:: 接着上次说吧,昨天呢,实现了多组数据的存储与调用,欣喜若狂,昨天就已经试验了这个对用户积分的储存,但是昨天不只

windows程序设计——飞机大战笔记(单文档文件登陆界面)

//////////////2015/07/21//////////////// /////////////by xbw/////////////////////// /////////////环境 VS 2013//////////// 飞机大战做的差不多了,闲来无事加点高大上的东西,关于单文档的登陆界面::: 界面有点丑,但是足够账号登陆了,,先试一把: 还不错吧,该有的都有了:: 下面说一下过程 ...... 首先,我们要在资源视图中创建一个Dialog对话框::: 先大体画一下这个对话框

windows程序设计——飞机大战笔记(解决输入混合password账户,结局自己主动记录数据)

////////////////////2015/07/23/////////////////// ////////////////////by xbw/////////////////////////// ////////////////////环境 VS2013/////////////// 问题又攻克了,攻克了登陆仅仅能用数字登陆的问题.还有自己主动记录数据的问题.. 这个仅仅能用数字登陆是后来调试出来的bug,之前没想到.为了调试方便,仅仅用了账号为1.password为1来測试的,如今

windows程序设计——飞机大战笔记(解决输入混合密码账户,结局自动记录数据)

////////////////////2015/07/23/////////////////// ////////////////////by xbw/////////////////////////// ////////////////////环境 VS2013/////////////// 问题又解决了,解决了登陆只能用数字登陆的问题,还有自动记录数据的问题:: 这个只能用数字登陆是后来调试出来的bug,之前没想到,为了调试方便,只用了账号为1,密码为1来测试的,现在才发现问题,,,其实只

Access数据库跨库查询及记录集区分

医疗设备软件一般都是单机软件,如果是Windows平台,常会选择Access数据库存储结构化数据,因为他轻量,便于部署.然而随着医疗信息化的发展,医生希望对多台单机设备的数据进行管理,采用网络数据库当然可以解决这个问题,但软件部署会变得比较麻烦,所以如果Access数据能支持跨库查询,那就完美了,可喜的是Access从2007版就已经支持该功能了,且查询速度还非常快. Access数据库跨库查询可使用"in 字句",语法如下,可参见微软帮助手册:https://support.offi

Winform操作Access数据库增删改操作学习笔记

此程序是本人学习Winform操作Access数据库时学习笔记. 程序源码来源于:<Visual C# 2008 程序开发入门与提高 >赵增敏 编著 操作方法: 1.新建一个Winform项目,并将该项目设置为启动项目: 2.复制数据库文件到程序根目录下. 3.添加3个Label.两个TextBox.一个ListBox,四个Button控件. 4.窗体底部Label修改名称为“labelMsg”,两个文本框修改名称为:textboxSurname,textboxName. 5.列表框命名为Li

windows程序设计笔记

2014.05.06 新建一个visual C++ -- 常规 -- 空白 的项目,用.c后缀名指定这是一个用C语言来写的windows项目.和C语言的hellworld程序做了一个比较,按照windows程序设计规定的入口函数名称.函数参数.参数传递方式等写个入口函数,并弹出一个MessageBox. windows程序设计笔记,布布扣,bubuko.com

Cocos2d-x飞机大战教程笔记

咳咳~跟着大神的教程学做Cocos2d-x的飞机大战...鉴于我是那种跟着教程都会出非常多错的人,所以还是一路跟着做些笔记比較好.并且因为是用课余时间,所以仅仅能断断续续地做,写下来也好让自己别忘记~ 2014/4/22  Day01 从apk解压获取素材.再用TexturePacker拼接成plist和png. 话说TexturePacker是收费的啊...7天免费,还能够申请1年的使用期. 之前看书还看到有个神器叫zwoptex,貌似是免费的.可惜仅仅有Mac版...╮(╯_╰)╭Howev

【.Net】Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库

参考资料: WindowsIdentity.Impersonate https://msdn.microsoft.com/zh-cn/library/w070t6ka(v=vs.110).aspx Acess数据库读取 https://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbdatareader(v=vs.80).aspx 代码实现: using System; using System.Runtime.InteropSer