VC编写ADO连接Access,SQL Server数据库入门实例
原创
©著作权归作者所有:来自51CTO博客作者power_harbour的原创作品,请联系作者获取转载授权,否则将追究法律责任
为了在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的数据绑定扩展.
例子代码如下:
//数据库连接例子
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("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
上一篇:VC线程入门实例
下一篇:Struts Menu开发向导
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章