运用Visual Studio 设计单机版数据库应用系统.docx
- 文档编号:17908181
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:21
- 大小:210.44KB
运用Visual Studio 设计单机版数据库应用系统.docx
《运用Visual Studio 设计单机版数据库应用系统.docx》由会员分享,可在线阅读,更多相关《运用Visual Studio 设计单机版数据库应用系统.docx(21页珍藏版)》请在冰点文库上搜索。
运用VisualStudio设计单机版数据库应用系统
运用VisualStudio2008设计单机版数据库应用系统
一、设计数据库
1、对项目进行需求分析
功能需求和数据库需求
2、数据流图
3、E-R图
4、关系模式
5、创建数据库
6、创建表
创建用户表
CreateTableUser(UserIDcounter(1,1),UserNameVarchar(20),PasswordVarchar(20))
7、插入数据
向表中插入一条记录
InsertintoUser(UserName,Password)Values('Admin','123456')
二、搭建程序框架
通过创建一个有主窗口的应用程序,在主窗口中使用菜单。
1、创建一个Win32空项目。
2、将项目属性设置为可以使用MFC。
3、在项目中添加头文件StdAfx.h,内容为:
#pragmaonce
#include
#include"resource.h"
4、为项目添加资源脚本文件
在“解决方案资源管理器”窗口中鼠标右键点击“资源文件”,在快捷菜单中选择“添加”-》“新建项”,在打开的“添加新项”对话框中选择“资源文件(.rc)”,在文件名称文本中输入资源文件名,然后点击“添加”按钮,生成资源脚本文件和资源ID的头文件“resource.h”。
5、新建应用程序类CDataApp
选择“项目”菜单-》“添加类”,在“添加类”对话框中选择“MFC类”,点击“添加”按钮,进入“MFC类向导”,在类名文本框中输入CDataApp,基类选择CwinApp,向导建议生成“DataApp.h”的头文件和“DataApp.cpp”的程序文件,点击“完成”按钮完成类CDataApp类的创建。
在“DataApp.h”头文件文件中将构造函数和析构函数的protected访问属性改变为public。
并在类定义的外部使用该类定义一个变量:
CDataAppmApp;
6、新建一个框架窗口类CMainFrame,基类为CFrameWnd。
向导生成MainFrame.h和MainFrame.cpp两个文件。
将MainFrame.h文件中的构造函数和析构函数的protected访问属性改变为public。
7、DataApp.cpp的前部添加对MainFrame.h文件的包含语句:
#include"MainFrame.h"
在DataApp.cpp文件中对BOOLCDataApp:
:
InitInstance()函数添加创建框架窗口的代码:
CMainFrame*pMainFrame;
pMainFrame=newCMainFrame();
pMainFrame->Create(0,L"数据库应用系统设计");
this->m_pMainWnd=pMainFrame;
pMainFrame->ShowWindow(this->m_nCmdShow);
8、添加菜单资源。
默认的菜单资源ID为IDR_MENU1。
9、在CMainFrame中添加WM_CREATE消息处理函数:
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
在函数中添加应用菜单代码:
CMenu*m_Menu;
m_Menu=newCMenu();
m_Menu->LoadMenuW(IDR_MENU1);
this->SetMenu(m_Menu);
10、为菜单添加事件处理程序。
在菜单设计界面中选择某一菜单项,鼠标右键单击该项,从弹出的快捷菜单中选择“添加事件处理程序”,在弹出的“事件处理程序向导”中的“类列表”中选择“CMainFrame”类,左边的“消息类型”选择“COMMAND”(默认是该选择),向导会推荐一个处理函数名,如需要修改则可以修改函数名,不需要修改则直接点击“添加编辑”,则向导自动打开MainFrame.cpp文件中的相应事件处理函数。
给“退出”菜单添加事件处理程序,并加入以下代码:
AfxGetApp()->PostThreadMessageW(WM_QUIT,0,0);
三、使用ADO打开数据库
1、在stdAfx.h文件中插入:
#import"C:
\\ProgramFiles\\CommonFiles\\System\\ado\\msado15.dll"no_namespacerename("EOF","adoEOF")
即引用ADO动态链接库,使得在程序中可以使用ADOActiveX对象。
在DataApp.cpp文件的前部定义连接指针(全局变量)。
_ConnectionPtrm_pConnection;
2、在主应用程序(DataApp.cpp文件)的InitInstance()函数中添加:
:
:
CoInitialize(NULL);
try
{
HRESULThr;
hr=m_pConnection.CreateInstance(_T("ADODB.Connection"));
if(SUCCEEDED(hr))
{
/*hr=m_pConnection->Open(_T("Driver=SQLServer;Server=COMPUTER_FXP\\SQLEXPRESS;\
Database=ProjectChoice;UID=sa;PWD=123456"),
_T(""),_T(""),adModeUnknown);//连接SQLServer数据库*/
hr=m_pConnection->Open(_T("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=MyDatabase.mdb"),
_T(""),_T(""),adModeUnknown);//连接Access数据库,数据库文件在项目文件夹中
}
}
catch(_com_errort)
{
AfxMessageBox(t.Description());
returnfalse;
}
首先初始化COM库,然后创建一个ADO连接对象,如果对象实例创建成功再打开数据库。
3、在主应用程序类的ExitInstance()函数中添加:
if(m_pConnection)
m_pConnection->Close();
m_pConnection=NULL;
:
:
CoUninitialize();
结束应用程序时要关闭连接。
4、创建数据库
创建表:
createtable[User](useridcounter(1,1),UserNamechar(12),[Password]char(20))
四、添加对话框操作数据
1、添加登录对话框
①在资源视图中鼠标右击资源,选择“添加资源”,打开添加资源向导对话框:
选择“新建”按钮,系统打开一个默认对话框供设计。
将“取消”按钮的"caption"属性设为“退出”。
将"systemmenu"属性设为"false"。
将"caption"属性设为"用户登录"。
将其ID属性改为IDD_LOGIN。
②在对话框中添加两个静态文本控件,"caption"属性设为"用户名:
"和"密码:
",添加两个文本编辑控件,其ID值分别设为IDC_NAME和IDC_PASSWORD。
将密码文本框控件的"Password"属性设为"true"。
设计界面如下图。
③选择菜单“项目”-“添加类”,为该对话框添加类,类名设为"CLogin"。
④为两个文本编辑控件。
在对话框设计界面,鼠标右击文本编辑控件,在快捷菜单中选择“添加变量”,分别为IDC_NAME和IDC_PASSWORD两个控件添加值类型的CString类型m_Name和m_Password。
⑤为“确定”按钮添加“事件处理程序”。
在Login.h文件中添加:
BOOLchecked;
_RecordsetPtrm_pRecordset;
其中checked表示是否登录成功,pRecordset用来获取记录集内容。
在Login.cpp文件开始部分添加:
extern_ConnectionPtrm_pConnection;
为“确定”按钮添加处理程序代码:
voidCLogin:
:
OnBnClickedOk()
{
UpdateData();
if(m_Name.IsEmpty()||m_Password.IsEmpty())
{
MessageBox(_T("请输入完整信息登录系统!
"));
return;
}
_bstr_tsql=_T("select*from[User]whereUserName=\'")
+m_Name+_T("\'andPassword=\'")+m_Password+_T("\'");
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open(sql,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
if(m_pRecordset->adoEOF)
{
AfxMessageBox(_T("用户名和密码错误"));
m_Name="";
m_Password="";
UpdateData(false);
}
else
{
checked=true;
CDialog:
:
OnOK();
}
}
⑥为“退出”按钮添加事件处理程序:
voidCLogin:
:
OnBnClickedCancel()
{
checked=false;
if(MessageBox(_T("确认是否退出程序"),_T("系统提示"),MB_YESNO|MB_ICONQUESTION)!
=IDYES)
return;
CDialog:
:
OnCancel();
}
在主程序中应用登录对话框。
首先在DataApp.cpp的首部添加#include"Login.h",然后在InitInstance()函数的打开主框架窗口代码前添加:
CLoginm_LoginDlg;
m_LoginDlg.DoModal();
if(FALSE==m_LoginDlg.checked)
returnFALSE;
2、录入数据对话框
在主框架窗口中通过菜单打开添加用户对话框。
①为程序添加一个对话框,为其输入用户名和密码,其中密码输入两次。
三个编辑控件的ID值分别为IDC_ADDUSER,IDC_PASS1,IDC_PASS2。
并为该对话框添加类。
分别为三个编辑控件添加对应变量为m_Name,m_pass1,m_pass2,均为CString类型的值变量。
设计界面如下:
②首先为该类添加数据成员:
_RecordsetPtrm_pRecordset;
然后在AddUser.cpp文件的首部添加对外部变量的引用:
extern_ConnectionPtrm_pConnection;
③为“增加”按钮添加事件处理程序。
voidCAddUser:
:
OnBnClickedOk()
{
UpdateData();
//检查输入信息是否完整
if(m_Name.IsEmpty()||m_Pass1.IsEmpty()||m_Pass2.IsEmpty())
{
MessageBox(_T("请输入完整信息登录系统!
"));
return;
}
//检查两次输入的密码是否一致
if(m_Pass1!
=m_Pass2)
{
MessageBox(_T("两次输入的密码不一致"));
return;
}
//检查输入用户名是否已经使用
_bstr_tsql=_T("select*from[User]whereUserName=\'")
+m_Name+_T("\'");
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open(sql,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
if(!
m_pRecordset->adoEOF)
{
AfxMessageBox(_T("用户名已经存在"));
return;
}
m_pRecordset->Close();
sql=_T("insertinto[User]([UserName],[Password])values(\'")
+m_Name+_T("\',\'")+m_Pass1+_T("\')");
m_pConnection->Execute(sql,NULL,adCmdText);
AfxMessageBox(_T("用户添加成功"));
OnOK();
}
④为在主菜单中设置一个“增加用户”的项目。
并为它添加对应的处理。
在MainFrame.cpp文件中的首部添加对AddUser.h头文件的包含。
#include"AddUser.h"
在“增加用户”菜单响应部分加上代码:
voidCMainFrame:
:
OnAdduser()
{
CAddUserm_AddUser;
m_AddUser.DoModal();
}
3、查询数据
查询数据可以用ListControl控件显示数据表信息。
①新建一个对话框资源。
caption属性设置为“用户信息查询”,ID设置为IDD_QUERY。
删除“取消”按钮。
将“确定”按钮的caption属性改为“返回”。
向对话框添加ListControl控件,设置控件ID为IDC_USERLIST,设置其View属性为Report。
为该控件添加控件类别CListCtrl类型的变量m_List。
界面效果如下:
②为对话框添加相应类CQueryUser。
系统自动生成QueryUser.h和QueryUser.cpp文件。
③为该对话框类添加初始化对话框消息处理函数。
添加过程为:
首先选中对话框或者在类视图中选择对话框类,然后再属性页中鼠标点击“消息”,选择WM_INITDIALOG消息,为其添加消息处理函数。
添加代码:
m_List.SetExtendedStyle(m_List.GetExtendedStyle()|
LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_List.InsertColumn(0,_T("编号"),LVCFMT_CENTER,60);
m_List.InsertColumn(1,_T("用户名"),LVCFMT_LEFT,100);
m_List.InsertColumn(2,_T("密码"),LVCFMT_LEFT,100);
这些代码为m_List控件设置样式和添加三个列标题。
④在QueryUser.cpp文件文件的首部添加:
extern_ConnectionPtrm_pConnection;
这样对话框就可以引用主程序模块DataApp.cpp中的全局变量,该变量为数据库连接对象,所有的数据库操作都需要用到。
⑤为对话框类添加一个记录集成员:
_RecordsetPtrm_pRecordset;
该数据成员用于获取数据库中的数据。
并在第③步的初始化对话框事件代码中添加:
m_pRecordset.CreateInstance(__uuidof(Recordset));
创建记录集对象。
⑥为对话框类添加一个函数FreshList,用来将数据库中的用户表的信息显示到m_List控件中。
打开添加函数对话框,设置函数的类型为void,无参数,函数名为FreshList。
在函数中添加代码。
voidCQueryUser:
:
FreshList(void)
{
try
{
m_pRecordset->Open(_T("select*from[user]"),(IDispatch*)m_pConnection,
adOpenDynamic,adLockOptimistic,adCmdText);
intnItem;
m_List.DeleteAllItems();
while(!
m_pRecordset->adoEOF)
{
nItem=m_List.GetItemCount();
CStringstr;
str=(LPCTSTR)_bstr_t(m_pRecordset->GetCollect("UserID"));
m_List.InsertItem(nItem,str);
str=(LPCTSTR)_bstr_t(m_pRecordset->GetCollect("UserName"));
m_List.SetItemText(nItem,1,str);
str=(LPCTSTR)_bstr_t(m_pRecordset->GetCollect("Password"));
m_List.SetItemText(nItem,2,str);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
}
catch(_com_errore)
{
AfxMessageBox(_T("刷新失败"));
}
}
⑦在初始化对话框处理函数的尾部添加对FreshList函数的调用。
这样,在打开查询对话框是就能看到用户信息。
4、删除数据
删除数据只需要执行一条SQL语句,不需要单独建立对话框。
在查询对话框中添加一个删除按钮,当点击该按钮时可以删除在列表控件中选中的数据。
①对列表控件添加LVN_ITEMCHANGED事件处理程序,每当用户通过鼠标改变列表控件中的选择时都会引发此事件,在该事件处理程序中获取用户选中的用户信息的user_ID值(在QueryUser.h文件中为CQueryUser类定义一个字符串成员,用来存放选择的用户ID)。
CStringm_UserID;
②添加程序代码:
POSITIONpos=m_List.GetFirstSelectedItemPosition();
if(pos==NULL)
TRACE0("Noitemswereselected!
\n");
else
{
intnItem=m_List.GetNextSelectedItem(pos);
TCHARs[50];
m_List.GetItemText(nItem,0,s,50);
m_UserID=s;
}
③在查询对话框中添加命令按钮,并添加事件处理程序:
voidCQueryUser:
:
OnBnClickedButtonDel()
{
if(m_UserID=="")
{
MessageBox(L"请选择一个要删除的命题!
");
return;
}
if(MessageBox(L"确实要删除该命题吗?
",L"请确认",MB_YESNO)==IDYES)
{
CStringsql=L"deletefrom[User]whereUserID="+m_UserID;
m_pConnection->Execute(_bstr_t(sql),NULL,adCmdText);
FreshList();
m_UserID="";
return;
}
}
5、修改数据对话框
修改数据是对已有的数据进行改变,首先从数据库获取原有数据,将数据显示到对话框的相应控件中,然后将用户对控件中的数据进行修改,再将数据替换原来数据库中的数据。
①设计用户信息修改对话框。
为对话框添加对话框类CModify。
为三个编辑框控件分别添加值类型CString变量m_Name,m_Pass1,m_Pass2。
为CModify添加CString类型变量m_ID。
②在查询对话框中添加“修改选中项”按钮,在QueryUser.cpp中添加对Modify.h的包含,对“修改选中项”按钮添加事件处理程序。
添加以下代码:
if(m_UserID=="")
{
MessageBox(L"请选择一个要修改的命题!
");
return;
}
CModifym_Modify;
m_Modify.m_ID=m_UserID;
POSITIONpos=m_List.GetFirstSelectedItemPosition();
intnItem=m_List.GetNextSelectedItem(pos);
TCHARs[40];
m_List.GetItemText(nItem,1,s,40);
m_Modify.m_Name=s;
m_List.GetItemText(nItem,2,s,40);
m_Modify.m_Pass1=m_Modify.m_Pass2=s;
m_Modify.DoModal();
FreshList();
m_UserID="";
③为“用户信息修改”对话框的“保存修改”按钮添加事件处理程序,添加代码如下:
UpdateData();
//检查输入信息是否完整
if(m_Name.IsEmpty()||m_Pass1.IsEmpty()||m_Pass2.IsEmpty())
{
MessageBox(_T("请输入完整信息登录系统!
"));
return;
}
//检查两次输入的密码是否一致
if(m_Pass1!
=m_Pass2)
{
MessageBox(_T("两次输入的密码不一致"));
return;
}
//检查输入用户名是否已经使用
_bstr_tsql=_T("select*from[User]whereUserName=\'")
+m_Name+_T("\'");
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open(sql,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
if(!
m_pRecordset->adoEOF)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运用Visual Studio 设计单机版数据库应用系统 运用 Visual 设计 单机 数据库 应用 系统