VC连接数据库的基本步骤如下: 1、增加支持头文件,引用支持组件 在stdafx.h的所有include后面加入如下代码 #include <icrsint.h>
#include <basetsd.h>
#include <ole2.h>
#import 'c:\program files\common files\system\ado\msado15.dll' no_namespace rename('EOF','adoEOF') 注意引用的动态库路径,它跟安装access时选的路径有关,不一定全是上面这个。 2、初始化组件 有两种方式:一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示: AfxOleInit(); 在使用组件指针之前初始化,也可以在App::InitInstance()中写入AfxOleInit(); 3、实例指针
_ConnectionPtr m_pConnection('ADODB.Connection');
_RecordsetPtr m_pRecordset('ADODB.Recordset');
1)、_ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句 2)、_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。 3)、CommandPtr智能指针,可以使用_ConnectionPtr或_RecordsetPtr来执行任务,定义输出参数,执行存储过程或SQL语句。 也可以使用CreateInstance()来初始化:
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = 'SELECT * FROM DemoTable'; // SQL语句
m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText); // 执行SQL语句,返回记录集 ——执行存储过程。执行存储过程的操作和上面执行SQL语句类似,不同点仅是CommandText参数中不再是SQL语句,而是存储过程的名字,如Demo。另一个不同点就是在Execute()中参数由adCmdText(执行SQL语句),改为adCmdStoredProc来执行存储过程。如果存储过程中存在输入、输出参数的话,需要使用到另一个智能指针_ParameterPtr来逐次设置要输入、输出的参数信息 4、打开数据库
在ADO操作中建议语句中要常用try...catch()来捕获错误信息
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb','','',adModeUnknown);
//如果数据库有密码,则为:m_pConnection->Open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=JyDB.mdb;Jet OLEDB:Database Password = jy_agt&pwd','','',adModeUnknown);注:密码处OLEDB:Database的冒号前后皆不能有空格,不然会连接失败
}
catch(_com_error e)
{
AfxMessageBox('数据库连接失败,确认数据库Demo.mdb是否在当前路径下!');
return FALSE;
}
5、打开数据表及操作表中数据
try
{
m_pRecordset->Open('SELECT * FROM DemoTable', // 查询DemoTable表中所有字段
theApp.m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
} - 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
获取数据库中的值: _variant_t var;
CString testValue = '';
try
{
if(!m_pRecordSet->BOF)
{
m_pRecordSet.MoveFirst();
}
else
{
AfxMessageBox('表内数据为空.');
}
//获取第一行ParamType列的数据
var = m_pRecordSet.GetCollect('ParamType')
if(var.vt != VT_NULL)
{
testValue = (LPCSTR)_bstr_t(var);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
6、关闭连接
关闭一个库连接。如果连接状态有效,则用Close方法关闭它并赋于它空值。代码如下所示: if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL; //或者用 m_pConnection.Release()也行,但注意不是-> 7、其他
|