为了在
VC
中使用
Ado,
需要在头文件中加入以下几行代码
:
#import "C:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF", "adoEOF")
#include "adoid.h"
#include "icrsint.h"
第一行的
#import
语句告诉编译器把此指令中的
DLL
文件引入到程序中
,
并从库中抽取其中的对象的类信息
,
并产生两个头文件包含在工程中
.
其中的
no_namespace
用来对
DLL
的名称域进行隔离
,
最后的
rename,
把
ADO
中的
EOF
重新命名
,
避免和其他地方的定义的
EOF
产生冲突
.
第三行引入的头文件定义啦
ADO2.0
的类和接口标识
第四行引入了
ADO2.0
的数据绑定扩展
.
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
例子代码如下
:
//
数据库连接例子
AfxOleInit();//
初始化
_ConnectionPtr m_pConnection;
//_ConnectionPtr
对象用来实现和数据源的连接
HRESULT hr = CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(Connection));
//_bstr_t ConnectionString = "DSN=Test;UID=sa;PWD=;";//DSN---Access
//_bstr_t ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Test.mdb";//NON_DSN---Access
_bstr_t ConnectionString = "Provider=MSDASQL;DRIVER={SQL SERVER};SERVER=BILLGATES;DATABASE=NORTHWIND;UID=;PWD=;";//NON_DSN---SQL SERVER
_bstr_t userName = "";
_bstr_t password = "";
_RecordsetPtr pRecordSet;
_bstr_t bstrQuery("SELECT * FROM data");
_variant_t vNull;
vNull.vt = VT_ERROR;
vNull.scode = DISP_E_PARAMNOTFOUND;
try
{
m_pConnection->Open(ConnectionString,"","",adModeUnknown);
hr = pRecordSet.CreateInstance(__uuidof(Recordset));
if(SUCCEEDED(hr))
{
pRecordSet->PutRefActiveConnection(m_pConnection);
hr = pRecordSet->Open(_variant_t(bstrQuery),vNull,adOpenForwardOnly,adLockOptimistic,adCmdText);
AfxMessageBox("
连接数据库成功
!");
if(!pRecordSet->adoEOF)
{
_variant_t name = pRecordSet->GetCollect("name");//
获得指定列的数据
CString strName = (char*)_bstr_t(name);//
转换数据类型
AfxMessageBox(strName);
COleSafeArray vaFieldlist;//
数据表字段名
vaFieldlist.CreateOneDim(VT_VARIANT,3);
long lArrayIndex[1];
lArrayIndex[0] = 0;
vaFieldlist.PutElement(lArrayIndex, &(_variant_t("name")));
lArrayIndex[0] = 1;
vaFieldlist.PutElement(lArrayIndex, &(_variant_t("age")));
lArrayIndex[0] = 2;
vaFieldlist.PutElement(lArrayIndex, &(_variant_t("address")));
COleSafeArray vaValuelist;//
数据部字段值
vaValuelist.CreateOneDim(VT_VARIANT,3);
lArrayIndex[0] = 0;
vaValuelist.PutElement(lArrayIndex, &(_variant_t("liuy")));
lArrayIndex[0] = 1;
vaValuelist.PutElement(lArrayIndex, &(_variant_t("23")));
lArrayIndex[0] = 2;
vaValuelist.PutElement(lArrayIndex, &(_variant_t("<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />beijing")));
for(int i = 0; i< 2; i++)
{
pRecordSet->AddNew(vaFieldlist,vaValuelist);//
添加一行记录
}
AfxMessageBox("
添加数据成功
");
}
}
}
catch(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
TRACE("Exception thrown for classes generated by #import");
TRACE("\tCode=%O81x\n",e.Error);
TRACE("\tCode meaning = %s\n",e.ErrorMessage);
TRACE("\tSource = %s\n",(LPCTSTR)bstrSource);
TRACE("\tDescription = %s\n",(LPCTSTR)bstrDescription);
AfxMessageBox(e.ErrorMessage());
}
_ConnectionPtr
的
Open()
数的意义
:
ConnectionString:
包含连接信息的字符串
UID:
访问数据库的用户名
PSWD:
访问数据库的口令
Option:
可选参数
_RecordsetPtr
的
Open()
函数
:
HRESULT Open(const _variant_t& source, const _variant_t& conneciton, enum CursorTypeEnum curdorType, enum LockTypeEnum lockType, long options)
Source
参数是一个变体类型
,
她可以是一个
Command
的对象
,
一
SQL
对象
,
一个表名或一个存储过程
,
甚至是一个
URL,
一个文件名
,
一个流对象
.
Conneciton
也是一个变体类型
,
他可以是一个
connection
对象
,
也可以是一个指明连接目标的字符串
.
cursorType
指明了数据集游标的类型
.
她可以是以下几个值
:adOpenDynamic,adOpenForwardOnly,adOpenKeyset,adOpenStatic,adOpenUnspecified.
lockType
参数可以是下列值之一
:adLockBachOptiomistic,adlockOptimistic,adLockPessimistic,adLockReadOnly,adLockUnspecified.
Options:
参数指明了第一个参数
source
的类型
,
其值可以是
adCmdUnspecified,adCmdText,
adCmdTable,adCmdStoreProc,adCmdUnknow,adCmdFile,adCmdTableDirect
转载于:https://blog.51cto.com/orajc/99310