首先,在stdax中添加: #import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace rename("EOF","adoEOF")
TEXT,old INTEGER,birthday DATETIME)",&RecordsAffected,adCmdText);
VALUES (1, 'Washington',25,'1970/1/1')",&RecordsAffected,adCmdText);
_variant_t vID;
_variant_t vOld;
_variant_t vBirthday;
vUsername = m_pRecordset->GetCollect("username");///取得第一个字段的值放入vCount变量
vID = m_pRecordset->GetCollect("ID");
vOld = m_pRecordset->GetCollect("Old");
vBirthday = m_pRecordset->GetCollect("birthday");
//注意GetCollect()中的值也可以是列索引
wsprintf(result,"id:%d,姓名:%s,年龄:%d,生日:%s\r\n",vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday);
MessageBox(hwnd,result,TEXT("test"),MB_OK);
m_pRecordset->MoveNext();///移到下一条记录
no_namespace rename("EOF","adoEOF")
然后,初始化COM库,在程序的初始化代码中添加CoInitialize(NULL); 如果是在
MFC环境中也可以用AfxOleInit();函数
第三步,创建Connection连接
HRESULT hr;
try
{
//创建Connection对象
hr = m_pConnection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
try
{
//创建Connection对象
hr = m_pConnection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
//连接到数据库
hr = m_pConnection->Open("Data Source=labname;UID=sa;PWD=maxiao0419;","","",adModeUnknown);//连接数据库
}
}
catch (_com_error* e)//捕捉异常
{
//打印e.ErrorMessage();
}
hr = m_pConnection->Open("Data Source=labname;UID=sa;PWD=maxiao0419;","","",adModeUnknown);//连接数据库
}
}
catch (_com_error* e)//捕捉异常
{
//打印e.ErrorMessage();
}
//注意:连接到数据中的字符串要根据实际需求来填写,连接不同的数据库需要不同的字符串,
而且连接方法也多种多样(例如可以连接到数据源,也可以不通过数据源),这里我连接到的是一个
名为labname的access数据库,这一部分可以Google
Open函数原型
HRESULT Connection :: Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options);
其中Option代表许可权
adModeUnknown:缺省。当前的许可权未设置
adModeRead:只读
adModeWrite:只写
adModeReadWrite:可以读写
adModeShareDenyRead:阻止其它Connection对象以读权限打开连接
adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接
adModeShareExclusive:阻止其它Connection对象以读写权限打开连接
adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接
这里再给出一些常见的连接字符串:
(1)通过JET数据库引擎对ACCESS2000数据库的连接:
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\\test.mdb","","",adModeUnknown);
(2)通过DSN数据源对任何支持ODBC的数据库进行连接:
m_pConnection->Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnknown);
(3)不通过DSN对SQL SERVER数据库进行连接:
m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;
UID=sa;PWD=139","","",adModeUnknown);
第四步,执行SQL命令获得结果集:
有三种常见方法:
(1) 直接利用上面得到的Connection对象调用Execute()方法
Execute方法原型
_RecordsetPtr Connection :: Execute(_bstr_t CommandText,VARIANT *RecordsAffected,long Options)
参数介绍:
CommandText:一般是SQL语句
RecordAffected:是所影响的行数
Options表示CommandText中的内容类型:
adCmdText:表明CommandText为文本命令(最常用)
adCmdTable:表明为表名
adCmdProc:表名为存储过程
adCmdUnknown:表名内容未知
例如在数据库中创建一个名为users的表
_variant_t RecordsAffected;
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username \
TEXT,old INTEGER,birthday DATETIME)",&RecordsAffected,adCmdText);
向表users中插入一条记录
///往表格里面添加记录
m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) \
VALUES (1, 'Washington',25,'1970/1/1')",&RecordsAffected,adCmdText);
获取表中每个字段的值
TCHAR result[256];
_variant_t vUsername;
_variant_t vID;
_variant_t vOld;
_variant_t vBirthday;
while(!m_pRecordset->adoEOF)//判断是否到达表末尾
{
vUsername = m_pRecordset->GetCollect("username");///取得第一个字段的值放入vCount变量
vID = m_pRecordset->GetCollect("ID");
vOld = m_pRecordset->GetCollect("Old");
vBirthday = m_pRecordset->GetCollect("birthday");
//注意GetCollect()中的值也可以是列索引
wsprintf(result,"id:%d,姓名:%s,年龄:%d,生日:%s\r\n",vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday);
MessageBox(hwnd,result,TEXT("test"),MB_OK);
m_pRecordset->MoveNext();///移到下一条记录
}
//这三个变量是定式,记住就行
_variant_t vNULL;
vNULL.vt = VT_ERROR;
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
m_pCommand->ActiveConnection = m_pConnection;//将连接赋值给Command对象
m_pCommand->CommandText = "select * from users";//sql语句
_RecordsetPtr m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
要注意的就是字符串和整形在从_variant_t类型转化时的方法
_variant_t--->字符串 要使用前缀 (LPCTSTR)(_bstr_t)
_variant_t--->整形 直接调用
_variant_t
的成员lVal
(2)第二种方法是利用Command对象来执行SQL命令
_CommandPtr m_pCommand;
m_pCommand.CreateInstance("ADODB.Command");
//这三个变量是定式,记住就行
_variant_t vNULL;
vNULL.vt = VT_ERROR;
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
m_pCommand->ActiveConnection = m_pConnection;//将连接赋值给Command对象
m_pCommand->CommandText = "select * from users";//sql语句
_RecordsetPtr m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
(3)第三种方法是直接用Recordset对对象进行查询获取结果集
这时直接定义Recordset对象调用Open()方法然后将Connection对象和SQL
语句传入就行
Open()原型
HRESULT Recordset::Open(const _variant_t &Source,const _variant_t & ActiveConnection,
enum CursorTypeEnum CursorType,enum LockTypeEnum LockType,long Options);
参数介绍 SQL语句
参数二是连接对象指针
参数CursorType是光标类型:
取值范围:
enum CursorTypeEnum
{adOpenUnspecified = -1,///不作特别指定adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark, RecordCount,AbsolutePosition,AbsolutePage都不能使用adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。};
参数LockType表示数据库锁类型
取值范围:
enum LockTypeEnum
{adLockUnspecified = -1,///未指定adLockReadOnly = 1,///只读记录集adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。};
模板:
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");m_pRecordset->Open("SELECT * FROM users",_variant_t((IDispatch *)m_pConnection,true),adOpenUnspecified,adLockUnspecified ,adCmdText);
其他,记录的更新遍历:
1.例如要删除第一条记录
(1)首先移动到第一条记录处
m_pRecordset->MoveFirst();
(2)调用Delete函数进行删除
m_pRecordset->Delete(adAffectCurrent);
2.采用非Sql语句方法添加记录
for(int i=0;i<3;i++){m_pRecordset->AddNew();///添加新记录,m_pRecordset->PutCollect("ID",_variant_t((long)(i+10)));m_pRecordset->PutCollect("username",_variant_t("叶利钦"));m_pRecordset->PutCollect("old",_variant_t((long)71));m_pRecordset->PutCollect("birthday",_variant_t("1930-3-15"));
}
3.更新某条记录
(1) 移动到某条记录的
m_pRecordset->Move(3,_variant_t((long)adBookmarkFirst));///移动到第三条记录
adBookmarkFirst表示相对于第一条记录
3表示相对于第一条记录向下三个位置
计算方法: 位置 = 相对位置(这里是3) + 起始位置(这里是
adBookmarkFirst=1
) = 4
(2)将这条记录的old字段修改为45
m_pRecordset->PutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
m_pRecordset->Update();///保存到库中
最后,当你操作完完毕之后一定要记住关闭数据库
m_pRecordset->Close();//关闭记录集
m_pConnection->Close();//关闭连接