一、开始
最近因为要做一个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格式的差距。
解决的办法:
三、连接
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());
}
}