ADO 在C/C++中的基本使用

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中安装这些苦,其中 installDirinstallDir表示计算机上安装了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;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值