使用MFC访问Access数据库的方法和技巧 (mfc access 数据库)

随着信息技术的发展,计算机的应用范围越来越广泛。在日常开发过程中,访问数据库已经成为程序员经常需要进行的操作。Microsoft Foundation Classes(MFC)是一个被广泛使用的C++类库,用于开发Windows应用程序。而Access数据库是微软开发的一款关系型数据库管理系统,通过MFC访问Access数据库,可以实现程序和数据库之间的数据交互,本文将介绍。

一、创建Access数据库

首先需要创建一个Access数据库,可以使用Access自带的向导创建数据库,也可以使用代码创建。以下是使用代码创建数据库的步骤:

1. 定义一个数据库连接变量

CDatabase db;

2. 打开数据库

db.Open(NULL,false,false,_T(“ODBC;DSN=MS Access Database;DBQ=d:\\test.mdb”));

其中,ODBC为数据源名,DSN为数据源名,DBQ为数据库文件路径,可以根据自己的需要进行修改。

二、向Access数据库中添加、读取数据

连接上数据库之后,就可以进行添加、读取、修改、删除等操作。以下是添加数据的示例:

1. 定义一个记录集变量

CRecordset rs(&db);

2. 打开记录集对象

rs.Open(CRecordset::dynaset,_T(“select * from student”),CRecordset::none);

其中,student为表格名称。

3. 定义一个记录

rs.AddNew();

4. 向记录中添加数据

rs.SetFieldValue(_T(“ID”),1);

rs.SetFieldValue(_T(“Name”),_T(“Tom”));

rs.SetFieldValue(_T(“Age”),18);

5. 提交记录

rs.Update();

通过以上步骤就可以向Access数据库中添加数据,同样可以通过修改将数据进行修改或者删除。以下是读取数据的示例:

1. 定义一个记录集变量

CRecordset rs(&db);

2. 打开记录集对象,并执行查询语句

rs.Open(CRecordset::dynaset,_T(“select * from student”),CRecordset::none);

其中,student为表格名称。

3. 循环读取记录

while(!rs.IsEOF())

{

int nID;

CString strName;

int nAge;

rs.GetFieldValue(_T(“ID”),nID);

rs.GetFieldValue(_T(“Name”),strName);

rs.GetFieldValue(_T(“Age”),nAge);

//输出读取到的记录

printf(“ID:%d,Name:%s,Age:%d”,nID,strName,nAge);

rs.MoveNext();

}

通过以上步骤就可以从Access数据库中读取数据,同样可以通过查询语句的修改将查询到的数据进行修改或者删除。

在程序开发过程中,访问数据库是常常需要进行的操作。使用MFC访问Access数据库可以实现程序和数据库之间的数据交互,具有灵活、高效、快速等特点。通过以上示例,可以看出访问Access数据库的方法和技巧并不复杂,只要按照以上步骤进行操作,就可以实现对Access数据库的读取、修改、添加、删除等操作。同时,在使用过程中也需要注意一些技巧,比如定期进行数据库备份、设置适当的索引等,以提高程序的稳定性和性能。

相关问题拓展阅读:

MFC 如何查询Access不同数据库不同表的数据

ADO技术

//打开数据库

CADODatabase Cdb;

CString strCon = m_strDBCon;

BOOL bRet = Cdb.Open(strCon);

if (!bRet)

{

MessageBox(“连接数据库出错!\r\n请确定程序目录是否有MDB文件!”,MSG_TS,MB_ICONERROR);

return FALSE;

}

CString strQuerySQL;

strQuerySQL.Format(_T(“SELECT * FROM T_NormalTpt WHERE GroupID = %d AND Barcode = ‘%s’ ORDER BY TestDate DESC,Barcode ASC”),1,_T(“222”));//查询语句

CADORecordset cRe(&Cdb);

bRet=cRe.Open(strQuerySQL,cRe.openQuery);

if (!bRet)

{

MessageBox(“读取数据库记录失败!”,MSG_TS,MB_ICONERROR);

Cdb.Close();

return 0;

}

int nRcount 判腔= 0;//记录总数

nRcount = cRe.GetRecordCount();

CString strGroupID,strCurrentNo,strBarCode,strElecCode,strSensor,strTemperature;

CString strTmp,strmA4,strmA20,strTestDate,strTester,strErrorCode,strDescription;

double dTemp;

while(!cRe.IsEof())

{

cRe.GetFieldValue(_T(“GroupID”),strGroupID);//得到文本

cRe.GetFieldValue(_T(“CurrentNo”),strCurrentNo);

cRe.GetFieldValue(_T(“ElecCode”),strElecCode);

cRe.GetFieldValue(_T(“Barcode”罩冲森),strBarCode);

cRe.GetFieldValue(_T(“Sensor”),dTemp);//得到double类型

strSensor.Format(_T(“物亩%.4f”),dTemp);

cRe.GetFieldValue(_T(“Temperature”),dTemp);

strTemperature.Format(_T(“%.4f”),dTemp);

cRe.GetFieldValue(_T(“ElectricCurrent4”),dTemp);

strmA4.Format(_T(“%.4f”),dTemp);

cRe.GetFieldValue(_T(“ElectricCurrent20”),dTemp);

strmA20.Format(_T(“%.4f”),dTemp);

cRe.GetFieldValue(_T(“TestDate”),strTestDate);

cRe.GetFieldValue(_T(“Tester”),strTester);

cRe.GetFieldValue(_T(“ErrorCode”),strErrorCode);

cRe.GetFieldValue(_T(“ErrorRes”),strDescription);

cRe.MoveNext();

}

//关闭数据库

cRe.Close();

Cdb.Close();

MFC通过ADO操作Access数据库

vc 可以访问很多数据库,比如Access、SQL servel、MYSql、Orcal等数据库系统。也有很多数据库访问技术,比如ADO、ODBC、OLE DB等。每一种数据库系统都提供了一系列的API,在程序中可以通过编码的形式调用相应的API进而对数据库操作。

你学一个vc++访问ADO数据库吧,难点,但是很则租实用!

1、导入ADO库

#import “c:\Program Files\Common Files\System\ADO\msado15.dll”孙蚂兆 no_namespace rename(“EOF”, “adoEOF”)

2、用导入的动态库的指针操作数据库.

打开数据库连接

_ConnectionPtr m_pConn; // 数据库连接指针

// 创建Conneciton对象

m_pConn.CreateInstance(_T(“ADODB.Connection”));

用ConnectionPtr 的open方法m_pConn->Open(_bstr_t(m_sConn),

_T(“”), _T(“”), lOptions));

m_sConn为你连接数据库的信息,你应该按照你的要求打开数据库,他里面包含了你的物烂Access数据库的路径、名称等待信息,,,是一个通用的字符串。

然后你用打开的那个连接进行操作数据库。比如

_RecordsetPtr pRec = m_pConn->Execute(_bstr_t(pszSql), NULL, CmdText);

pszSql 就你要操作数据库的SQL语句。在这个SQL语句里你可以创建表、更新表等。

用ADO访问的时候要求初始他COM库和释放COM对象

// 初始化COM环境(库)

::CoInitialize(NULL);

//释放COM对象

::CoUninitialize();

// DbTestDlg.cpp : 实现文件

//

#include “stdafx.h”

#include “DbTest.h”

#include “DbTestDlg.h”

#include “Resource.h”

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对明者话框

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// 对话框数据

enum { IDD = IDD_ABOUTBOX };

protected:

virtual void DoDataExchange(CDataExchange* pDX); //激者薯 DDX/DDV 支持

// 实现

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

// CDbTestDlg 对话框

CDbTestDlg::CDbTestDlg(CWnd* pParent /*=NULL*/)

: CDialog(CDbTestDlg::IDD, pParent)

,m_strId(_T(“”))

, m_strName(_T(“”))

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CDbTestDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Text(pDX,IDC_EDIT_ID,m_strId);

DDX_Text(pDX,IDC_EDIT_NAME,m_strName);

}

BEGIN_MESSAGE_MAP(CDbTestDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

ON_BN_CLICKED(IDOK, &CDbTestDlg::OnBnClickedOk)

ON_BN_CLICKED(IDC_BUTTON1, &CDbTestDlg::OnBnClickedButton1)

ON_BN_CLICKED(IDC_BUTTON2, &CDbTestDlg::OnBnClickedButton2)

ON_BN_CLICKED(IDC_BUTTON3, &CDbTestDlg::OnBnClickedButton3)

END_MESSAGE_MAP()

// CDbTestDlg 消息处理程序

BOOL CDbTestDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// 将“关于…”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// 设置此对话框的图标。当应用程序主窗口不嫌锋是对话框时,框架将自动

// 执行此操作

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

m_pConnection.CreateInstance(_T(“ADODB.Connection”));

CString sql;

sql.Format(_T(“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Employee.mdb”));

m_pConnection->Open((_bstr_t)sql,_T(“”),_T(“”),adModeUnknown);

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE

}

void CDbTestDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// 如果向对话框添加最小化按钮,则需要下面的代码

// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

// 这将由框架自动完成。

void CDbTestDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

// 使图标在工作矩形中居中

int cxIcon = GetSystemMetrics(_CXICON);

int cyIcon = GetSystemMetrics(_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() – cxIcon + 1) / 2;

int y = (rect.Height() – cyIcon + 1) / 2;

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。

//

HCURSOR CDbTestDlg::OnQueryDragIcon()

{

return static_cast(m_hIcon);

}

void CDbTestDlg::OnBnClickedOk()

{

// TODO: 在此添加控件通知处理程序代码

//OnOK();

UpdateData();

CString sql;

m_pRecord.CreateInstance(_T(“ADODB.Recordset”));

sql.Format(_T(“SELECT * FROM WHERE id = ‘%s’ ORDER BY .id”),m_strId);

m_pRecord->Open(_bstr_t(sql),

_variant_t((IDispatch*)m_pConnection,true),

adOpenDynamic,adLockOptimistic,adCmdText);

_variant_t varId,varName;

varName = m_pRecord->GetCollect(_T(“name”));

m_strName = (TCHAR *)_bstr_t(varName);

UpdateData(FALSE);

}

void CDbTestDlg::OnBnClickedButton1()//添加

{

// TODO: 在此添加控件通知处理程序代码

UpdateData();

CString sql;

m_pRecord.CreateInstance(_T(“ADODB.Recordset”));

sql.Format(_T(“SELECT * FROM WHERE id = ‘%s’ ORDER BY .id”),m_strId);

m_pRecord->Open(_bstr_t(sql),

_variant_t((IDispatch*)m_pConnection,true),

adOpenDynamic,adLockOptimistic,adCmdText);

try

{

// 写入各字段值

m_pRecord->AddNew();

m_pRecord->PutCollect(“id”, _variant_t(m_strId));

m_pRecord->PutCollect(“name”, _variant_t(m_strName));

m_pRecord->Update();

AfxMessageBox(_T(“添加成功!”));

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

UpdateData(FALSE);

}

void CDbTestDlg::OnBnClickedButton2()//修改

{

// TODO: 在此添加控件通知处理程序代码

UpdateData();

CString sql;

m_pRecord.CreateInstance(_T(“ADODB.Recordset”));

sql.Format(_T(“SELECT * FROM WHERE id = ‘%s’ ORDER BY .id”),m_strId);

m_pRecord->Open(_bstr_t(sql),

_variant_t((IDispatch*)m_pConnection,true),

adOpenDynamic,adLockOptimistic,adCmdText);

try

{

// 假设对第二条记录进行修改

m_pRecord->MoveFirst();

m_pRecord->Move(1);// 从0开始

m_pRecord->PutCollect(“id”, _variant_t(m_strId));

m_pRecord->PutCollect(“name”, _variant_t(m_strName));

m_pRecord->Update();

AfxMessageBox(_T(“修改成功!”));

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

UpdateData(FALSE);

}

void CDbTestDlg::OnBnClickedButton3()//删除

{

// TODO: 在此添加控件通知处理程序代码

UpdateData();

CString sql;

m_pRecord.CreateInstance(_T(“ADODB.Recordset”));

sql.Format(_T(“SELECT * FROM WHERE id = ‘%s’ ORDER BY .id”),m_strId);

m_pRecord->Open(_bstr_t(sql),

_variant_t((IDispatch*)m_pConnection,true),

adOpenDynamic,adLockOptimistic,adCmdText);

try

{

// 假设删除第二条记录

m_pRecord->MoveFirst();

m_pRecord->Move(1);// 从0开始

m_pRecord->Delete(adAffectCurrent); // 参数adAffectCurrent为删除当前记录

m_pRecord->Update();

AfxMessageBox(_T(“删除成功!”));

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

UpdateData(FALSE);

mfc无法将数据写入access数据库

先建立一个和Data.mdb数据库的连接(connection),然后才能执行SQL语句建立表。

mfc access 数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mfc access 数据库,使用MFC访问Access数据库的方法和技巧,MFC 如何查询Access不同数据库不同表的数据,MFC通过ADO操作Access数据库,mfc无法将数据写入access数据库的信息别忘了在本站进行查找喔。


数据运维技术 » 使用MFC访问Access数据库的方法和技巧 (mfc access 数据库)