- 浏览: 492495 次
文章分类
最新评论
-
追求幸福:
这个问题你解决了吗?我也遇到这个问题了,可以交流一下吗
android OpenGL ES实现渲染到透明的纹理 render to transparent texture -
xyxdasnjss:
这个真心不错,支持
App应用之提交到各大市场渠道 -
zh_harry:
楼主是90后吧,下面那句就不说了,太伤自尊
程序员的出路 -
hero_shaoshuai:
你当创业是过家家么
程序员的出路 -
linlfx:
确实很扯,被励志书洗脑严重
程序员的出路
vs2008 MFC访问Access 2010数据库
MSDN给出了各种语言访问Access 2010的详细介绍:点击打开链接。下图列出了各种语言访问Access 2010的接口。
我在VS2008下使用MFC下的ODBC相关接口访问Access 2010数据库。
Demo中使用MFC访问数据库accsess2010数据库AccessDemo.accdb下有student表,表中有用户编号、电话号码、姓名、省份四列信息,表中有包含这四列信息的多个记录。
MFC下使用CDatabase、CRecordset、CDBException三个类来访问数据库。其中CDatabase主要用来打开和关闭数据库以及执行SQL指令;CRecordset用来执行查询、删除、添加记录;CDBException用来处理异常信息。
1.使用CDatabase、CRecordset、CDBException需要包含头文件:
#include "afxwin.h"
2.打开数据库
CDatabase db;
BOOL result = TRUE;
LPCTSTR lpszConnect =
_T("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:\\AccessDemo.accdb;PWD=asdfg;");
TRY
{
result = db.OpenEx(lpszConnect, CDatabase::openExclusive|CDatabase::noOdbcDialog);
}
catch(CDBException * e){
MessageBox(e->m_strError);
}
3.关闭数据库
TRY
{
db.Close();
}
catch(CDBException * e){
MessageBox(e->m_strError);
}
4.插入一个新的记录,这里使用CDatabase.ExecuteSQL()来执行SQL语句插入记录到表中。
UpdateData(TRUE);
CString insert,temp;
insert=_T("insert into student(用户编号,电话号码,姓名,省份) values(");
temp.Format(_T("%d"),m_idlint);
insert+=temp+_T(",\'")+m_phonenumstr+_T("\',\'")+m_namestr+_T("\',\'")+m_provincestr+_T("\')");
try{
db.ExecuteSQL(insert);
}
catch(CDBException *e){
MessageBox(e->m_strError);
}
5.使用CRecordset查询记录符合条件的记录。
UpdateData(TRUE);
BOOL result = TRUE;
CDBVariant var;
CString value;
CString query =_T("SELECT student.[用户编号], student.[电话号码],student.[姓名], student.[省份] FROM student where student.[电话号码]='");
query+=m_phonenumstr+_T("'");
MessageBox(query);
CRecordset rs(&db);
try{
result = rs.Open(CRecordset::dynaset, query, CRecordset::none);
if(TRUE==result){
CODBCFieldInfo fInfo;
short sFieldCount = rs.GetODBCFieldCount();
int rowCount = 0;
while (!rs.IsEOF())
{
for (short column = 0; column < sFieldCount; column++)
{
rs.GetFieldValue(column, var);
switch (var.m_dwType)
{
case DBVT_STRING:
value.Format(_T("%s"), var.m_pstring->GetBuffer(var.m_pstring->GetLength()));
break;
case DBVT_ASTRING:
value.Format(_T("%s"), var.m_pstringA->GetBuffer(var.m_pstringA->GetLength()));
break;
case DBVT_WSTRING:
value.Format(_T("%s"), var.m_pstringW->GetBuffer(var.m_pstringW->GetLength()));
break;
case DBVT_LONG:
value.Format(_T("%ld"), var.m_lVal);
break;
case DBVT_SHORT:
value.Format(_T("%d"), var.m_iVal);
break;
default:
value = _T("");
}
switch(column){
case 0:
m_idlint=var.m_lVal;
break;
case 1:
m_phonenumstr=*var.m_pstring;
break;
case 2:
m_namestr=*var.m_pstring;
break;
case 3:
m_provincestr=*var.m_pstring;
break;
}
}
rowCount++;
rs.MoveNext();
}
}
}
catch(CDBException * e){
MessageBox(e->m_strError);
}
UpdateData(FALSE);
数据库AccessDemo.accdb中的表student数据如下所示:
Demo主界面如下所示:
打开数据库并查询student表如下所示:
插入一条新的数据如下所示:
插入新的记录后的数据库AccessDemo.accdb中的表student数据如下所示:
主要代码如下所示:
AccessDemoDlg.h:
// AccessDemoDlg.h : header file // #pragma once //数据库操作类的头文件 #include <afxdb.h> #include "afxcmn.h" #include "afxwin.h" // CAccessDemoDlg dialog class CAccessDemoDlg : public CDialog { // Construction public: CAccessDemoDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data enum { IDD = IDD_ACCESSDEMO_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: HICON m_hIcon; // Generated message map functions virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedOpenButton(); private: CDatabase db; CListCtrl m_accesslist; CButton m_openbutton; CButton m_insertbutton; CButton m_querybutton; CEdit m_idedit; CEdit m_phonenumedit; CEdit m_nameedit; CEdit m_provinceedit; CStatic m_idstatic; CStatic m_phonenumstatic; CStatic m_namestatic; CStatic m_provincestatic; long m_idlint; CString m_phonenumstr; CString m_namestr; CString m_provincestr; void InitCtrl(); CRect rect; public: afx_msg void OnDestroy(); afx_msg void OnBnClickedInsertButton(); afx_msg void OnBnClickedQueryButton(); };AccessDemoDlg.cpp:
// AccessDemoDlg.cpp : implementation file // #include "stdafx.h" #include "AccessDemo.h" #include "AccessDemoDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation 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() // CAccessDemoDlg dialog CAccessDemoDlg::CAccessDemoDlg(CWnd* pParent /*=NULL*/) : CDialog(CAccessDemoDlg::IDD, pParent) , m_idlint(0) , m_phonenumstr(_T("")) , m_namestr(_T("")) , m_provincestr(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CAccessDemoDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_ACCESS_LIST, m_accesslist); DDX_Control(pDX, IDC_OPEN_BUTTON, m_openbutton); DDX_Control(pDX, IDC_INSERT_BUTTON, m_insertbutton); DDX_Control(pDX, IDC_QUERY_BUTTON, m_querybutton); DDX_Control(pDX, IDC_ID_EDIT, m_idedit); DDX_Control(pDX, IDC_PHONENUM_EDIT, m_phonenumedit); DDX_Control(pDX, IDC_EDIT3, m_nameedit); DDX_Control(pDX, IDC_PROVINCE_EDIT, m_provinceedit); DDX_Control(pDX, IDC_ID_STATIC, m_idstatic); DDX_Control(pDX, IDC_PHONENUM_STATIC, m_phonenumstatic); DDX_Control(pDX, IDC_NAME_STATIC, m_namestatic); DDX_Control(pDX, IDC_PROVINCE_STATIC, m_provincestatic); DDX_Text(pDX, IDC_ID_EDIT, m_idlint); DDX_Text(pDX, IDC_PHONENUM_EDIT, m_phonenumstr); DDX_Text(pDX, IDC_NAME_EDIT, m_namestr); DDX_Text(pDX, IDC_PROVINCE_EDIT, m_provincestr); } BEGIN_MESSAGE_MAP(CAccessDemoDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_OPEN_BUTTON, &CAccessDemoDlg::OnBnClickedOpenButton) ON_WM_DESTROY() ON_BN_CLICKED(IDC_INSERT_BUTTON, &CAccessDemoDlg::OnBnClickedInsertButton) ON_BN_CLICKED(IDC_QUERY_BUTTON, &CAccessDemoDlg::OnBnClickedQueryButton) END_MESSAGE_MAP() // CAccessDemoDlg message handlers BOOL CAccessDemoDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here InitCtrl(); return TRUE; // return TRUE unless you set the focus to a control } void CAccessDemoDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CAccessDemoDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CAccessDemoDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CAccessDemoDlg::OnBnClickedOpenButton() { // TODO: Add your control notification handler code here BOOL result = TRUE; CString cmpstr=_T("请打开数据库"),temp; LV_COLUMN lvcolumn; LV_ITEM lvitem; TCHAR szConnect[1000]=_T("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ="); TCHAR currentdirectory[MAX_PATH]; ::GetModuleFileNameW(NULL,temp.GetBuffer(MAX_PATH+1),MAX_PATH); temp.ReleaseBuffer(); temp=temp.Left(temp.ReverseFind(_T('\\'))); wcscpy(currentdirectory,temp.GetBuffer(temp.GetLength())); temp.ReleaseBuffer(); wcscat(currentdirectory,_T("\\AccessDemo.accdb;PWD=asdfg;")); wcscat(szConnect,currentdirectory); try{ TCHAR buttonname[255]={_T('0'),}; m_openbutton.GetWindowTextW(buttonname,255); if(cmpstr.Compare(buttonname)==0){ result = db.OpenEx(szConnect,CDatabase::openExclusive|CDatabase::noOdbcDialog);//CDatabase::openReadOnly|CDatabase::noOdbcDialog); if (TRUE == result) { m_openbutton.SetWindowTextW(_T("请关闭数据库")); LPCTSTR query =_T("SELECT student.[用户编号], student.[电话号码],student.[姓名], student.[省份] FROM student ORDER BY student.[用户编号] ASC;"); //DESC;"); CRecordset rs(&db); result = rs.Open(CRecordset::dynaset, query, CRecordset::none); if(TRUE==result){ CODBCFieldInfo fInfo; short sFieldCount = rs.GetODBCFieldCount(); //删除列表控件原来所有行 m_accesslist.DeleteAllItems(); //删除列表控件原来所有列 while(m_accesslist.GetHeaderCtrl()->GetItemCount()>0){ m_accesslist.DeleteColumn(m_accesslist.GetHeaderCtrl()->GetItemCount()-1); } m_accesslist.SetRedraw(TRUE); m_accesslist.Invalidate(); m_accesslist.UpdateWindow(); //获取数据库中表列信息 if (sFieldCount > 0) { for (short column = 0; column < sFieldCount; column++) { CODBCFieldInfo fInfo; rs.GetODBCFieldInfo(column, fInfo); //MessageBox(fInfo.m_strName); lvcolumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; lvcolumn.fmt=LVCFMT_LEFT; lvcolumn.pszText=fInfo.m_strName.GetBuffer(fInfo.m_strName.GetLength()); lvcolumn.iSubItem=column; lvcolumn.cx=rect.Width()/sFieldCount; fInfo.m_strName.ReleaseBuffer(); m_accesslist.InsertColumn(column,&lvcolumn); } } CDBVariant var; CString value; int rowCount = 0; int iactualitem; //获取数据库中表行信息 while (!rs.IsEOF()) { for (short column = 0; column < sFieldCount; column++) { rs.GetFieldValue(column, var); switch (var.m_dwType) { case DBVT_STRING: value.Format(_T("%s"), var.m_pstring->GetBuffer(var.m_pstring->GetLength())); break; case DBVT_ASTRING: value.Format(_T("%s"), var.m_pstringA->GetBuffer(var.m_pstringA->GetLength())); break; case DBVT_WSTRING: value.Format(_T("%s"), var.m_pstringW->GetBuffer(var.m_pstringW->GetLength())); break; case DBVT_LONG: value.Format(_T("%ld"), var.m_lVal); break; case DBVT_SHORT: value.Format(_T("%d"), var.m_iVal); break; default: value = _T(""); } if(column==0){ lvitem.mask=LVIF_TEXT; lvitem.iItem=rowCount; lvitem.iSubItem=column; lvitem.pszText=value.GetBuffer(value.GetLength()); value.ReleaseBuffer(); lvitem.cchTextMax=value.GetLength(); m_accesslist.GetItem(&lvitem); lvitem.iItem=m_accesslist.GetItemCount(); iactualitem=m_accesslist.InsertItem(&lvitem); }else{ lvitem.mask=LVIF_TEXT; lvitem.iItem=rowCount; lvitem.iSubItem=column; lvitem.pszText=value.GetBuffer(value.GetLength()); value.ReleaseBuffer(); lvitem.cchTextMax=value.GetLength(); lvitem.iItem=iactualitem; m_accesslist.SetItem(&lvitem); } } rowCount++; rs.MoveNext(); } } m_insertbutton.EnableWindow(TRUE); m_querybutton.EnableWindow(TRUE); } else{ MessageBox(_T("打开数据库失败")); m_insertbutton.EnableWindow(FALSE); m_querybutton.EnableWindow(FALSE); } } else{ db.Close(); m_openbutton.SetWindowTextW(_T("请打开数据库")); m_insertbutton.EnableWindow(FALSE); m_querybutton.EnableWindow(FALSE); } } catch(CDBException * e){ MessageBox(e->m_strError); } } void CAccessDemoDlg::InitCtrl(){ CFont nFont ,* nOldFont; nFont.CreateFont(20,15,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体 m_accesslist.SetFont(&nFont); m_openbutton.SetFont(&nFont); m_insertbutton.SetFont(&nFont); m_querybutton.SetFont(&nFont); m_idedit.SetFont(&nFont); m_phonenumedit.SetFont(&nFont); m_nameedit.SetFont(&nFont); m_provinceedit.SetFont(&nFont); m_idstatic.SetFont(&nFont); m_phonenumstatic.SetFont(&nFont); m_namestatic.SetFont(&nFont); m_provincestatic.SetFont(&nFont); m_openbutton.SetWindowTextW(_T("请打开数据库")); m_insertbutton.SetWindowTextW(_T("插入记录到数据库")); m_querybutton.SetWindowTextW(_T("根据手机号码查询")); m_idstatic.SetWindowTextW(_T("用户编号")); m_phonenumstatic.SetWindowTextW(_T("电话号码")); m_namestatic.SetWindowTextW(_T("姓名")); m_provincestatic.SetWindowTextW(_T("省份")); m_insertbutton.EnableWindow(FALSE); m_querybutton.EnableWindow(FALSE); DWORD dwstyle=m_accesslist.GetExtendedStyle(); //dwstyle|=(LVS_EX_ONECLICKACTIVATE|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_TRACKSELECT|LVS_EDITLABELS|LVS_NOLABELWRAP); dwstyle|=LVS_EX_FULLROWSELECT; m_accesslist.SetExtendedStyle(dwstyle); m_accesslist.GetWindowRect(&rect); } void CAccessDemoDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here CString cmpstr=_T("请关闭数据库"); TCHAR buttonname[255]={_T('0'),}; m_openbutton.GetWindowTextW(buttonname,255); if(cmpstr.Compare(buttonname)==0){ db.Close(); } } //插入一个记录 void CAccessDemoDlg::OnBnClickedInsertButton() { // TODO: Add your control notification handler code here UpdateData(TRUE); CString insert,temp; insert=_T("insert into student(用户编号,电话号码,姓名,省份) values("); temp.Format(_T("%d"),m_idlint); insert+=temp+_T(",\'")+m_phonenumstr+_T("\',\'")+m_namestr+_T("\',\'")+m_provincestr+_T("\')"); try{ db.ExecuteSQL(insert); } catch(CDBException *e){ MessageBox(e->m_strError); } } //根据手机号码查询记录 void CAccessDemoDlg::OnBnClickedQueryButton() { // TODO: Add your control notification handler code here UpdateData(TRUE); BOOL result = TRUE; CDBVariant var; CString value; CString query =_T("SELECT student.[用户编号], student.[电话号码],student.[姓名], student.[省份] FROM student where student.[电话号码]='"); query+=m_phonenumstr+_T("'"); MessageBox(query); CRecordset rs(&db); try{ result = rs.Open(CRecordset::dynaset, query, CRecordset::none); if(TRUE==result){ CODBCFieldInfo fInfo; short sFieldCount = rs.GetODBCFieldCount(); int rowCount = 0; while (!rs.IsEOF()) { for (short column = 0; column < sFieldCount; column++) { rs.GetFieldValue(column, var); switch (var.m_dwType) { case DBVT_STRING: value.Format(_T("%s"), var.m_pstring->GetBuffer(var.m_pstring->GetLength())); break; case DBVT_ASTRING: value.Format(_T("%s"), var.m_pstringA->GetBuffer(var.m_pstringA->GetLength())); break; case DBVT_WSTRING: value.Format(_T("%s"), var.m_pstringW->GetBuffer(var.m_pstringW->GetLength())); break; case DBVT_LONG: value.Format(_T("%ld"), var.m_lVal); break; case DBVT_SHORT: value.Format(_T("%d"), var.m_iVal); break; default: value = _T(""); } switch(column){ case 0: m_idlint=var.m_lVal; break; case 1: m_phonenumstr=*var.m_pstring; break; case 2: m_namestr=*var.m_pstring; break; case 3: m_provincestr=*var.m_pstring; break; } } rowCount++; rs.MoveNext(); } } } catch(CDBException * e){ MessageBox(e->m_strError); } UpdateData(FALSE); }
相关推荐
vs2008连接access的示例,ado连接access及对access操作。
在MFC下,采用ADO技术访问access数据库,做的一个很小的学生成绩管理系统。个人觉得对于初学数据库的人来说,是一个很不错的资源。编译时保证头文件stdafx.h中“#import "C:\Program Files\Common Files\System\ado\...
资源包括MFC单文档程序、Access数据库表格、使用文档,如果在您那端出现问题,是因为数据库未连接上,可以仿照文档中的说明进行设定,即配置“控制面板”里的数据源。
使用MFC访问Access数据库的案例.
是在VC6.0下用的MFC自动加载数据源的access数据库应用程序. 下面有另外个例子 VC6.0写的用户账号管理: http://download.csdn.net/source/2848883 VS2008写的用户账号管理 http://download.csdn.net/source/2886243
对初学MFC+Access数据库编程者有很大的帮助 内容包含主要有ODBC\DAO\ADO等数据库访问方式
详细介绍了VC++ MFC环境下访问利用ODBC访问数据库ACCESS的操作方法
基于对话框形式,利用ACCESS 97数据库,连接方式是 DAO
MFC用ADO访问数据库(Access数据库)中的图片
根据查询数据库中的结果来决定用户能否登录 ,有该用户则可以登录 没有则不行。
COM接口访问Access数据库。 本代码含有:MD5加密、登陆验证 比较简单。适合初学研究。 文章参考 http://blog.csdn.net/xlh145/article/details/8698664
如何掌握ADO这种数据库访问技术,为了更有效的说明它的使用方法,我用VC6.0做了一个示例程序——AdoRWAccess,这个示例程序可以直接通过ADO来操作Access数据库
MFC使用ADO读写Access数据库参考例程 ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,...
ADO访问Access数据库示例代码,封装了两个数据访问类,没有用MFC。
mfc利用ado访问技术连接数据库 首先在access数据库中建立一个名为test.mdb数据库 并把它放在当前工作区间里
已通过验证,且包含具体的word操作文档和mdb文件。
VC++2010MFC数据库开发,利用ADO数据库访问技术访问Access数据库,其中涉及了查询,编辑,插入,更新,新增,删除等等操作,代码整洁,易于阅读,容易理解,程序极易扩展,有利于你的进一步开发,为你的下一步编程...
vc++ ado访问Access数据库,通过智能指针对Access数据库进行添加,删除等操作。是一段很好的代码!比较基础
基于对话框的通讯录源码,使用ODBC访问ACCESS数据库,使用USKIN界面库进行美化。
// shujukuDlg.cpp : implementation file // #include "stdafx.h" #include "shujuku.h" #include "shujukuDlg.h...//读取数据库内容的代码 m_db.Close(); UpdateData(false); CDialog::OnTimer(nIDEvent); }