问一个关于用ADO打开数据库校验密码的问题:现有两个变量:m_username,m_password我想用ADO打开数据库,用连接指针,把m_username导入数据库,用SQL语言找出相同m_username的元组后找到其密码(这个密码是数据库既有的),并将其导出,然后与m_password比对,之后弹出对话框给出比对结果。我已经做了很多次实验,但由于经验不足,总是出现调试性错误,可能是数据库打开的问题,没有解决。希望各位大虾给予帮助,谢谢!!
调试欢乐多
{
char cName[18];
int iOperator;
char cPassword[16];
}USERINFO;
_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)
//密码正确
//////////
上面随手写的,,
大概这样子,不保证能编译
pCmd.CreateInstance(pCmd.CreateInstance);
可能还有很多错误
自己慢慢调吧。。
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("密码错误");//密码错误麻烦再帮我看一下,谢谢!!
password = (char*)(_bstr_t)pRec->Fields->GetItem (_variant_t("password"));
改为:COleVariant value =pRec->GetFields()->GetItem("password")->GetValue();
后把COleVariant转为:CString;
我没有编译过,看看能不能帮到你。
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.
什么意思啊。。看来我真的误导你了,,
写错了,笔误
应该这样写
pCmd.CreateInstance("ADODB.COMMAND");
。。
sorry
pRec = pCmd->Excute(NULL, NULL, adCmdText);
因为前面已经设了
PCmd->CommandText = SQL;了
所以Excute的第一个参数写NULL 就可以了
Please contact the application's support term for more information.然后回车后,程序就崩溃了??
怎么回事??麻烦你了,楼上的高手们,谢谢!!
http://www.csdn.net/Develop/read_article.asp?id=27206
在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);
}
这样子边问边学效率太低了,
自己认真的学过之后再来问收获后大些:)/////////////////
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
//取得输入的值
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();
}
_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());
}谢谢大家对我的帮助,尤其是过儿:)