SOS DAO access 数据库不同表的访问!!!

xpwang 2000-12-11 12:05:00
各位大虾:
问个很莱的问题,但对我很重要,望各位帮帮忙!!!
我用MFC的CDAOXXXXX 类打开了一个有密码的Access数据库文件,在RFX中映射了一张表的结构(程序操作数据),同时对记录的操作也正常,我现在想对用户登陆数据表进行操作当启动程序是要求输入密码,进行校对,看用户身份是否合法,我该怎么做?????
(我是过从新生成一个类建立与用户登陆数据表建立映射但因为是同一个数据库所以还没进行操作程序就死了)!!!
...全文
157 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
happylaodu 2000-12-15
太对不住了,上次话说一半就跑了
因为在m_strFilter里面加了用户合法性的判断,如果用户输入的用户名、密码不符,则在表中根本找不到这样的记录,也就是说记录集为空;如果输入正确,则(理论上讲)记录集中只有一条记录,这个我们不用理会。
也就是说Open()以后,加一个判断就行了:
………
db.Open();
if(db.IsBOF()) //如果为空,则IsEOF和IsBOF都会返会TRUE
{
AfxMessageBox("对不起,密码不符!");
m_passwordEdit.SetFocus();
m_passwordEdit.SetSel(0,-1);//不关闭登录对话框,让他再输
}
else
{ // 关闭登录对话框,进入程序其它部分。
…………
}

其实这样实现没有什么不好的,反正我觉得挺省力的,我有两个程序就是这样实现的。
回复
happylaodu 2000-12-14
不好意思,两天没能上网!想不到还能赶上回答这个问题。
RedFire的说法是对的,你的FindFirst、FindNext用的都不对。
事实上FindFirst、FindNext的参数相当于SQL语句中的WHERE子句,你想一下,SQL会知道m_UserName是什么东西吗?
可以这样写:
CString filter;
filter.Format("用户名 = %s,密码 = %s",dLogon.m_Username,Logon.m_Password); //我假定这两个变量都是CString类的,如果不是,比如说是int,可改为%d。
db.FindFirst(filter);

事实上你完全可以用Open就解决问题,而不用在这儿Find来Find去。
db.m_strFilter=filter;//filter的定义和赋值同上。
db.Open();//一切使用默认的参数。

//看一下该类的GetDefaultSQL()函数,它应该是这个样子——如果不是可以在ClassWizard/Member Variables中Update Colums以选取数源和表。
CString CLogin::GetDefaultSQL()
{
return _T("[用户管理]");
}
正因为有了它,你才不必再在Open的时候关心要打开哪个表。
回复
vcmfc 2000-12-14
这样的前提是你必须有一张用户表,里面包括用户信息,这样可以设置更高级的功能,我开始以为你是要让用户输入密码,然后用这个密码去找开表,我知道Access允许建立一个操作用户表,如果你使用Access这个功能的话,先出现输入密码框,再取得密码后,用这个用户与密码去找开.mdb,在程序中使用try...catch(CDaoException *e),如果打开失败的话,会产生错误的,否则用自已的用户表的话,楼上几位的意见是不错的。
回复
xpwang 2000-12-14
感谢大家的帮助(大家都有分的,不够还可以加的),我这两天因为要忙着买新机器所以还没调程序。
如果大家还有什么看法请尽快RE;
Re happylaodu:
谢谢你,不好意思我还想再问下,如果用Open函数我怎么知道到底用户的输入正确一否呢,MSDN里面说Open 函数没有返回值啊!!!
Re vcmfc:
我的意思是,我本来有一个数据库,这个库里面有好几张表,其中一张表(用户管理)装的是管理人员的信息(包括姓名,密码,等级等),我现在是想在我的程序启动是要求输入用户名和密码,然后我在数据库里的‘用户管理’表中查询是否有相应记录,及其密码等级等等,但我用向导生成程序时并没有将‘用户管理’表进行映射,我自建了一个类(专门影射处理‘用户管理’表),如happylaodu说的那样进行了相应的变量影射等操作,但后来在检测用户和密码时出现了开始说的问题。
当然我觉得自己这样进行不是最好的,很想找更好的办法,如使用SQL等等,希望大家能就此发表高见!!!

回复
xpwang 2000-12-13
大家有什么见解赶快行动哈
我是铁了心要给分的哈
只要是Dao方面的编程技巧都可以的!!!
回复
RedFire 2000-12-12
Faint!我觉得你要拼字符串。
if(db.FindFirst("用户名=m_Username")!=0)

|
|
V

if(db.FindFirst("用户名=" + m_Username)!= 0)
回复
happylaodu 2000-12-11
最简单的方法就是延用原来的类,只是把其中的";PWD=****"去掉,只是这样,每次执行Open()函数时,都会要求输入密码的,不可取。
多加个用户数据表是最科学的方法了,要注意的是,你要指定它的Database是哪一个.
假设你原先的记录集类指针是m_pFirstSet,而这个用户数据记录集类指针是m_pUserSet,
则最好要有下面这句话:
m_pUserSet->m_pDatabase=m_pFirstSet->m_pDatabase;
回复
vcmfc 2000-12-11
不要使用ClassWizard,手工来处理会方便些。
回复
xpwang 2000-12-11
Re VCMFC:
能不能更具体点;
Re happylaodu:
(多加个用户数据表是最科学的方法了)本来我就有一个专门用来装已经注册用户的表了,不过谢谢你给我的提示。

我现在已经能打开这个表,但我想用 CDaoRecoreset::FindXXX()来检测用户的密码和名字是否和表中一致是,却出错了,(The Microsoft database Jet engine does not recognize "m_Username" as a valid field name or expression)
下面是我的部分代码:
void CPMISLogon::OnOK()//用户输入完毕后检测
{
bool flag=true;
UpdateData(true);
CLogin db;//CLogin的基类是 CDaorecordset
db.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM 用户管理");
//if(db.FindFirst("用户名=Logon.m_Username,密码=Logon.m_Password")!=0)我不知道这样对不对
if(db.FindFirst("用户名=m_Username")!=0)
{ while(!db.IsEOF() && flag)
{
if(db.FindNext("用户名=m_Username")==0)
{
flag=false;
CDialog::OnOK();
}
}
}

}

void CPMISLogon::OnCancel()


怎样给大家加分啊,我加分时说我的有无效的参数!!!
回复
相关推荐
发帖
数据库
创建于2007-09-28

3953

社区成员

VC/MFC 数据库
申请成为版主
帖子事件
创建了帖子
2000-12-11 12:05
社区公告
暂无公告