C++连接数据库的方式常用的有 DB-Lib、ODBC、OLEDB和ADO。本篇中将使用的是ADO方式。
ADO是一个微软提供的访问数据库中数据的编程接口,关于ADO网上的描述很多,本篇直接说明如何使用,其他相关的介绍大家可以自行参考官方文档
首先需要导入一个ADO的dll库,并添加一个数据库连接指针和查询结果集指针,在头文件ADOConn.h中添加如下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF") class ADOConn { public: //添加一个指向Connection对象的指针 _ConnectionPtr m_pConnection; //添加一个指向Recordset对象的指针 _RecordsetPtr m_pRecordset; public: ADOConn(); virtual ~ADOConn(); //初始化--连接数据库 void OnInitADOConn(); //执行查询 _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); //执行SQL语句 BOOL ExecuteSQL(_bstr_t bstrSQL); //断开数据库连接 void ExitConnect(); }; |
如上一个数据库的操作分别需要实现以上4个函数,即初始化连接、查询、执行以及断开连接。
①初始化–连接数据库
首先实现初始化函数,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void ADOConn::OnInitADOConn() { //初始化OLE/COM库环境 ::CoInitialize(NULL); try { //创建connection对象 m_pConnection.CreateInstance("ADODB.Connection"); //设置连接字符串 _bstr_t strConnect="Provider=SQLOLEDB.1;Initial Catalog=DBNAME(数据库名);Data Source=127.0.0.1"; //SERVER和UID,PWD的设置根据实际情况来设置 m_pConnection->Open(strConnect,"帐号","密码",adModeUnknown); } //捕捉异常 catch(_com_error e) { //显示错误信息 printf(e.Description()); } } |
这里的”Provider=SQLOLEDB.1;Initial Catalog=DBNAME(数据库名);Data Source=127.0.0.1″;用于初始化一个数据库连接信息,Provider为数据库类型代码。ADO连接不同的数据库时其Provider代码也是不同的。这里的SQLOLEDB表示SQLSERVER数据库。
帐号密码可在Open方法中输入,也可以在连接字符串中定义,如
添加Password=sa;User ID=sa;到strConnect中。
②执行查询
先看代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | _RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL) { try { //连接数据库,如果connection对象为空,则重新连接数据库 if(m_pConnection==NULL) OnInitADOConn(); //创建记录集对象 m_pRecordset.CreateInstance(__uuidof(Recordset)); //取得表中的记录 m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); } catch(_com_error e) { printf(e.Description()); } //返回记录集 return m_pRecordset; } |
传入的参数bstrSQL为一段SQL语句,通过调用Open方法,执行这段查询语句并将结果集地址赋给m_pRecordset指针。在后面的内容中将介绍如何对结果集指针m_pRecordset进行操作。
③执行SQL语句
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL) { _variant_t RecordsAffected; try { //是否已连接数据库 if(m_pConnection==NULL) OnInitADOConn(); m_pConnection->Execute(bstrSQL,NULL,adCmdText); return true; } catch(_com_error e) { printf(e.Description()); return false; } } |
这里的bstrSQL同样是一个SQL语句,调用此方法时,程序将执行bstrSQL的内容,并返回一个bool型结果。
其中Execute里的第一个参数CommandText是命令字符串,通常是SQL命令
第二个参数RecordsAffected是操作完成后所影响的行数,可选
第三个参数Options表示CommandText的类型,adCmdText-文本命令,adCmdTable-表名,adCmdProc-存储过程,adCmdUnknown-未知
④断开数据库连接
1 2 3 4 5 6 7 8 9 | void ADOConn::ExitConnect() { //关闭记录集和连接 if(m_pRecordset!=NULL) m_pRecordset->Close(); m_pConnection->Close(); //释放环境 ::CoUninitialize(); } |
(以上部分代码来自网络)
这里对ADO的基本功能进行了一个封装,ADOConn包点击这里下载ADOConn.rar
接下来将特别注意一下GetRecordSet方法返回的查询结果集,该函数的返回值为一个_RecordsetPtr指针,对其操作例如:
1 2 3 4 5 6 | string sql = "select * from 表";//数据库查询语句 rs = GetRecordSet(_bstr_t(sql.c_str()));//_RecordsetPtr结果集 int a = rs->GetCollect("字段a");//获取字段a的值 int b = rs->GetCollect("字段b");//获取字段b的值 ...... |
初始化及执行SQL语句直接使用即可,记住当连接完成并执行完语句后,应当调用ExitConnect方法关闭当前SQL连接,当然,若固定数量的客户端访问数据库,可不关闭该连接,因打开和关闭连接时所消化的系统资源将会大于固定数量长连接所占有的系统资源。
以上即为一个C++使用ADO方法连接SQLSERVER数据库的最简Demo,部分代码来自网络。
本篇到此,欢迎大家交流指正。谢谢关注。
BeiTown
2013.06.04