注:以下内容转自朋友的BLOG,原文地址为 http://blog.sina.com.cn/s/blog_50391e000100d15h.html
前段时间一直在学习ADO对象连接SQL SERVER,在网上查找资料时发现,网上大部分相关的文章都是MFC下的连接数据库,对于像我们这样的新手来说MFC本来就不好掌握,因此写这篇在控制台下用C++使用ADO对象连接数据库的博文希望对广大新手有所帮助。小弟我也是菜鸟一个,如果有写的不对的地方请大家多多包涵。
(1).将ado对象所要用到的动态链接库加入工程可以使用 #impotr命令
#import "C:/Program Files/Common Files/System/ado/msado15.dll"
(2).创建ado的几个重要对象指针
_ConnectionPtr con; 主要负责数据库的连接
_RecordsetPtr rec; 主要负责对记录集的操作
_CommandPtr com; 主要用来保存SQL语句,使用该对象里保存的SQL语句对数据库进行操作
(3).在声明完这三个对象指针后,就要为他们实例化,可以调用各个对象的实例化函数CreateInstance()
con.CreateInstance(__uuidof(Connection));
com.CreateInstance(__uuidof(Command));
rec.CreateInstance(__uuidof(Recordset));
(4).使用con对象连接数据库
con带有Open函数用以连接数据库
Open()有四个参数分别是 :
ConnectionString 属性,包含用于建立连接数据源的信息。
UserID, 数据库用户名
Password, 密码
Options 决定该方法是在连接建立之后(异步)还是连接建立之前(同步)返回
(5).打开数据集(其实就是打开某个表)
rec对象的Open函数用以打开表
Open()函数有五个参数分别是:
Source, 可以是SQL 语句、表名、存储过程调用或持久 Recordset 文件名
ActiveConnection, 有效 Connection 对象变量名;
CursorType, 确定提供者打开 Recordset 时应该使用的游标类型
LockType, 确定提供者打开 Recordset 时应该使用的锁定(并发)类型
Options 长整型值,用于指示提供者如何计算 Source 参数
如果想知道参数的更具体内容请参看ADO手册。
(6).用sql语句对记录集进行操作
利用com->ActiveConnection=con;将com对象和已经和数据库建立连接的con相关联。
com->CommandText成员可以用来保存SQL语句,例如:com->CommandText="select * from color"
使用com->Execute(NULL,NULL,adCmdText);将保存在com对象中的sql语句用于相应的表。
(7).利用RecordsetPtr对象对记录集进行一些操作
MoveFirst();读取第一条记录
MoveNext();读取下一条记录
AddNew(); 增加新表项
Update(); 更新表
Delete(); 删除
利用rec->Fields->GetItem("cname")->Value访问数据
Fields是Recordset对象的容器,GetItem方法返回Field对象,Value是Field对象的属性,也可以用GetValue方法
(8).关闭连接
调用Close()关闭连接函数
调用CoUninitialize()注销COM环境
关于一些数据类型
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
wchar_t实际上被定义为unsigned short类型,也就是无符号短整型。
具体代码如下:
#include <iostream>
#include <string.h>
using namespace std;
#undef EOF
#import "C:/Program Files/Common Files/System/ado/msado15.dll"
using namespace ADODB;
int main()
{
try
{
_ConnectionPtr con;_RecordsetPtr rec;
_CommandPtr com;
CoInitialize(NULL); //初始化COM环境
con.CreateInstance(__uuidof(Connection)); //实体化三大对象
com.CreateInstance(__uuidof(Command));
rec.CreateInstance(__uuidof(Recordset));
con->ConnectionString="provider=sqloledb; server=localhost; database=soupcty";
con->Open(con->ConnectionString, "sa", "1234", -1);//连接数据库
rec->Open("color", _variant_t((IDispatch*)con),adOpenDynamic,adLockOptimistic, adCmdTable);//打开表
com->ActiveConnection=con;
com->CommandText="insert into color values (11,'green','yes')";
com->Execute(NULL,NULL,adCmdText);
rec->MoveFirst(); //读取第一条记录
while (rec->EOF == VARIANT_FALSE) //检查是否到达文件尾
{char buf[1024];
int id;id =rec->Fields->GetItem ("cid")->Value.intVal;
cout << id << '/t';
wchar_t *cname;name = rec->Fields->GetItem("cname")->Value.bstrVal;
WideCharToMultiByte(CP_ACP, 0, cname, -1, buf, 1024, NULL, NULL);//将读取的数据放入自定义缓存,方便输出
cout << buf << '/t';
wchar_t *basecolor;
basecolor =rec->Fields->GetItem("basecolor")->Value.bstrVal;
WideCharToMultiByte(CP_ACP, 0, basecolor, -1, buf, 1024, NULL, NULL);
cout << buf << '/n';
rec->MoveNext(); //读取下一条记录
}
//增加新数据
rec->AddNew();
rec->PutCollect("cid",2l);
rec->PutCollect("cname", (_variant_t)("white"));
rec->PutCollect("basecolor", _variant_t("no"));
rec->Update();//修改数据
rec->MoveFirst();
rec->PutCollect("cname",(_variant_t)("blue"));
rec->Update();//删除数据
rec->MoveFirst();
rec->Move(2);
rec->Delete(adAffectCurrent);
rec->Update();
rec->Close(); //关闭打开的记录集con->Close(); //关闭和数据库的连接
CoUninitialize(); //注销COM环境return 0;
}
catch(_com_error &e)
{
cout << e.ErrorMessage() << endl;
return 1;
}
}
更多详情请参考ADO手册