MFC SQL2005登录模块的设计

t_758303596 2011-04-28 03:31:56
这个问题本来已经前天就问了,可是一直没有正确的答案,又没有多少人来答,估计是积分太少了,那个账户上面没有积分了,现在再加分。




在之前已经连接上了数据库
CString sql; //声明字符串
sql.Format( _T("select * from denglu where 姓名='%s'and 密码='%s' ") ,c_user,c_password); //设置字符串
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,
adLockOptimistic,adCmdText); //打开记录集

if(m_pRs->RecordCount>0) //用户名和密码正确时
{
Flag1=true; //设置登录
user = m_pRs->GetCollect("姓名").bstrVal; //获得用户名和密码
password = m_pRs->GetCollect("密码").bstrVal;
EndDialog(0);
}
else //用户名和密码不正确
{
user = ""; //将用户名和密码置空
password = "";
MessageBox(_T("用户名或密码错误"),_T("登录信息"),64); //弹出错误信息
return;
}
...全文
316 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
King_hhuang 2011-04-29
  • 打赏
  • 举报
回复
怎么会出现这些错误呢?

你的c_user,c_password是关联的窗体上的Edit控件吗,是CString类型的吗?

另外你
sql.Format( _T("select * from denglu where 姓名='%s'and 密码='%s' ") ,c_user,c_password); //设置字符串

之前有UpdateData();//刷新控件的值到对应的变量
黑泡泡选手 2011-04-29
  • 打赏
  • 举报
回复
你安装一个VA吧···m_pRS里面没有RecordCount这个方法!c_user没有定义···
t_758303596 2011-04-29
  • 打赏
  • 举报
回复
用上面的方法捕捉错误信息
CString sql; //声明字符串
sql.Format( _T("select * from denglu where 姓名='%s'and 密码='%s' ") ,c_user,c_password); //设置字符串
//加上异常捕获,获取异常信息
try
{
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText); //打开记录集
}
catch(_com_error& e)
{
e.Description();
}


有些参数的值出现错误,
m_pRs.RecordCount CXX0017: 错误: 没有找到符号“RecordCount”
c_user CXX0017: 错误: 没有找到符号“c_user”
((*(IUnknown*)(&(*(IDispatch*)(&(*(_ADO*)(&(*(Recordset15*)(&(*(Recordset20*)(&(*(Recordset21*)(&*((m_pRs).m_pInterface)))))))))))))).__vfptr CXX0030: 错误: 无法计算表达式的值

最后一个是m_pRs参数中的值,


King_hhuang 2011-04-29
  • 打赏
  • 举报
回复
把你修改后的代码贴一下
你自己先单步调试一下,看看在那个地方运行不正常
另外捕捉到的具体错误信息是什么
t_758303596 2011-04-29
  • 打赏
  • 举报
回复
本来按登录按钮应该进入主界面的
t_758303596 2011-04-29
  • 打赏
  • 举报
回复
不好意思啊,这几天课太多了,所以上网的时间有点少,
用上面的方法出现一个新的问题
就是按登录按钮时,他没有任何反应
King_hhuang 2011-04-29
  • 打赏
  • 举报
回复
不是别人不积极,是你自己的问题

别人给了你建议,你就应该马上去试,然后反馈调试的结果,这样别人才好知道你具体的错误
不是发给帖子在这儿就行了

你之前发的帖子我都有回复,不过是我上午回复,你下午来看帖,我跟着回复,你又到晚上或者第二天早上看帖……

你怎么不把原帖地址贴出来,好让大家更快定位问题
http://topic.csdn.net/u/20110426/21/11768ae7-9973-42aa-9bfa-053ea072e0c7.html
zyq5945 2011-04-29
  • 打赏
  • 举报
回复
所有的ADO代码都像这样加异常捕获你就清楚是什么错误了.
try
{
//你的ADO代码
}
catch (_com_error& e)
{
AfxMessageBox(e.Description());
}

zxhx 2011-04-29
  • 打赏
  • 举报
回复
修改一下代码:

CString sql; //声明字符串
sql.Format( _T("select * from denglu where 姓名='%s'and 密码='%s' ") ,c_user,c_password); //设置字符串
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,
adLockOptimistic,adCmdText); //打开记录集

->
//_RecordsetPtr m_pRs;//假定你是这么定义的
m_pRs.CreateInstance(__uuidof(Recordset)); //不知道你创建了这个实例没?
CString sql; //声明字符串
sql.Format( _T("select * from denglu where 姓名='%s'and 密码='%s' ") ,c_user,c_password); //设置字符串
//加上异常捕获,获取异常信息
try
{
m_pRs->Open((_variant_t)sql,theApp.m_pCon.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText); //打开记录集
}
catch(_com_error& e)
{
e.Description();
}
t_758303596 2011-04-29
  • 打赏
  • 举报
回复
问题解决了,我从数据库的初始化、连接开始调试了一遍,才发现自己不小心将连接数据库的那部分函数注释了,唉,自己太粗心了,浪费了两三天的时间,谢谢各位大哥了。
King_hhuang 2011-04-29
  • 打赏
  • 举报
回复
ADO访问数据库的基本步骤:

(1)、引入ADO类 ,加到stdafx.h中#endif // _AFX_NO_AFXCMN_SUPPORT后面

#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename ("EOF", "adoEOF")

(2)、初始化COM (放在对话框初始化函数里面或者CXXXApp::InitInstance()中)

在MFC中可以用AfxOleInit();非MFC环境中用:
CoInitialize(NULL);
CoUnInitialize();

(3)、包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr

(4)、连接数据库
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
m_pConnection->ConnectionTimeout = 0;
hr = m_pConnection->Open( "Provider=SQLOLEDB.1;Password=密码;Persist Security Info=True;User ID=用户名;Initial Catalog=数据库名;Data Source=127.0.0.1(本机)", "", "", adConnectUnspecified);

m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->CommandTimeout = 5;
m_pCommand->ActiveConnection = m_pConnection;
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s,%s",e.ErrorMessage(),e.Description());
AfxMessageBox(errormessage);///显示错误信息
}

(5)、打开记录集
首先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));

// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误
try
{
m_pRecordset->Open("SELECT * FROM DemoTable",// 查询DemoTable表中所有字段
m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}

……

照着检查一下,看看你是不是每一步都做了,并且成功了
King_hhuang 2011-04-29
  • 打赏
  • 举报
回复
你的数据库连接成功了没有啊
把你连接数据库那段也贴出来吧,看看你的m_pCon有没问题
King_hhuang 2011-04-29
  • 打赏
  • 举报
回复
我电脑上没有VS2010

t_758303596 2011-04-29
  • 打赏
  • 举报
回复
程序太大了,压缩后有35MB,传不上去
t_758303596 2011-04-29
  • 打赏
  • 举报
回复
我用VS2010编的,要不我加你qq吧
King_hhuang 2011-04-29
  • 打赏
  • 举报
回复
你现在编译有没有错误?

你把程序上传到CSDN上看看
t_758303596 2011-04-29
  • 打赏
  • 举报
回复
c_user,c_password是又定义了的
与控件关联的也有两个变量m_password,m_user,
sql.Format之前有两个函数
m_user.GetWindowText(c_user);
m_password.GetWindowText(c_password);
Oliver2891 2011-04-28
  • 打赏
  • 举报
回复
一般在m_pRs->Open之前先判断它的状态,if (m_pRs->State),如果是真的话就先m_pRs->Close()了它,然后再打开新的SQL语句。
t_758303596 2011-04-28
  • 打赏
  • 举报
回复
什么原因,前面在o_758303596的账户中有四十分,要是解决了,那里面的四十分也给了
t_758303596 2011-04-28
  • 打赏
  • 举报
回复
问题是,执行完
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,
adLockOptimistic,adCmdText); //打开记录集

就跳到mlock.c文件的
void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection( _locktable[locknum].lock );}


出现如下错误
图书借阅管理.exe 中的 0x75679617 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0027e838 处的 _com_error。
加载更多回复(1)

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧