//
#include "stdafx.h"
#include "iostream"
#include "string"
#include "vector"
//步骤1:添加对ADO的支持
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
using namespace std
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL) //初始化COM环境
_ConnectionPtr pMyConnect(__uuidof(Connection))//定义连接对象并实例化对象
_RecordsetPtr pRst(__uuidof(Recordset))//定义记录集对象并实例化对象
try
{
//步骤2:创建数据源连接
/*打开数据库“SQLServer”,这里需要根据自己PC的数据库的情况 */
pMyConnect->Open("Provider=SQLOLEDB Server=.Database=AIS2 uid=sa pwd=","","",adModeUnknown)
}
catch (_com_error &e)
{
cout<<"Initiate failed!"<<endl
cout<<e.Description()<<endl
cout<<e.HelpFile()<<endl
return 0
}
cout<<"Connect succeed!"<<endl
//步骤3:对数据源中的数据库/表进行 *** 作
try
{
pRst = pMyConnect->Execute("select * from gendat",NULL,adCmdText)//执行SQL: select * from gendat
if(!pRst->BOF)
{
pRst->MoveFirst()
}
else
{
cout<<"Data is empty!"<<endl
return 0
}
vector<_bstr_t> column_name
/*存储表的所有列名,显示表的列名*/
for(int i=0 i< pRst->Fields->GetCount()i++)
{
cout<<pRst->Fields->GetItem(_variant_t((long)i))->Name<<" "
column_name.push_back(pRst->Fields->GetItem(_variant_t((long)i))->Name)
}
cout<<endl
/*对表进行遍历访问,显示表中每一行的内容*/
while(!pRst->adoEOF)
{
vector<_bstr_t>::iterator iter=column_name.begin()
for(iteriter!=column_name.end()iter++)
{
if(pRst->GetCollect(*iter).vt !=VT_NULL)
{
cout<<(_bstr_t)pRst->GetCollect(*iter)<<" "
}
else
{
cout<<"NULL"<<endl
}
}
pRst->MoveNext()
cout<<endl
}
}
catch(_com_error &e)
{
cout<<e.Description()<<endl
cout<<e.HelpFile()<<endl
return 0
}
//步骤4:关闭数据源
/*关闭数据库并释放指针*/
try
{
pRst->Close() //关闭记录集
pMyConnect->Close()//关闭数据库
pRst.Release()//释放记录集对象指针
pMyConnect.Release()//释放连接对象指针
}
catch(_com_error &e)
{
cout<<e.Description()<<endl
cout<<e.HelpFile()<<endl
return 0
}
CoUninitialize() //释放COM环境
return 0
}
(1).在文件stdafx.h中最后一个#endif的前一行写入#import
"C:\program
files\common
files\System\ado\msado15.dll"
no_namespace
\
rename("EOF","EndOfFile")
\
rename("LockTypeEnum","newLockTypeEnum")
\
rename("DataTypeEnum","newDataTypeEnum")
\
rename("FieldAttributeEnum","newFieldAttributeEnum")
\
rename("EditModeEnum","newEditModeEnum")
\
rename("RecordStatusEnum","newRecordStatusEnum")
\
rename("ParameterDirectionEnum","newParameterDirectionEnum")
如果你的系统不是安装在C盘的话就把#import
后面的C改成系统所有的盘
--------------------------------------------------------------------------
(2).在C***App类的public:下加入
_RecordsetPtr
m_pADOSet
bool
ADOExecute(_RecordsetPtr
&ADOSet,
_variant_t
&strSQL)
在private:下加入
private:
_ConnectionPtr
ADOConn
--------------------------------------------------------------------------
在class
C***App
:
public
CWinApp
{
...
}之后#endif之前加入
extern
CxxxApp
theApp
--------------------------------------------------------------------------
(3)在BOOL
C***App::InitInstance()函数中Enable3dControls()
//
Call
this
when
linking
to
MFC
statically这一行下面加入
if(
FAILED(::CoInitialize(NULL))
)
{
AfxMessageBox("ADO
Init
failed")
return
false
}
try
{
ADOConn.CreateInstance(__uuidof(Connection))
ADOConn->Open("DSN=OBDC数据源Provider=MSDASQL","用户","密码",
adConnectUnspecified)//这一行要自已修改
}
catch(_com_error
&e)
{
CString
err
err.Format("%s",
(char*)(e.Description())
)
AfxMessageBox(err)
}
catch(...)
{
AfxMessageBox("Unknown
Error...")
}
m_pADOSet.CreateInstance(__uuidof(Recordset))
-------------------------------------------------------------------------
并在文件最后加上如下代码:
bool
CxxxApp::ADOExecute(_RecordsetPtr
&ADOSet,
_variant_t
&strSQL)
{
if
(
ADOSet->State
==
adStateOpen)
ADOSet->Close()
try
{
ADOSet->Open(strSQL,
ADOConn.GetInterfacePtr(),
adOpenStatic,
adLockOptimistic,
adCmdUnknown)
return
true
}
catch(_com_error
&e)
{
CString
err
err.Format("ADO
Error:
%s",(char*)e.Description())
AfxMessageBox(err)
return
false
}
}
------------------------------------------------------------------------
最后就可以在登录时执行SQL语句了,比如用户为CString
strUser,
密码是CString
strPwd数据库表是user_table(user_id,
user_name,
user_pwd)则
_variant_t
sqlQuery
sqlQuery
=
"select
*
from
user_table
where
user_name='"+strUser
+"'
and
user_pwd='"+
strPwd
+"'"
theApp.ADOExecute(theApp.m_pADOSet,
sqlQuery
)
int
iCount
=
theApp.m_pADOSet->GetRecordCount()
if
(
0==iCount
)
{
AfxMessageBox(_T("密码错误"),
MB_ICONEXCLAMATION)
return
}
else
{
AfxMessageBox(_T("登录成功"),
MB_ICONEXCLAMATION)
不知道能否帮到你,参考下把
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)