190 likes | 354 Views
VC 使用 ADO 编写登录组件. 1. 使用 ATL COM AppWizard ,创建 ATL 工程,服务器类型为 DLL ,工程名为 Login 2. 创建一个 ATL 对象,名为 UserI ,并为此对象添加一个方法,名为 Check ,函数名称和参数如下: CUserI::Check(BSTR *User, BSTR *Password, BSTR *pbstrRe) 3. 在 stdafx.h 头文件中添加引入 ADO 库文件的代码:
E N D
VC使用ADO编写登录组件 • 1.使用ATL COM AppWizard,创建ATL工程,服务器类型为DLL,工程名为Login • 2. 创建一个ATL对象,名为UserI,并为此对象添加一个方法,名为Check,函数名称和参数如下: CUserI::Check(BSTR *User, BSTR *Password, BSTR *pbstrRe) • 3. 在stdafx.h头文件中添加引入ADO库文件的代码: #import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF","EndofFile")
4.在Login.cpp的DLLMAIN函数的开始处添加 HRESULT hRes=CoInitialize(NULL); _ASSERTE(SUCCEEDED(hRes)); • 5.在Login.cpp的DLLMAIN函数的结束处添加 CoUninitialize(); • 6.编写Check函数代码: 调用SQL Server数据库 HRESULT hr=S_OK; _RecordsetPtr pRs; _ConnectionPtr pConn; FieldsPtr pFields; FieldPtr pField; *pbstrRe=NULL;
try { //建立与数据源uuidof_info的连接,如果出错,引发异常处理 pConn.CreateInstance(_uuidof(Connection)); //连接数据库 pConn->Open("DSN=Sqldata","","",NULL); TCHAR szBuffer[512]; _variant_t vRecCount; char * name = _com_util::ConvertBSTRToString(*User); SysFreeString(*User); char * password = _com_util::ConvertBSTRToString(*Password); SysFreeString(*Password); wsprintf(szBuffer,_T("select * from name where name='%s' and password='%s'"),name,password);
_bstr_t bstrSQL=szBuffer; pRs=pConn->Execute(bstrSQL,&vRecCount,-1); //如果没有记录,说明此帐号不存在 if(vRecCount.lVal==0) { CComBSTR bstr("Failed"); *pbstrRe=bstr.Detach(); delete(name); delete(password); } //输出验证信息
else { CComBSTR bstr("Succeed"); *pbstrRe=bstr.Detach(); delete(name); delete(password); } } catch(_com_error *e) { const TCHAR * Error=e->ErrorMessage(); } pRs=NULL; pConn=NULL; return S_OK;
调用Access数据库 HRESULT hr=S_OK; _RecordsetPtr pRs; _ConnectionPtr pConn; FieldsPtr pFields; FieldPtr pField; *pbstrRe=NULL; try { //建立与数据源uuidof_info的连接,如果出错,引发异常处理 pConn.CreateInstance(_uuidof(Connection)); pRs.CreateInstance(_uuidof(Recordset)); //连接数据库 pConn->ConnectionString="DSN=logindata"; pConn->Open("","","",0);
TCHAR szBuffer[512]; _variant_t vRecCount; char * name = _com_util::ConvertBSTRToString(*User); SysFreeString(*User); char * password = _com_util::ConvertBSTRToString(*Password); SysFreeString(*Password); wsprintf(szBuffer,_T("select * from login where name='%s' and password='%s'"),name,password); _bstr_t bstrSQL=szBuffer; pRs->Open(bstrSQL,(IDispatch*)pConn,adOpenDynamic,adLockOptimistic,adCmdText);
//如果没有记录,说明此帐号不存在 if(pRs->EndofFile) { CComBSTR bstr("Failed"); *pbstrRe=bstr.Detach(); delete(name); delete(password); } //输出验证信息 else { CComBSTR bstr("Succeed"); *pbstrRe=bstr.Detach(); delete(name); delete(password); } }
catch(_com_error *e) { const TCHAR * Error=e->ErrorMessage(); } pRs=NULL; pConn=NULL; return S_OK;
服务器组件 • 服务器组件编写成功,编译服务器,生成login.dll组件
数据库连接 • 以上和数据库连接的程序都使用的是ODBC,要先在ODBC中建立系统DNS才可以运行 • 也可以使用ADO字符串,使用ADO字符串的方法如下页:
数据库连接 • 数据库连接有两种方法:1、使用ODBC。2、使用ADO字符串 • 1、使用ODBC连接SQL Server如下: pConn.CreateInstance(_uuidof(Connection)); pConn->Open("DSN=Sqldata","","",NULL); 使用ADO字符串连接SQL Server如下: pConn->Open("Provider=SQLOLEDB.1;Password=0224;Persist Security Info=True;User ID=sa;Initial Catalog=mis;Data Source=LZW","","",adModeUnknown); 或者pConn->Open("Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog=mis;Data Source=LZW","sa","0224",adModeUnknown);
数据库连接 • 2、使用ODBC连接Access如下: pConn->ConnectionString="DSN=logindata"; pConn->Open("","","",0); 使用ADO字符串连接Access如下: pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=f:/vccom/db2.mdb;Persist Security Info=False","","",adModeUnknown); 其中f:/vccom/db2.mdb是此数据库的路径
客户端实现(ADO组件调用) • 此客户端实现同没有使用数据库时,创建的Hello World程序步骤相同,只是调用函数的实现不一样,调用函数的程序如下:
UpdateData(TRUE); try { IUserIPtr pGreet("Login.UserI.1"); BSTR User; BSTR Password; if((m_user=="")||(m_password=="")) { MessageBox("用户名或者密码错误",NULL,MB_OK); } else { User=_com_util::ConvertStringToBSTR(CTestadoDlg::m_user);
Password=_com_util::ConvertStringToBSTR(m_password); BSTR Valided; Valided=pGreet->Check(&User,&Password); _bstr_t valid(Valided); if(valid.length()==7) { MessageBox("用户登录成功",NULL,MB_OK); } else { MessageBox("用户名或者密码错误",NULL,MB_OK); } } }
catch(_com_error&ex) { MessageBox(ex.ErrorMessage()); } UpdateData(FALSE);
m_user和m_password变量 • 在对话框中先添加两个Edit,然后在Edit1上单击鼠标右键,选择“建立类向导”,再选择“Member Variables”页,为这两个Edit添加变量,变量添加如下: • IDC_EDIT1 CString m_user • IDC_EDIT2 CString m_password • 此后就可以通过这两个变量来控制EDIT的显示和取值