VC下利用ADO访问Access数据库(Use ADO)

作者:Wupei  |  发表时间:  |  所属分类:VC

VC下利用ADO直接访问Access数据库步骤不需要用户建立ODBC数据源)

1.包含相关动态链接库

//在StdAfx.h中,最后部分添加(注意:一定要在最后部分,否则会编译出错)
#import "c:&my;Program Files&my;Common Files&my;System&my;ado&my;msado15.dll" no_namespace rename("EOF","adoEOF")

2.连接的创建与初始化

//相关成员变量
_ConnectionPtr m_conn;
_RecordsetPtr m_res;

//成员函数块(一般写在CDocment类构造函数即可)
try
{
	CoInitialize(NULL);
	m_conn.CreateInstance(_uuidof(Connection));
	CString strFileName;
	strFileName = "MYBASE.mdb";	//添加相应你的数据库的文件名,编辑状态应放在源文件目录下
	m_conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFileName,
		"","",adConnectUnspecified);		//用户名,密码
	m_res.CreateInstance(_uuidof(Recordset));
}
catch(_com_error e)	//异常检测
{
	AfxMessageBox("数据库连接错误!",MB_ICONEXCLAMATION);
	exit(0);	//错误,程序退出
}

3.数据库相关操作(操作方法很多,这里只提供一种简易操作)

假设数据库表设计如下:
表名: MYTABLE
表设计:
自动编号类型 ID
字符串类型 NAME
BOOL类型 SEX

(1)增

_variant_t m_resa;	//可声明为成员变量

CString strMyName = "MyName";
CString strSex = "true";

CString sql;
sql = "insert into MYTABLE (NAME,SEX) ";
sql += "values ('" + strMyName +"',";
sql += " " + strSex + " ";
sql += ")";

try
{
	m_conn->Execute((_bstr_t)sql,&m_resa,adCmdText);	//执行"增"操作
}
catch(_com_error e)
{
	AfxMessageBox("数据库增错误",MB_ICONEXCLAMATION);
	exit(0);	//错误,程序退出
}

(2)删

_variant_t m_resa;	//可声明为成员变量

CString strID = "1";	//所要删除记录的ID号
CString sql;

sql = "delete from MYTABLE ";	//注意需要有空格
sql += "where ID = " + strID;	//其他语法详查SQL语句

try
{
	m_conn->Execute((_bstr_t)sql,&m_resa,adCmdText);	//执行"增"操作
}
catch(_com_error e)
{
	AfxMessageBox("数据库删错误",MB_ICONEXCLAMATION);
	exit(0);	//错误,程序退出
}

(3)改

_variant_t m_resa;	//可声明为成员变量

CString sql;
CString strMyName = "MyName";
CString strSex = "true";
CString strID = "1";	//所要更新的记录ID

sql = "update MYTABLE set ";
sql += "NAME = '" + strMyName +"', ";
sql += "SEX = " + strSex + " ";
sql += "where id = " + strID;

try
{
	m_conn->Execute((_bstr_t)sql,&m_resa,adCmdText);	//执行"增"操作
}
catch(_com_error e)
{
	AfxMessageBox("数据库删错误",MB_ICONEXCLAMATION);
	exit(0);	//错误,程序退出
}

(4)查

_variant_t m_resa;	//可声明为成员变量
CString sql;
sql = "Select * from MYTABLE";	//查询语句改变,相应下面的语句也要改变

//#include <afxtempl.h>	//需加入头文件
//CArray<CMyClass,CMyClass&> m_Array;	//可用容器保存你取得的数据

try
{
	m_res = m_conn->Execute((_bstr_t)sql,&m_resa,adCmdText);
}
catch(_com_error e)
{
	AfxMessageBox("数据库查错误",MB_ICONEXCLAMATION);
	exit(0);
}

//m_Array.RemoveAll();	//清空容器

try
{
	while(!m_res->adoEOF)	//循环遍历记录
	{
		_variant_t vID, vName, vSex;
		
		vID = m_res->GetCollect("ID");
		vName = m_res->GetCollect("NAME");
		vSex = m_res->GetCollect("SEX");
	
		///////////////////////////////////////////////
		int nID; 
		nID = (long)vID.lVal;
		///////////////////////////////////////////////
		CString strName;
		if(VT_NULL != vName.vt )	//如果数据不为空
		{
			strName = (LPCTSTR)vName.bstrVal;
		}
		///////////////////////////////////////////////
		bool bSex;
		if(VT_NULL != vSex.vt )
		{
			bSex = (bool)vSex.boolVal;
		}
		////////////////////////////////////////////////
		
		//CMyClass one(nID, strName, bSex);	//创建数据对象
		//m_Array.Add(one);	//加入数组
		
		m_res->MoveNext();	//移动到下一条记录
	}
}
catch(_com_error e)
{
	AfxMessageBox("数据库查错误",MB_ICONEXCLAMATION);
	exit(0);
}

4.关闭数据库

try
{
	if(m_res != NULL)
	{
		m_res->Close();	//关闭记录集
	}
	if(m_conn != NULL)
	{
		m_conn->Close();	//关闭连接
	}
}
catch(_com_error e)
{
	AfxMessageBox("数据库关闭错误",MB_ICONEXCLAMATION);
	exit(0);
}

5.总结

数据库操作多种多样,可以查查相关资料
这里只介绍了简单的一种操作,面向对象封装一下,直接调用即可

Trackback from your site.

(2)条评论

  • Wupei

    |

    是放在工程目录下,也就是程序目录下,不是放在exe的目录下~

    回复

  • 笔记

    |

    用ADO连接ACCESS数据库时,
    try
    {
    // 打开本地Access库Demo.mdb
    m_pConnection->Open(“Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Test.mdb”,
    “”,””,adModeUnknown);
    }
    catch(_com_error e)
    {
    AfxMessageBox(“数据库连接失败!”);
    return FALSE;
    }
    为什么总是出错,Test.mdb文件应该放在那里啊?是放在程序当前目录下吗!为什么总是提示”数据库连接失败!”

    回复

请在这里留言: