1、什么是ADO
Microsoft ActiveX 数据对象(ADO)允许客户端应用程序通过 OLE DB 提供程序访问和处理来自各种源的数据。 它的主要优点是易于使用、高速、低内存开销和较小的磁盘空间。 ADO 支持用于生成客户端/服务器和基于 Web 的应用程序的关键功能。
2、ADO基础知识
ADO为开发人员提供了一个功能强大的逻辑对象模型,可通过OLE DB 系统接口一编程的方式访问、编辑和更新各种数据源中的数据。ADO最常见的用法是查询关系数据库中的一个或多个表,检索并显示应用程序中的结果,并可能让用户进行更改并保存对数据所做的更改。
大多数使用ADO的应用程序都主要涉及四个操作:获取数据、检查数据、编辑数据、更新数据。
3、如何在C/C++中引用ADO
最新版本的ADO打包为msado15.dll。默认情况下,将在
i
n
s
t
a
l
l
D
i
r
中
安
装
这
些
苦
,
其
中
installDir中安装这些苦,其中
installDir中安装这些苦,其中installDir表示计算机上安装了ADO的库,必须在应用程序项目中显示的引用它们。
若要在 Visual C++ 应用程序中使用最新版本的 ADO,请#import使用以下指令:
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile") //重命名EOF以免与其他命名空间冲突
//或者
#import"C:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF") //重命名EOF以免与其他命名空间冲突
/*
刚刚引入的时候,可能会报错。
无法打开源文件 xxx\debug\masdo15.tls
直接生成,会自动生成相应的文件
*/
ADO的基本使用
int main()
{
//COM组件必须先初始化
HRESULT hr = CoInitialize(NULL);
assert(SUCCEEDED(hr));
//ADO的三个基本对象
_ConnectionPtr pConn; //连接对象
_CommandPtr pCmd;//命令对象
_RecordsetPtr pRec;//记录集对象
//实例化对象
pConn.CreateInstance(__uuidof(Connection));
pCmd.CreateInstance(__uuidof(Command));
pRec.CreateInstance(__uuidof(Recordset));
//使用连接对象,连接到数据
//获取配置文件路径
CString strPath;
//得到当前模块的路径
GetModuleFileName(NULL, strPath.GetBuffer(MAX_PATH), MAX_PATH);
strPath.ReleaseBuffer();
strPath = strPath.Left(strPath.ReverseFind('\\'));
strPath.Format(TEXT("File Name=%s\\sql.udl"), strPath);
//xx.udl(Universal Data Link)是通用数据连接文件,使用通用数据链接 (UDL) 文件来保存连接字符串。sql.udl保存了连接数据库的信息,自行百度 xx.udl的使用
try
{
pConn->ConnectionString = _bstr_t(strPath);
//与下面这条语句等效。修改为自己需要操作的数据的信息。Data Source=192.168.1.4可指定端口
//Data Source=192.168.1.4:1433
//pConn->ConnectionString ="Provider=SQLOLEDB.1;Password=xxxx;Persist Security Info=True;User ID=sa;Initial Catalog=QPAccountsDB;Data Source=192.168.1.4";
//建立连接。
pConn->Open("", "", "", adConnectUnspecified);
CString strSql = "update AccountsInfo set NickName='测试10011' where UserID = 1";
_variant_t RefreshNum;
//执行SQL语句,若果没有返回值,可用这个,否则需要用到_RecordsetPtr pRec
pConn->Execute(_bstr_t(strSql), &RefreshNum, adCmdText);
printf("影响行数: %d\n", RefreshNum.lVal);
}
catch (_com_error e)
{
printf("连接数据库错误:%s\n", (char *)(e.Description()));
}
//执行select 或 存储过程 操作
try
{
//判断其连接状态
if (pConn != NULL || pConn->GetState() != adStateClosed)
{
CString strSql = "select top 100 * from AccountsInfo";
pRec->Open(_bstr_t(strSql), pConn.GetInterfacePtr(), adOpenKeyset, adLockOptimistic, adCmdText);
//下面这两条语句是执行存储过程GSP_CU_QueryUserInfo(10)
//GSP_CU_QueryUserInfo 是存储过程名称,10是存储过程的需要的参数
//CString strSql = "GSP_CU_QueryUserInfo(10)";
//pRec->Open(_bstr_t(strSql), pConn.GetInterfacePtr(), adOpenKeyset, adLockOptimistic, adCmdStoredProc);
//执行带参数的SQL存储过程
//创建参数对象
//_ParameterPtr Parameter = pCmd->CreateParameter("@UserID", adInteger, adParamInput, sizeof(WORD), 11);
//pCmd->Parameters->Append(Parameter);//把新建的参数对象添加到命令对象
//pCmd->ActiveConnection = pConn; //这是命令对象关联的连接对象
//pCmd->CommandText = "GSP_CU_QueryUserInfo";//存储过程名字
//pCmd->CommandTimeout = 10;//超市时间
//pCmd->CommandType = adCmdStoredProc;//命令类型是存储过程
//pRec->Open((IDispatch *)pCmd, vtMissing, adOpenKeyset, adLockOptimistic, adCmdStoredProc);
}
else
{
printf("连接数据库错误!\n");
}
}
catch (_com_error e)
{
printf("连接数据库错误:%s\n", (char *)(e.Description()));
}
//读取记录集里面的数据
pRec->MoveFirst(); //移动到记录集的开始位置
while (!pRec->EndOfFile) //判断是否到达尾部
{
//不管读取什么类型的数据都可用_variant_t val = GetCollect("Name");
//再转换成相应的数据类型即可
_variant_t UserID = pRec->GetCollect("UserID"); //数值
_variant_t str = pRec->GetCollect("NickName");//字符串
_variant_t date = pRec->GetCollect("LastLogonDate");//时间格式
printf("UserID:%03d Name:%s date:\n", UserID.lVal,(char *)_bstr_t(str),(char *)_bstr_t(date));
pRec->MoveNext(); //移动到下一条,否则会造成死循环
}
//释放掉对象
pConn.Release();
pCmd.Release();
pRec.Release();
return 0;
}