vs2013连接access2016

一、开始

      最近因为要做一个c++实训的项目,主要连接access数据库。自己以前尝试的连接过,但都失败了。今天花费了一天终与vs连接access成功了。下面我就简单来介绍一下。

二、准备

   1.什么是数据源?

      百度百科这样的解释:数据源是指数据库应用程序所使用的数据库或者数据库服务器。 数据源(Data Source)顾名思义,数据的来源,是提供某种所需要数据的器件或原始媒体。在数据源中存储了所有建立数据库连接的信息。就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数据源名称,你可以找到相应的数据库连接。应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。(access是ODBC)。通过这个ODBC就能实现连接数据库。

  2. 连接字符串的问题?

     这个问题非常的关键,但是我就是因为这个搞不明白所以一直导致数据库连接不成功。现在我们来看一下。

Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=ExamOnline.mdb","","",adModeUnknown);Microsoft.Jet.OLEDB.4.0:具体是指驱动的版本号。一般4.0的是指的老版本,现在最新的是12.0。它们俩的区别应该就是在识别access格式的差距。

解决的办法:

http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe下载安装就行。

三、连接

   1.新建项目access

     

    2.加入

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")放在stdafx.h的最后面。记住一点要关闭项目再重启红色的波浪线就消失啦。

     3.创建类sql

#include"stdafx.h"            //因为是新建了个类,所以需要包含头文件
class sql
{
public:
	_ConnectionPtr m_pConnection;                   //连接access数据库的链接对象
	_RecordsetPtr m_pRecordset;                     //结果集对象
public:
	sql();                                          //定义构造函数,来进行数据库连接的初始化
	void sql_close();                               //关闭数据库连接
};

sql::sql()
{
	try{
		::CoInitialize(NULL);
		m_pConnection.CreateInstance("ADODB.Connection");  //创建连接对象实例
		_bstr_t strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=demo1.mdb;";//连接字符串
		m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库
	}
	catch (_com_error e){
		AfxMessageBox(e.Description());
	}

}
void sql::sql_close()                                    //关闭数据库
{
	if (m_pRecordset->GetState() == adStateOpen)
	{ 
		m_pRecordset->Close();
	}	
	m_pConnection->Close();
	m_pConnection.Release(); 
	::CoUninitialize();

}

   因为我的ODBC版本是4.0的所以我采用了将修改access文件的格式,来对他进行读取。

这样就可以实现vs连接access数据库l啦

4.载入文件

你需要在系统的文件家中找到这个文件,便把它拷贝到

大致文件项目的这个目录下面点击运行就可以,这样那个红色的波浪线就会没有。

_bstr_t strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=demo.accdb;";

这里面的Provider这样找:

找到这个页面:

这里可以进行复制粘贴过去(注意:一般选择高版本的这样支持access的文件格式多)

Source=demo.accdb 

这个是指你的access文件存放的目录。

5、源码

#include"stdafx.h"
class ADOConn
{
public:
	_ConnectionPtr m_pConnection;                   //连接access数据库的链接对象
	_RecordsetPtr m_pRecordset;                     //结果集对象
public:
	void OnInitADOConn();                           //初始化连接对象 
	void ExitConn();								//关闭数据库连接
	_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);	//获取记录集
	BOOL ExecuteSQL(_bstr_t bstrSQL);				//执行数据库语句
	bool addMessage();                              //添加信息
	bool updata();									//修改信息
	bool deledata();								//删除信息
	bool index();									//查找信息
};
//初始化连接对象
void ADOConn::OnInitADOConn()
{
	//初始化OLE/COM环境
	::CoInitialize(NULL);
	try
	{
		m_pConnection.CreateInstance("ADODB.Connection");  //创建连接对象实例
		_bstr_t strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=demo.accdb;";//连接字符串
		m_pConnection->Open(strConnect, "", "", adModeUnknown); //打开数据库
	}
	catch(_com_error e)
	{
		//显示错误信息
		AfxMessageBox(e.Description());
	}

}
//关闭连接
void ADOConn::ExitConn()
{
	if (m_pRecordset != NULL)
	{
		m_pRecordset->Close();
	}
	m_pConnection->Close();
	//释放环境
	::CoUninitialize();
}
//返回结果集
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
	try
	{
		if (m_pConnection == NULL) //判断Connection对象是否为空
			OnInitADOConn(); //如果为空则重新连接数据库
		m_pRecordset.CreateInstance("ADODB.Recordset"); //创建记录集对象
		//获取数据表中的数据
		m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
	}
	catch (_com_error e) //捕获异常
	{
		AfxMessageBox(e.Description()); //显示错误信息
	}
	return m_pRecordset;
}
//执行sql语句
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
	try
	{
		if (m_pConnection == NULL) //判断Connection对象是否为空
			OnInitADOConn(); //如果为空则重新连接数据库
		m_pConnection->Execute(bstrSQL, NULL, adCmdText); //执行数据库语句
		return true;
	}
	catch (_com_error e) //捕获异常
	{
		AfxMessageBox(e.Description()); //显示错误信息
		return false;
	}
}
//添加信息
bool ADOConn::addMessage()
{
	
		if (m_pConnection == NULL) //判断Connection对象是否为空
			OnInitADOConn(); //如果为空则重新连接数据库
		else
		{
			_variant_t RecordsAffected;                        //定义插入对象
			CString AddSql;
			AddSql.Format(_T("INSERT INTO student(ID,name,age) VALUES('123457','小白',12)"));//执行sql语句
			try{
				m_pConnection->Execute((_bstr_t)AddSql, &RecordsAffected, adCmdText);
				AfxMessageBox(_T("添加用户成功!"));
			}
			catch (_com_error e){
				AfxMessageBox(_T("添加用户失败!"));
			}
		}
	
}
//删除信息
bool ADOConn::deledata()
{
	CString str;
	try
	{
		str.Format(_T("DELETE from student where ID='123456'"));
		_variant_t RecordsAffected;
		m_pConnection->Execute((_bstr_t)str, &RecordsAffected, adCmdText);
		AfxMessageBox(_T("删除成功!"));
		return true;
	}
	catch (_com_error*e)
	{
		AfxMessageBox(e->ErrorMessage());
	}
}
//查找信息
bool ADOConn::index()
{
	// TODO:  在此添加控件通知处理程序代码
	updata();
	CString strName;
	CString strSex;

	try
	{
		m_pRecordset.CreateInstance(__uuidof(Recordset));
		CString search_sql;
		search_sql.Format(_T("SELECT * FROM student"));
		m_pRecordset = GetRecordSet(search_sql.AllocSysString());//查询结果集
		//m_pRecordset = ((CADO_ACCESSDlg*)(AfxGetMainWnd()))->m_pConnection->Execute(search_sql.AllocSysString(), NULL, adCmdText);
		while (!m_pRecordset->adoEOF)
		{
			strName = m_pRecordset->GetCollect("name").bstrVal;
			strSex = m_pRecordset->GetCollect("sex").bstrVal;
			m_pRecordset->MoveNext();
		}
		m_pRecordset->Close();
	}
	catch (_com_error e)
	{
		AfxMessageBox(_T("搜索失败!"));
		return;
	}
}
//更新信息
bool ADOConn::updata()
{
	CString str;
	try
	{
		str.Format(_T("update student set name='小草' where id='123789'"));
		_variant_t RecordsAffected;
		m_pConnection->Execute((_bstr_t)str, &RecordsAffected, adCmdText);
		AfxMessageBox(_T("修改成功!"));
	}
	catch (_com_error*e)
	{
		AfxMessageBox(e->ErrorMessage());
	}
}

 

 

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值