问一个关于用ADO打开数据库校验密码的问题:现有两个变量:m_username,m_password我想用ADO打开数据库,用连接指针,把m_username导入数据库,用SQL语言找出相同m_username的元组后找到其密码(这个密码是数据库既有的),并将其导出,然后与m_password比对,之后弹出对话框给出比对结果。我已经做了很多次实验,但由于经验不足,总是出现调试性错误,可能是数据库打开的问题,没有解决。希望各位大虾给予帮助,谢谢!!

解决方案 »

  1.   

    可以先创建一个结构,存放密码和用户名:typedef struct _tagUserInfo
    {
    char cName[18];
    int  iOperator;
    char cPassword[16];
    }USERINFO;
      

  2.   

    _CommandPtr pCmd;
    _RecordsetPtr pRec;
    pCmd.Create("ADODB.COMMAND");
    _bstr_t SQL="select password form user where username='";
    SQL=SQL + m_username + "'";
    pCmd->ActiveConnection=m_pCon;//m_pCon为ConnectionPtr对象
    pCmd->CommandText=SQL;
    pRec=pCmd->Excute(NULL, NULL,adCmdText);
    if(pRec->adoEOF)
      //没有该用户
    CStrign password = (char*)(_bstr_t)pRec->Fields->GetItem(_variant_t("password"));
    if(password == m_password)
     //密码正确
    //////////
    上面随手写的,,
    大概这样子,不保证能编译
      

  3.   

    pCmd.Create("ADODB.COMMAND");应该是
    pCmd.CreateInstance(pCmd.CreateInstance);
    可能还有很多错误
    自己慢慢调吧。。
      

  4.   

    很感谢楼上这位高手,给我的解答,我把你的代码改了一小下,现在还有3 errors:error C2664: 'long __thiscall _com_ptr_t<class _com_IIID<struct _Command,&struct __s_GUID _GUID_b08400bd_f9d1_4d02_b856_71d5dba123e9> >::CreateInstance(const struct _GUID &,struct IUnknown *,unsigned long)' : cannot convert parameter 1 from 'long (const char *,struct IUnknown *,unsigned long)' to 'const struct _GUID &'Context does not allow for disambiguation of overloaded functionerror C2039: 'Excute' : is not a member of '_Command'
       e:\testfrm(4月26日)\debug\msado15.tlh(2086) : see declaration of '_Command'error C2440: 'type cast' : cannot convert from 'class _com_ptr_t<class      _com_IIID<struct Field,&struct __s_GUID _GUID_00000569_0000_0010_8000_00aa006d2ea4> >' to 'class _bstr_t'
            No constructor could take the source type, or constructor overload resolution was ambiguous改后的程序如下:
             _CommandPtr     pCmd;
    _RecordsetPtr   pRec;
    _ConnectionPtr  pCon;
                      CString password;
    //pCmd.Create("ADODB.COMMAND");
    pCmd.CreateInstance(pCmd.CreateInstance);
    _bstr_t SQL="select password form user where username='";
    SQL=SQL + m_userid + "'";
    pCmd->ActiveConnection=pCon;//pCon为ConnectionPtr对象
    pCmd->CommandText=SQL;
    pRec=pCmd->Excute(NULL, NULL,adCmdText);
    if(pRec->adoEOF)
    AfxMessageBox("没有该用户");//没有该用户
    password = (char*)(_bstr_t)pRec->Fields->GetItem   (_variant_t("password"));
    if(password == m_userpwd)
    AfxMessageBox("密码正确");//密码正确
    else
    AfxMessageBox("密码错误");//密码错误麻烦再帮我看一下,谢谢!!
      

  5.   

    pRec=pCmd->Excute(NULL, NULL,adCmdText);改为:(少写一个e)pCmd->Execute(SQL,NULL,adCndText);
    password = (char*)(_bstr_t)pRec->Fields->GetItem   (_variant_t("password"));
    改为:COleVariant value =pRec->GetFields()->GetItem("password")->GetValue();
    后把COleVariant转为:CString;
    我没有编译过,看看能不能帮到你。
      

  6.   

    谢谢!!我针对你说的修改了:
                      CString password;
    //pCmd.Create("ADODB.COMMAND");
    pCmd.CreateInstance(pCmd.CreateInstance);
    _bstr_t SQL="select password form user where username='";
    SQL=SQL + m_userid + "'";
    pCmd->ActiveConnection=pCon;//pCon为ConnectionPtr对象
    pCmd->CommandText=SQL;
    pRec=pCmd->Execute(SQL,NULL,adCmdText);
    if(pRec->adoEOF)
    AfxMessageBox("没有该用户");//没有该用户
    COleVariant value =pRec->GetFields()->GetItem("PASSWORD")->GetValue();
    if(password == m_userpwd)
    AfxMessageBox("密码正确");//密码正确
    else
    AfxMessageBox("密码错误");//密码错误现在only have 2 errors:)error C2664: 'long __thiscall _com_ptr_t<class _com_IIID<struct _Command,&struct __s_GUID _GUID_b08400bd_f9d1_4d02_b856_71d5dba123e9> >::CreateInstance(const struct _GUID &,struct IUnknown *,unsigned l
    ong)' : cannot convert parameter 1 from 'long (const char *,struct IUnknown *,unsigned long)' to 'const struct _GUID &'
            Context does not allow for disambiguation of overloaded functionerror C2664: 'Execute' : cannot convert parameter 1 from 'class _bstr_t' to 'struct tagVARIANT *'
            No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    Error executing cl.exe.
      

  7.   

    pCmd.CreateInstance(pCmd.CreateInstance);
    什么意思啊。。看来我真的误导你了,,
    写错了,笔误
    应该这样写
    pCmd.CreateInstance("ADODB.COMMAND");
    。。
    sorry
      

  8.   

    pRec=pCmd->Execute(SQL,NULL,adCmdText);改为
    pRec = pCmd->Excute(NULL, NULL, adCmdText);
    因为前面已经设了
    PCmd->CommandText = SQL;了
    所以Excute的第一个参数写NULL 就可以了
      

  9.   

    我已经按你说的改了,语法错误全解决了,谢谢!!但弹出密码校验的对话框后我输入正确的用户名和密码确定后,弹出对话矿上面写着:Runtime Error!Program:E:\my work\bluesea\Debug\bluesea.exeThis application has requested the Runtime to terminate it in an unusal way.
    Please contact the application's support term for more information.然后回车后,程序就崩溃了??
    怎么回事??麻烦你了,楼上的高手们,谢谢!!
      

  10.   

    我在调试的过程中,在pCmd->ActiveConnection=pCon;//pCon为ConnectionPtr对象这一行出了问题:Unhandled exception in bluesea.exe(KERNEL32.DLL):0xE06D7363:Microsoft C++ exception.
      

  11.   


    http://www.csdn.net/Develop/read_article.asp?id=27206
      

  12.   

    我晕,有没有连接数据库啊?
    在stdafx.h文件里加入:
    #import "C:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
    定义3个对象:
    _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset;
    _CommandPtr m_pCommand;
    初始化函数中加入代码:
    try
    {
             //创建数据库连接实例
    hr=m_pConnection.CreateInstance("ADODB.Connection");
             if(SUCCEEDED(hr))
    {
    strConnect="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=directory";//directory是你的数据库所在目录,记得"\"要变成"\\".如c:\\mm.mdb
                       m_pConnection->ConnectionTimeout=5;//设置连接超时为5秒
    //打开数据库连接
    hr=m_pConnection->Open(strConnect,"","",adModeUnknown); }
    }
    catch(_com_error &e)
    {
    ::MessageBox(NULL,e.Description(),"警告",MB_OK|MB_ICONWARNING);
    }
    在你的处理函数中加入:
    _ParameterPtr param;
    try
    {
    m_pCommand.CreateInstance(__uuidof(Command));//创建新的实例
             m_pRecordset.CreateInstance("ADODB.Recordset")//创建记录集
    m_pCommand->ActiveConnection=m_pConnection;//指定连接对象
    m_pCommand->CommandText="select * from table where username=vName";//"table"是你的表的名称
              Param=m_pCommand->CreateParameter("vName",adBSTR,adParamInput,8,_bstr_t(m_username));//8是你的username字段的最大字符数,根据你的情况修改
    m_pCommand->Parameters->Append(Param);
    m_pRecordset=m_pCommand->Execute(NULL,NULL,adCmdText);//执行SQL语句 if(m_pRecordset->adoEOF)
             {
                    AfxMessageBox("没有该用户");//没有该用户
                    return;
             }
    CString pw=(char *)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("username"))->Value);//username是你的字段名
             
             if(pw==m_password)AfxMessageBox("密码正确");
    else AfxMessageBox("密码错误");
    }
    catch(_com_error &e)
    {
    ::MessageBox(NULL,e.Description(),"警告",MB_OK|MB_ICONWARNING);
    }
             
      

  13.   

    你真的应该去看看ADO入门的书,
    这样子边问边学效率太低了,
    自己认真的学过之后再来问收获后大些:)/////////////////
    http://www.csdn.net/develop/Read_Article.asp?id=25875http://www.csdn.net/develop/Read_Article.asp?id=25897http://www.csdn.net/develop/Read_Article.asp?id=25898http://www.csdn.net/develop/Read_Article.asp?id=25899
      

  14.   

    我正好在做密码校验,调试通过的,你试着改改吧:
    //取得输入的值
    UpdateData(TRUE);
    //得到被选中的用户名
    int nCount = m_ComboboxOperator.GetCurSel();
    m_ComboboxOperator.GetLBText(nCount,m_strName);
    //得到密码
    m_strPassword = m_strPass;
    //得到查询条件
    CString strOpen = "select * from OperatorInfo where strName = '" + m_strName + "'";
    _variant_t vOpen = _bstr_t(strOpen);
    //获得View类指针
    CMainFrame *pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd;
    CSMCView *pView = (CSMCView*)pMain->GetActiveView();
    //关闭打开的记录集
    pView->m_pRecordset->Close();
    //打开系统操作员信息表
    pView->m_pRecordset->Open(vOpen,pView->m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    //读取密码
    _variant_t vPassword = pView->m_pRecordset->GetCollect("strPassword");
    if (vPassword.vt == VT_NULL)
    {
    m_strPassword = "";
    }
    else
    {
    m_strPassword = (LPCSTR)_bstr_t(vPassword);
    }
    //判断操作员输入的密码与数据库中保存的密码是否相同
    if (m_strPassword==m_strPass)
    {
    //相同则进入系统
    OnOK();
    }
      

  15.   

    给大家看看我的解决方案:
        _variant_t var;
        CString sqlbuf;
        sqlbuf.Format("SELECT * FROM USER_TABLE  where USER_NAME='%s'",m_userid); m_RecordSet.CreateInstance(__uuidof(Recordset));

    try
    {
         m_RecordSet->Open(sqlbuf.AllocSysString(),        
    theApp.m_pConnection.GetInterfacePtr(),
    adOpenDynamic,
    adLockOptimistic,
    adCmdText);
    }
    catch(_com_error *e)
    {
    AfxMessageBox(e->ErrorMessage());
    }

    try
    {
     if(m_RecordSet->adoEOF)
     {
     AfxMessageBox("此用户名不存在!");
     
     }
    else
    {
    var = m_RecordSet->GetCollect("PASSWORD");
    CString Password = (LPCSTR)_bstr_t(var); if(Password ==m_userpwd)
    {
        AfxMessageBox("密码正确!");
    //CDialog::OnOK();
    }
    else

    AfxMessageBox("密码错误!");
    OnCancel();
    }
    }
     }
    catch(_com_error *e)
    {
    AfxMessageBox(e->ErrorMessage());
    }谢谢大家对我的帮助,尤其是过儿:)