当前位置:文档之家› vc++中使用ado方式操作access数据库

vc++中使用ado方式操作access数据库

vc++中使用ado方式操作access数据库
vc++中使用ado方式操作access数据库

vc++中使用ado方式操作access数据库ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO、RDO都要容易使用,并不失灵活性。本文详细地介绍在Visual C++开发环境下如何使用ADO来进行数据库应用程序开发,并给出示例代码。为了使读者朋友都能测试本例提供的代码,我们采用Access数据库,您可以直接在我们提供的示例代码中找到这个test.mdb。程序编译运行后的效果如图一所示

图一、ADO操作ACESS数据库的界面效果图

一、实现方法

万事开头难,任何一种新技术对于初学者来说最重要的还是"入门",掌握其要点。让我们来看看ADO数据库开发的基本流程吧!它的基本步骤如下:

(1)初始化COM库,引入ADO库定义文件

(2)用Connection对象连接数据库

(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。

(4)使用完毕后关闭连接释放对象。

下面我们将详细介绍上述步骤并给出相关代码。

1、COM库的初始化

我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码:

BOOL CADOTest1App::InitInstance()

{

AfxOleInit();

......

}

2、用#import指令引入ADO类型库

为了引入ADO类型库,需要在项目的stdafx.h文件中加入如下语句:

#import "c:program filescommon filessystemadomsado15.dll"

no_namespace rename("EOF","adoEOF")

这一语句有何作用呢?其最终作用同我们已经十分熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。

需要读者朋友注意的是:您的开发环境中msado15.dll不一定在这个目录下,请按实际情况修改;在编译的时候可能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告:msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned。

3、创建Connection对象并连接数据库

为了首先我们需要添加一个指向Connection对象的指针_ConnectionPtr m_pConnection,下面的代码演示了如何创建Connection对象实例及如何连接数据库并进行异常捕捉:

BOOL CADOTest1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

HRESULT hr;

try

{

hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象

if(SUCCEEDED(hr))

{

hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;

Data Source=test.mdb","","",adModeUnknown);///连接数据库

//上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,

//需要改为:Provider=Microsoft.Jet.OLEDB.3.51;

}

}

catch(_com_error e)///捕捉异常

{

CString errormessage;

errormessage.Format("连接数据库失败!rn错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);///显示错误信息

}

在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型:

HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options );

上述函数中参数ConnectionString为连接字串;参数UserID是用户名;参数Password是登陆密码;参数Options是连接选项,用于指定Connection对象对数据的更新许可权,一般情况下Options可以是如下几个常量:

adModeUnknown:缺省。当前的许可权未设置

adModeRead:只读

adModeWrite:只写

adModeReadWrite:可以读写

adModeShareDenyRead:阻止其它Connection对象以读权限打开连接

adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接

adModeShareExclusive:阻止其它Connection对象以读写权限打开连接

adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接

我们给出一些常用的连接方式供大家参考:

(1)通过JET数据库引擎对ACCESS2000数据库的连接:

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;

Data Source=C:\test.mdb","","",adModeUnknown);

(2)通过DSN数据源对任何支持ODBC的数据库进行连接:

m_pConnection->Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnknown);

(3)不通过DSN对SQL SERVER数据库进行连接:

m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;

UID=sa;PWD=139","","",adModeUnknown);

其中Server是SQL服务器的名称,DATABASE是库的名称。

Connection对象除Open()方法外还有许多方法,我们先介绍Connection对象中两个有用的属性ConnectionTimeOut与State。ConnectionTimeOut用来设置连接的超时时间,需要在Open之前调用,例如:m_pConnection->ConnectionTimeout = 5;///设置超时时间为5秒

m_pConnection->Open("Data Source=adotest;","","",adModeUnknown);

State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过读取这个属性来作相应的处理,例如:

if(m_pConnection->State)

m_pConnection->Close(); ///如果已经打开了连接则关闭它

4、执行SQL命令并取得结果记录集

为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;

并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset"),SQL命令的执行可以采用多种形式,下面我们一一进行阐述。

(1)利用Connection对象的Execute方法执行SQL命令

Execute()方法的原型如下所示:

_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )

其中CommandText是命令字串,通常是SQL命令。参数RecordsAffected是操作完成后所影响的行数, 参数Options表示CommandText中内容的类型,Options可以取如下值之一:adCmdText表明CommandText是文本命令;adCmdTable表明CommandText是一个表名;adCmdProc表明CommandText是一个存储过程;adCmdUnknown表明CommandText内容未知。Execute()函数执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明:

_variant_t RecordsAffected;

///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday

m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username

TEXT,old INTEGER,birthday DATETIME)",&RecordsAffected,adCmdText);

///往表格里面添加记录

m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday)

VALUES (1, 'Washington',25,'1970/1/1')",&RecordsAffected,adCmdText);

///将所有记录old字段的值加一

m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);

///执行SQL统计命令得到包含记录条数的记录集

m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM

users",&RecordsAffected,adCmdText);

_variant_t vIndex = (long)0;

_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量m_pRecordset->Close();///关闭记录集

CString message;

message.Format("共有%d条记录",vCount.lVal);

AfxMessageBox(message);///显示当前记录条数

(2)利用Command对象来执行SQL命令

_CommandPtr m_pCommand;

m_pCommand.CreateInstance("https://www.doczj.com/doc/116087882.html,mand");

_variant_t vNULL;

vNULL.vt = VT_ERROR;

vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数

m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它

m_pCommand->CommandText = "SELECT * FROM users";///命令字串

m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);

//执行命令取得记录集

在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。

(3)直接用Recordset对象进行查询取得记录集,例如:

m_pRecordset->Open("SELECT * FROM users",_variant_t((IDispatch *)m_pConnection,true),

adOpenStatic,adLockOptimistic,adCmdText);

Open()方法的原型如下:

HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )

上述函数中参数Source是数据查询字符串;参数ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象);参数CursorType光标类型,它可以是以下值之一;请看这个枚举结构:

enum CursorTypeEnum

{

adOpenUnspecified = -1,///不作特别指定

adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。

adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。

adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。

};

参数LockType表示数据库的锁定类型,它可以是以下值之一,请看如下枚举结构:

enum LockTypeEnum

{

adLockUnspecified = -1,///未指定

adLockReadOnly = 1,///只读记录集

adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制

adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作

adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。

};

参数Options的含义请参考本文中对Connection对象的Execute()方法的介绍。

5、记录集的遍历、更新

根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday

以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,更改其年龄数据,保存到数据库。

_variant_t vUsername,vBirthday,vID,vOld;

_RecordsetPtr m_pRecordset;

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open("SELECT * FROM users",_variant_t((IDispatch*)m_pConnection,true),

adOpenStatic,adLockOptimistic,adCmdText);

while(!m_pRecordset->adoEOF)

///这里为什么是adoEOF而不是EOF呢?还记得rename("EOF","adoEOF")这一句吗?

{

vID = m_pRecordset->GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,你也可以直接给出列的名称;

vUsername = m_pRecordset->GetCollect("username");///取得username字段的值

vOld = m_pRecordset->GetCollect("old");

vBirthday = m_pRecordset->GetCollect("birthday");

///在DEBUG方式下的OUTPUT窗口输出记录集中的记录

if(vID.vt != VT_NULL && vUsername.vt != VT_NULL && vOld.vt != VT_NULL &&

vBirthday.vt != VT_NULL)

TRACE("id:%d,姓名:%s,年龄:%d,生

日:%srn",vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday);

m_pRecordset->MoveNext();///移到下一条记录

}

m_pRecordset->MoveFirst();///移到首条记录

m_pRecordset->Delete(adAffectCurrent);///删除当前记录

///添加三条新记录并赋值

for(int i=0;i<3;i++)

{

m_pRecordset->AddNew();///添加新记录

m_pRecordset->PutCollect("ID",_variant_t((long)(i+10)));

m_pRecordset->PutCollect("username",_variant_t("叶利钦"));

m_pRecordset->PutCollect("old",_variant_t((long)71));

m_pRecordset->PutCollect("birthday",_variant_t("1930-3-15"));

}

m_pRecordset->Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处

m_pRecordset->PutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄

m_pRecordset->Update();///保存到库中

6、关闭记录集与连接

记录集或连接都可以用Close()方法来关闭:

m_pRecordset->Close();///关闭记录集

m_pConnection->Close();///关闭连接

至此,我想读者朋友已经熟悉了ADO操作数据库的大致流程,也许您已经胸有成竹,也许您还有点胡涂,不要紧!建议你尝试写几个例子,这样会更好地熟悉ADO,最后我给大家写了一个小例子,例子实现的功能是读出所有记录并放到列表控件中,同时可以添加、删除、修改记录。

二、编程步骤

1、启动Visual C++6.0,生成一个基于对话框的应用程序,将该程序命名为ADOTest1;

2、在对话框界面上放置显示记录列表控件和添加、删除记录用的的编辑、按钮控件,具体设置参加代码中的对话框资源部分;

3、使用Class Wizard为添加、修改数据库记录的按钮添加消息响应函数;

4、添加成程序代码,编译运行程序。

三、程序代码

/////////////////////////////////////////////////// ADOTest1Dlg.h : header file #if !defined(AFX_ADOTEST1DLG_H__29B385C0_02C0_4588_A8B4_D0EFBB4F578D__INCLUDED_) #define AFX_ADOTEST1DLG_H__29B385C0_02C0_4588_A8B4_D0EFBB4F578D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CADOTest1Dlg : public CDialog

{

// Construction

public:

BOOL m_bAutoSave;

void SaveData();

void LoadData();

_variant_t vUserID,vUsername,vOld,vBirthday;

BOOL m_bSuccess;

int m_nCurrentSel;

_RecordsetPtr m_pRecordset;

CADOTest1Dlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CADOTest1Dlg)

enum { IDD = IDD_ADOTEST1_DIALOG };

CButton m_cDelItem;

CButton m_cAddItem;

CListCtrl m_userlist;

UINT m_nUserID;

UINT m_nOld;

CString m_sUsername;

COleDateTime m_tBirthday;

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CADOTest1Dlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

HICON m_hIcon;

// Generated message map functions

//{{AFX_MSG(CADOTest1Dlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

virtual void OnOK();

afx_msg void OnAdditem();

afx_msg void OnDelitem();

afx_msg void OnItemchangedUserlist(NMHDR* pNMHDR, LRESULT* pResult);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

#endif

////////////////////////////////////////////////////// ADOTest1Dlg.cpp : implementation file #include "stdafx.h"

#include "ADOTest1.h"

#include "ADOTest1Dlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

extern CADOTest1App theApp;

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

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

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

: CDialog(CADOTest1Dlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CADOTest1Dlg)

m_nUserID = 0;

m_nOld = 0;

m_sUsername = _T("");

m_tBirthday = COleDateTime::GetCurrentTime();

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

m_nCurrentSel = -1;

m_bSuccess = FALSE;

m_bAutoSave = TRUE;

}

void CADOTest1Dlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CADOTest1Dlg)

DDX_Control(pDX, IDC_DELITEM, m_cDelItem);

DDX_Control(pDX, IDC_ADDITEM, m_cAddItem);

DDX_Control(pDX, IDC_USERLIST, m_userlist);

DDX_Text(pDX, IDC_USERID, m_nUserID);

DDX_Text(pDX, IDC_OLD, m_nOld);

DDX_Text(pDX, IDC_USERNAME, m_sUsername);

DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER1, m_tBirthday);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CADOTest1Dlg, CDialog)

//{{AFX_MSG_MAP(CADOTest1Dlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_ADDITEM, OnAdditem)

ON_BN_CLICKED(IDC_DELITEM, OnDelitem)

ON_NOTIFY(LVN_ITEMCHANGED, IDC_USERLIST, OnItemchangedUserlist) //}}AFX_MSG_MAP

END_MESSAGE_MAP()

BOOL CADOTest1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

m_cDelItem.EnableWindow(FALSE);

::SendMessage(m_userlist.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

//////////为列表控件添加列//////////

m_userlist.InsertColumn(0,"用户ID",LVCFMT_LEFT,60);

m_userlist.InsertColumn(1,"用户名",LVCFMT_LEFT,100);

m_userlist.InsertColumn(2,"年龄",LVCFMT_LEFT,60);

m_userlist.InsertColumn(3,"生日",LVCFMT_LEFT,100);

//////////读取数据库中的信息添加到列表控件///////////

int nItem;

_variant_t vUsername,vBirthday,vID,vOld;

try

{

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open("SELECT*FROM users",

_variant_t((IDispatch*)theApp.m_pConnection,true), adOpenStatic,adLockOptimistic,adCmdText);

m_bSuccess = TRUE;

while(!m_pRecordset->adoEOF)

{

vID = m_pRecordset->GetCollect("ID");

vUsername = m_pRecordset->GetCollect("username");

vOld = m_pRecordset->GetCollect("old");

vBirthday = m_pRecordset->GetCollect("birthday");

nItem=m_userlist.InsertItem(0xffff,(_bstr_t)vID);

m_userlist.SetItem(nItem,1,1,(_bstr_t)vUsername,NULL,0,0,0);

m_userlist.SetItem(nItem,2,1,(_bstr_t)vOld,NULL,0,0,0);

m_userlist.SetItem(nItem,3,1,(_bstr_t)vBirthday,NULL,0,0,0);

m_pRecordset->MoveNext();

}

}

catch(_com_error e)///捕捉异常

{

AfxMessageBox("读取数据库失败!");///显示错误信息

}

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);

}

}

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

return TRUE; // return TRUE unless you set the focus to a control }

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

{

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

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

void CADOTest1Dlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (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();

}

}

HCURSOR CADOTest1Dlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CADOTest1Dlg::OnOK()

{

if(m_bSuccess)

{

m_pRecordset->Update();

m_pRecordset->Close();

}

CDialog::OnOK();

}

void CADOTest1Dlg::OnAdditem()

{

if(UpdateData())

if(m_sUsername.GetLength()>0)

{

m_pRecordset->AddNew();

m_nCurrentSel = m_userlist.InsertItem(0xffff,"");

SaveData();///保存数据

m_userlist.SetItemState(m_nCurrentSel,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

m_userlist.SetHotItem(m_nCurrentSel);

m_userlist.SetFocus();

}

else

AfxMessageBox("请输入用户名");

}

void CADOTest1Dlg::OnDelitem()

{

m_bAutoSave = FALSE;

if(m_nCurrentSel >= 0)

{

m_userlist.DeleteItem(m_nCurrentSel);

int count = m_userlist.GetItemCount();

if(count <= m_nCurrentSel)

m_nCurrentSel = count-1;

m_pRecordset->Delete(adAffectCurrent);

m_pRecordset->MoveNext();

LoadData();

m_userlist.SetItemState(m_nCurrentSel,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

m_userlist.SetFocus();

}

m_bAutoSave = TRUE;

}

//////////在选择列表框的时候调用///////////////////

void CADOTest1Dlg::OnItemchangedUserlist(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

if(pNMListView->uNewState&LVIS_SELECTED)

{

UpdateData();

SaveData();///保存旧数据

m_nCurrentSel = pNMListView->iItem;

LoadData();///加载新数据

m_cDelItem.EnableWindow();

}

*pResult = 0;

}

//////将记录集中的数据加载到编辑框/////

void CADOTest1Dlg::LoadData()

{

m_pRecordset->Move(m_nCurrentSel,_variant_t((long)adBookmarkFirst));

vUserID = m_pRecordset->GetCollect("ID");

vUsername = m_pRecordset->GetCollect("username");

vOld = m_pRecordset->GetCollect("old");

vBirthday = m_pRecordset->GetCollect("birthday");

m_nUserID = vUserID.lVal;

m_sUsername = (LPCTSTR)(_bstr_t)vUsername;

m_nOld = vOld.lVal;

m_tBirthday = vBirthday;

UpdateData(FALSE);

}

/////将编辑框的数据保存到记录集与列表框

void CADOTest1Dlg::SaveData()

{

if(!m_pRecordset->adoEOF && m_nCurrentSel >= 0 && m_bAutoSave)

{

vUserID = (long)m_nUserID;

vUsername = m_sUsername;

vOld = (long)m_nOld;

vBirthday = m_tBirthday;

m_pRecordset->PutCollect("ID",vUserID);

m_pRecordset->PutCollect("username",vUsername);

m_pRecordset->PutCollect("old",vOld);

m_pRecordset->PutCollect("birthday",vBirthday);

_userlist.SetItem(m_nCurrentSel,0,LVIF_TEXT,(_bstr_t)vUserID,NULL,0,0,0);

m_userlist.SetItem(m_nCurrentSel,1,LVIF_TEXT,(_bstr_t)vUsername,NULL,0,0,0);

m_userlist.SetItem(m_nCurrentSel,2,LVIF_TEXT,(_bstr_t)vOld,NULL,0,0,0);

m_userlist.SetItem(m_nCurrentSel,3,LVIF_TEXT,(_bstr_t)vBirthday,NULL,0,0,0);

}

}

////////////////////////////////////////////////////////////////////////

BOOL CADOTest1App::InitInstance()

{

AfxEnableControlContainer();

AfxOleInit();///初始化COM库

HRESULT hr; ////////////连接数据库//////////////

try

{

hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象if(SUCCEEDED(hr))

{

hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;

Data Source=test.mdb","","",adModeUnknown);///连接数据库

///上面一句中连接字串中的Provider是针对ACCESS2000环境的,

/////对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }

}

}

catch(_com_error e)///捕捉异常

{

CString errormessage;

errormessage.Format("连接数据库失败!rn错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);///显示错误信息

return FALSE;

}

#ifdef _AFXDLL

Enable3dControls(); // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic(); // Call this when linking to MFC statically

#endif

CADOTest1Dlg dlg;

m_pMainWnd = &dlg;

int nResponse = dlg.DoModal();

if (nResponse == IDOK)

{}

else if (nResponse == IDCANCEL)

{}

return FALSE;

}

/////////////////////////////////////////////

int CADOTest1App::ExitInstance()

{

if(m_pConnection->State)

m_pConnection->Close(); ///如果已经打开了连接则关闭它

return CWinApp::ExitInstance();

}

四、小结

限于篇幅ADO中的许多内容还没有介绍,如绑定方式处理记录集数据、存储过程的调用、事务处理、图象在数据库中的保存与读取、与表格控件的配合使用等。如果读者对上述内容感性认识的话,可以自行参考相关编程资料。

CListCtrl基本用法

CListCtrl是列表控件类,列表控件的每一行叫做一个item,每一列叫做一个subitem。每一行和每一列都有个ID号,可以确定唯一的单元格。

最近使用了这个控件,有心得总结如下:(Dialog模式)

1. 创建列表控件.

定义一个成员变量:CListCtrl *m_pListCtrl;

在初始化对话框的时候创建列表,也就是在OnInitDialog()中创建(在哪里创建没有规定,只要符合对象和资源创建的规则即可。)

m_pListCtrl=new CListCtrl();

m_pListCtrl->Create();

m_pListCtrl->SetExtendedStyle();

Create函数有四个参数,DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID 。第一个参数可以是一些值的组合,用来定义列表的样式,这些值MSDN有详细说明,我只举一个简单的例子,更多的查看MSDN。例如第一个参数使用LVS_REPORT,则表示列表有标题,或者说有列头,很多其他的样式必须是和这个样式搭配使用才有效。第二个参数是列表的坐标和大小,这个矩形框就表示列表的矩形框。第三个参数表示这个列表的父类,如果列表在对话框上或者是在试图上,这个参数可以是this。第四个参数是列表的资源号。

SetExtendedStyle函数只有一个参数,是一些值的组合,用来设置列表的扩展样式,这些值MSDN有详细的说明,我只介绍两个比较常用的。 LVS_EX_GRIDLINES :列表显示网格,只适用于LVS_REPORT 风格。

LVS_EX_FULLROWSELECT:当一个item被选中时,它的所有subitems也处于被选中状态,点击任意一个subitem,则可同时选中整个行. 只适用于LVS_REPORT 风格。

2.构建列表

构建列表也就是两个操作,插入列和插入行,前面说过,一个列就是一个subitem,一行就是一个item。

m_pListCtrl->InsertColumn(0,"第一列");

列索引从0开始,InsertColumn函数将在列表中建立一个列,如果数据有三列,就调用三次此函数,索引分别是0,1,2。

m_pListCtrl->InsertItem(0,"第一行");

行索引也从0开始,InsertItem函数在列表中建立一行,且“第一行”的字样显示在的一列中,其他各列为空,如果要在除第一列以外的列中插入数据,调用SetItemText()函数,这个函数有三个参数,第一个参数表示要在第几行插入,第二个参数表示要在第几列插入,第三个参数表示要插入的内容。

可以设定列宽:

LVCOLUMN lvcolumn;

m_pListCtrl->GetColumn(0,&lvcolumn);

lvcolumn.mask=LVCF_WIDTH;

lvcolumn.cx=335;

m_pListCtrl->SetColumn(0,&lvcolumn);

表示将列宽设定为335像素。

3.操作列表

这里主要介绍一个比较有用的函数SubItemHitTest()

当鼠标停留在列表框上时,此函数会返回鼠标所在的行号,和鼠标所在的列号。

LVHITTESTINFO linfo;

DWORD dwPos = GetMessagePos();

CPoint point(LOWORD(dwPos),HIWORD(dwPos));

m_pListCtrl->ScreenToClient(&point);

linfo.pt=point;

linfo.flags=LVHT_ABOVE;

int iItem=m_pListCtrl->SubItemHitTest(&linfo);

行号保存在linfo.iItem中,列号保存在linfo.iSubItem中,此时可以调用GetItemText()函数获得这个单元格的内容了。

这个方法常用在列表的NM_CLICK和NM_DBLCLK事件中。

此类消息为:

ON_NOTIFY(NM_CLICK, IDC, OnFun)

函数原型:

void OnFun(NMHDR *pNMHDR, LRESULT *pResult)

{

*pResult = 0;

}

4.列表中的CheckBox

列表有多中风格,带CheckBox是其中常见的一种,设置这种风格的列表只需要在调用SetExtendedStyle函数的时候设置LVS_EX_CHECKBOXES。对CheckBox最常见的操作就是选中和取消,可能是我的知识贫乏,到目前,我还没有找到专门的消息处理这两个操作。要处理这样的操作,我使用下面的方法。

响应列表的NM_CLICK消息,在这个消息处理函数中,判断鼠标点击的位置是文本还是CheckBox,代码如下: UINT nFlag;

DWORD dwPos = GetMessagePos();

CPoint point(LOWORD(dwPos),HIWORD(dwPos));

m_pList1->ScreenToClient(&point);

m_pList1->HitTest ( point , &nFlag ) ;

如果nFlag==LVHT_ONITEMSTATEICON ,说明鼠标点中了CheckBox。本可以调用GetCheck函数来获得CheckBox的状态,但是很可惜,CheckBox的状态似乎是在NM_CLICK消息函数结束以后才会改变。所以,在

NM_CLICK的消息处理函数中获得CheckBox的状态是没有改变之前的。

还有一点需要注意,假设现在目前CheckBox的状态是选中,那么,当你点击两下鼠标的时候,CheckBox还是选中状态,而且NM_CLICK消息处理函数被执行了两次,所以,结果是正确的。但是当你点击两下鼠标时速度比较快,那么系统会把两次单击鼠标看作一次双击,这样,NM_CLICK的消息处理函数只会执行一次,但是,注意但是,CheckBox的状态却改变了两次。因此,这个时候你看到的CheckBox的状态和程序的结果就相反了。要解决这个问题,就需要在NM_DBLCLK的消息函数中做相应的工作。

以上若有不足之处,希望各位高手指正。

2009/04/01补充:

禁止列表头调整大小,需要派生一个CListCtrl类,重载一下函数为:

BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)

{

HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam;

switch (((NMHDR*)lParam)->code)

{

case HDN_BEGINTRACKW:

case HDN_BEGINTRACKA:

case HDN_DIVIDERDBLCLICKA:

case HDN_DIVIDERDBLCLICKW:

*pResult = TRUE; // disable tracking

return TRUE;

}

return CListCtrl::OnNotify(wParam, lParam, pResult);

}

ClistCtrl的SetItemText函数不能显示数据

最近学习MFC编程,与access打交道,初步想实现有表中读取数据中的内容,采用SetItemText函数,原来代码为:

while(!m_recordset.IsEOF())

{

int temp=0;

m_recordset.GetFieldValue(temp,varValue);

m_content.SetItemText(i_,0,varValue.m_pstring->GetBuffer(1));

if(!m_content.SetItemText(i,0,varValue.m_pstring->GetBuffer(1)))

MessageBox("插入数据失败!");

m_recordset.GetFieldValue(1,varValue);

m_content.SetItemText(i_,1,varValue.m_pstring->GetBuffer(1));

m_recordset.MoveNext();

i_++;

}

但在clistctr控件中的m_content.InsertColumn()又能显示,调试跟踪,可以读取到数据库中的字符串,但就是数据无法显示,后来在网上查了许多资料才知道:每一列的第一个数据要用InsertItem()插入,修改代码如下,实现了数据显示功能。

int i_=0;

while(!m_recordset.IsEOF())

{

int temp=0;

m_recordset.GetFieldValue(temp,varValue);

m_content.SetItemText(i_,0,varValue.m_pstring->GetBuffer(1));

m_content.InsertItem(i_,varValue.m_pstring->GetBuffer(1));

if(!m_content.SetItemText(i,0,varValue.m_pstring->GetBuffer(1)))

MessageBox("插入数据失败!");

m_recordset.GetFieldValue(1,varValue);

m_content.SetItemText(i_,1,varValue.m_pstring->GetBuffer(1));

m_recordset.MoveNext();

i_++;

另外如果InsertColumn()中的内容也没显示出来,即列表框中空白什么都没有,那么先把clistctr的VIEW 属性设置为report。

vc++中使用ado方式操作access数据库

vc++中使用ado方式操作access数据库ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO、RDO都要容易使用,并不失灵活性。本文详细地介绍在Visual C++开发环境下如何使用ADO来进行数据库应用程序开发,并给出示例代码。为了使读者朋友都能测试本例提供的代码,我们采用Access数据库,您可以直接在我们提供的示例代码中找到这个test.mdb。程序编译运行后的效果如图一所示 图一、ADO操作ACESS数据库的界面效果图 一、实现方法 万事开头难,任何一种新技术对于初学者来说最重要的还是"入门",掌握其要点。让我们来看看ADO数据库开发的基本流程吧!它的基本步骤如下: (1)初始化COM库,引入ADO库定义文件 (2)用Connection对象连接数据库 (3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。 (4)使用完毕后关闭连接释放对象。 下面我们将详细介绍上述步骤并给出相关代码。 1、COM库的初始化 我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码: BOOL CADOTest1App::InitInstance() { AfxOleInit(); ...... } 2、用#import指令引入ADO类型库 为了引入ADO类型库,需要在项目的stdafx.h文件中加入如下语句:

实验一ACCESS数据库及表的操作

可编辑可修改 实验一数据库及表的操作 实验类型:验证性实验课时:_6_学时指导教师: _______________ 时间:2013年月日课次:第___________________ 节教学周次:第________ 周 实验分室:_______________ 实验台号:__________ 实验员:_________________ 一、实验目的 1.掌握数据库的创建及其它简单操作 2.熟练掌握数据表建立、数据表维护、数据表的操作 二、实验内容与要求 1.数据库的创建、打开、关闭 2.数据表的创建:建立表结构、设置字段属性、建立表之间关系、数据的输入 3.数据表维护:打开表、关闭表、调整表外观、修改表结构、编辑表内容 4?数据表的操作:查找替换数据、排序记录、筛选记录 三、实验步骤 案例一:创建数据库 1.创建空数据库 要求:建立“教学管理.accdb ”数据库,并将建好的数据库文件保存在“实验一”文件夹中。 操作步骤:

IS 1 丿小? e 叮亍 Micrtilitil ftfdwvi 口 可审业 a 站 j-t 4审时 OffiCfLC WF gm ■ *陆 (2)单击険'I 按钮,在打开的“新建数据库”对话框中,选择数据库的保存位置,在“ 件夹中,单击“确定”按钮,如图 1-2所示。 (3)这时返回到access 启动界面,显示将要创建的数据库的名称和保存位置,如果用户未提供文件 扩展名,access 将自动添加上。 (4 )在右侧窗格下面,单击“创建”命令按钮,如图 1-1所示。 (5)这时开始创建空白数据库,自动创建了一个名称为表 1的数据表,并以数据表视图方式打开这 个表1,如图1-3所示。 J 曰归 图1-1 创建教学管理数据库 (1 )在Access 2010启动窗口中,在中间窗格的上方,单击“空数据库” ,在右侧窗格的文件名文本 框中,给出一个默认的文件名“” 。把它修改为“教学管理”如图 1-1所示。 实验一”文

Access数据库程序设计试题大全

1、Access数据库是(B )。 A.层次型数据库 B.关系型数据库 C.网状型数据库 D.杂合型数据库 2、在Access数据库中,数据保存在(D )对象中。 A.窗体B.查询 C.报表D.表 3、数据库文件中至少包含有(A )对象。 A.表B.窗体 C.查询D.其余三种 4、在Access数据库系统中,不能建立索引的数据类型是(C )。 A.文本型B.数字型 C.备注型D.日期/时间型 5、如果字段内容为声音文件,可将此字段定义为(C )类型。 A.文本 B.查询向导 C.OLE对象 D.备注 6、在表设计视图中,如果要限定数据的输人格式,应修改字段的(C )属性。 A.格式B.有效性规则 C.输入格式D.字段大小 7、下面有关主键的叙述正确的是(B )。 A.不同的记录可以具有重复的主键值或空值 B.一个表中的主键可以是一个或多个字段 C.在一个表中的主键只可以是一个字段 D.表中的主键的数据类型必须定义为自动编号或文本 8、下面有关表的叙述中错误的是(C )。 A.表是Access数据库中的要素之一 B.表设计的主要工作是设计表的结构 C.Access数据库的各表之间相互独立 D.可以将其他数据库的表导人到当前数据库中 9、Access是(A )办公套件中的一个重要组成部分。 A.Office B.Word C.Excel D.Lotus 10、下列(B )图标是Access的标志。 11、存储在计算机内按一定的结构和规则组织起来的相关数据的集合称为(C )。

A.数据库管理系统B.数据库系统 C.数据库D.数据结构 12、数据的完整性,是指存贮在数据库中的数据要在一定意义下确保是(B )。 A.一致的B.正确的、一致的 C.正确的D.规范化的 13、不能退出Access2003的方法是(C )。 A.选择Access2003屏幕“文件”菜单的“退出”命令 B.选择Access2003控制菜单中的“关闭”命令 C.利用快捷键+ D.利用快捷键+ 14、关系数据库是以(C )的形式组织和存放数据的。 A.一条链B.一维表 C.二维表D.一个表格 15:以下有关数据基本表的叙述,(D )是正确的。 A.每个表的记录与实体可以以一对多的形式出现 B.每个表的关键字只能是一个字段 C.在表内可以定义一个或多个索引,以便于与其他表建立关系 D.每个表都要有关键字以使表中的记录惟一 16、在Access2000中一个数据库的所有对象都存放在一个文件中,该文件的扩展名是(B )。 A..DBC B..MDB C..DBM D..DBF 17、表是数据库的核心与基础,它存放着数据库的(A )。 A.全部数据B.部分数据 C.全部对象D.全部数据结构 18、建立Access2003数据库时要创建一系列的对象,其中最重要的是创建(C )。 A.报表B.基本表 C.基本表之间的关系D.查询 19、Access2003屏幕的主菜单的菜单项是(C )。 A.基本上都有自己的子菜单 B.会根据执行的命令而有所增添或减少 C.可被利用来执行Access的几乎所有命令的 D.以上全部是正确的 20、在Access数据库窗口使用表设计器创建表的步骤依次是(A )。 A.打开表设计器、定义字段、设定主关键字、设定字段属性和表的存储 B.打开表设计器、设定主关键字、定义字段、设定字段属性和表的存储 C.打开表设计器、定义字段、设定字段的属性、表的存储和设定主关键字 D.打开表设计器、设定字段的属性、表的存储、定义字段和设定主关键字 21、在表设计器的设计视图的上半部分的表格用于设计表中的字段。表格的每一行均由四部分

Access数据库应用基础教程(第三版)习题及答案

Access数据库应用基础教程(第三版)习题集答案 第1章数据库系统概述 1. 什么是数据库?什么是数据库系统?答:数据库(database)是存放数据的仓库,严格的讲,数据库是长期存储在计算机内,有组织的,可共享的大量数据集合。 数据库系统(database systems),是由数据库及其管理软件组成的系统。它是为适应数据处理的需要而发展起来的一种较为理想的数据处理的核心机构。它是一个实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。 2. 什么是数据库管理系统?它有哪些主要功能? 答:数据库管理系统(database management system)是一种操纵和管理数据

库的大型软件,用于建立、使用和维护数据库,简称dbms。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。数据库管理系统的主要功能有:数据定义、数据操作、数据库的运行管理、数据组织、数据库的保护、数据库的维护和通信。 3. 说出几种常用的数据模型。 答:层次模型、网状模型、关系模型。4. 什么是关系模型? 答:关系模型是用二维表的形式表示实体和实体间联系的数据模型。 5. 简述数据库设计的步骤。 答:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库的建立和测试、数据库运行和维护。 第2章 SQL 语言简介 1. 什么是SQL语言?SQL语言具有哪些特点和功能? 答:SQL是一种数据库查询和程序设计语言,用于存取数据以及查询更新和管理关系

数据库系统。 SQL的特点和功能有:查询,操作,定义和控制四个方面,SQL语言具有高度的非过程化,语言简洁,语义明显,语法结构简单,直观易懂的特点。SQL语言即可以作为独立语言使用,用户可以在终端键盘上直接键入SQL命令对数据库进行操作,也可以作为嵌入式语言,嵌入到其他高级语言中。 2. SQL语言包含哪几个部分? 答:SQL语言包含4个部分:数据定义语言(DDL-Data Definition Language)、数据查询语言(DQL-Data Query Language)、数据操纵语言(DML-Data Manipulation Language)、数据控制语言(DCL-Data Control Language) 3. 在联接查询中,包含哪几类联接?答:联接可分为3类: (1)内部联接(典型的联接运算,使用类似于 = 或 <> 的比较运算符)。内部联接使用比较运算符根据每个表的通用列中的值匹配两个表中的行。内部联接包括同等

直接通过ADO操作ACCESS数据库

准备工作 (1)、引入ADO类 (2)、初始化COM (3)#import 包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr 1.连接和关闭数据库 (1)连接 (2)、关闭

(3)、设置连接时间 2.打开一个结果集 (1)打开,首先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果 (2)关闭结果集 3.操作一个结果集 (1)、遍历(读取) a)、用pRecordset->adoEOF来判断数据库指针是否已经移到结果集的末尾了;m_pRecordset->BOF判断是否在第一条记录前面:

b)、取得一个字段的值的办法有两种办法 一是 二是 (2)、添加 1.调用m_pRecordset->AddNew(); 2.调用m_pRecordset->PutCollect();给每个字段赋值 3.调用m_pRecordset->Update();确认 (3)、修改 (4)、删除 a)、把记录指针移动到要删除的记录上,然后调用 4.直接执行SQL语句,除了要用到结果集其余的大部分功能都可以直接用SQL 语言实现 (1)、用_CommandPtr和_RecordsetPtr配合

(2)、直接用_ConnectionPtr执行SQL语句 其中CommandText是命令字串,通常是SQL命令。 参数RecordsAffected是操作完成后所影响的行数, 参数Options表示CommandText中内容的类型,Options可以取如下值之一: ?adCmdText:表明CommandText是文本命令 ?adCmdTable:表明CommandText是一个表名 ?adCmdProc:表明CommandText是一个存储过程 ?adCmdUnknown:未知 5.调用存储过程 (1)、利用_CommandPtr (2)、直接用_ConnectionPtr直接调用(见4.(2)) 6.遍历数据库中的所有表名

Access上机操作题——报表操作

Access上机操作题之二十 ——创建报表㈠ 一、使用工具栏中“新对象:自动报表”按钮创建纵栏式报表: ●创建“学生”表的纵栏式报表,其操作步骤如下: ①打开“教学”数据库,选择“表”对象。 ②选择“学生”数据表。 ③单击工具栏中的“新对象:自动报表”按钮,选择“自动报表”选项。 ④保存此报表。 ●窗体转换为报表: 将“教学”数据库中的“学生”窗体转换为报表。其操作步骤如下: ①打开“教学”数据库,选择“窗体”对象。 ②右击“学生”窗体名,选择“另存为”命令。 ③在“另存为”对话框中的“保存类型”下拉按钮中,选择“报表”选项。 ④单击“确定”按钮。 ●学生操作训练 ⑴创建“课程”表的纵栏式报表。 ⑵创建“成绩”表的纵栏式报表。 ⑶在“职工基本情况”数据库中,创建一个基于“职工”数据表的窗体,然后再将转换为报表。 二、使用向导创建单表报表: 1、自动创建纵栏式报表: ⑴根据“学生”表创建纵栏式报表,其操作步骤如下: ①选择“插入”菜单中的“报表”命令,或选择“报表”对象后,再单击“新建”按钮。 ②选择“自动创建报表:纵栏式”选项,并选择数据来源为“学生”表后,单击“确定”按钮。 ③保存此报表。 注:自动创建表格式报表和数据表式报表的操作方法同此相似。 学生操作训练: ⑵根据“课程”表,分别创建一个纵栏式、表格式报表。 ⑶根据“成绩”表,分别创建一个纵栏式、表格式报表。 2、使用“报表向导”创建报表: ⑴使用“报表向导”建立一个基于“学生”表中“学号、姓名、性别、出生日期”等字段的简单报表。其操作步骤如下: ①选择“报表”对象,双击“使用向导创建报表”选项。 ②在“表/查询”下拉列表中选择报表的数据来源——“学生”表,然后选择在报表中要显示的字段名:学号、姓名、性别、出生日期等,最后单击“下一步”按钮。 ③设置分组:确定是否添加分组级别。暂时不添加,则直接单击“下一步”按钮。 ④设置记录的排序次序。暂时不设置排序,则直接单击“下一步”按钮。

ACCESS数据库的基本操作

ACCESS数据库的基本操作 一、建立数据库 ACCESS数据库是一个独立的文件,其扩展名为.MDB。它所包含的对象:表(Table) 、查询(Query) 、窗体、报表、数据访问页、宏、模块等。 一个数据库可以拥有多个表、多个查询及多个其它对象,而表是整个数据库的基础。 创建数据库的二种方式: 1.启动Access 2002时创建数据库 “开始,程序,Microsoft access”→“空access 数据库”→指定保存位置和文件名 2.进入Access 2002后创建数据库 “文件,新建”→“常用”选项卡上选择“数据库”→指定保存位置和文件名→“创建” 二、建立表 创建表的三种方式: 1. 使用表设计器创建表结构 2. 使用“表向导”(利用示例表)创建表结构 3. 通过输入数据直接创建表结构和记录

重点掌握:使用表设计器 创建表的步骤: 1、设计表结构 数据库窗口“表”面板→双击“使用设计器创建表”→打开“设计视图”→设计表结构→“关闭”设计视图→输入表名。 2、输入表记录 双击表名打开“数据表视图”→输入表记录→“关闭”数据表视图。 关于表的说明: 1)表的三要素:表名、记录(行)、字段(列) 2)表的定义项:表名、字段名、字段数据类型、字段属性和表的主关键字。表的可选定义项:字段说明、表的属性。 3)表的命名:字母、汉字、数字、空格和除了句号、叹号、方括号等字符以外字符的任何组合。(在同一个数据库中,表名不能重复) 关于字段的说明: 1)字段名:每一个字段都必须有一个唯一的名字。 ①字段名长度不超过64个字符。 ②字段名可以包含字母、汉字、数字、空格(但空格不能为首字符), 还可以包含大部分标点符号。 ③字段名不能出现句号(。)、叹号(!)、方括号([ ])。 ④在同一张表中,字段名不能重复使用。

access数据库基础及应用课后习题答案.

习题一 一.选择题 1.在下列四个选项中,不属于 ...基本关系运算的是(排序)。 A. 连接 B. 投影 C. 选择 D. 排序 2.一辆汽车由多个零部件组成,且相同的零部件可适用于不同型号的汽车,则汽车实体集与零部件实体集之间的联系是(多对多)。 A. 多对多 B. 一对多 C. 多对一 D. 一对一 3.为了合理组织数据,在设计数据库中的表时,应遵从的设计原则是(以上各原则都包括)。 A. “一事一地”原则,即一个表描述一个实体或实体间的一种联系。 B. 表中的字段必须是原始数据的基本数据元素,并避免在表中出现重复字段。 C. 用外部关键字保证有关联的表之间的联系。 D. 以上各原则都包括。 4.数据库类型是根据(数据模型)划分的。 A. 数据模型 B. 文件形式 C. 记录形式 D. 存取数据方法 5.DBMS是(操作系统支持下的系统软件)。 A. 操作系统的一部分 B. 操作系统支持下的系统软件 C. 一种编译程序 D. 一种操作系统 6.在关系型数据库管理系统中,查找满足一定条件的元组的运算称为(选择)。 A. 查询 B. 选择 C. 投影 D. 联接

7. 如果要改变一个关系中属性的排列顺序,应使用的关系运算是(投影)。 A. 选择 B. 投影 C. 连接 D. 重建 8. 从关系表中,通过关键字挑选出相关表指定的属性组成新的表的运算称为(“连接”运算)。 A.“选择”运算 B.“投影”运算 C.“连接”运算 D.“交”运算 9.数据库DB、数据库系统DBMS和数据库管理系统DBS三者之间的关系是(DBS包括DB和DBMS)。 A. DB包括DBMS和DBS B. DBS包括DB和DBMS C. DBMS包括DBS和DB D. DBS与DB和DBMS无关 10.数据库系统与文件系统管理数据时的主要区别之一是(B)。 A.文件系统能实现数据共享,而数据库系统却不能。 B.文件系统不能解决数据冗余和数据独立性问题,而数据库系统可以解决。 C.文件系统只能管理程序文件,而数据库系统能够管理各种类型的文件。 D.文件系统管理的数据量庞大,而数据库系统管理的数据量较少。 二.填空题 1.从层次角度看,数据库管理系统是位于用户与OS之间的一 层数据管理软件。 2.用二维表数据来表示实体及实体之间联系的数据模型称为关系模型。 3.两个实体集之间的联系方式有1:1、1:n和m:n 。 4.关系模型是用若干个二维表来表示实体及其联系,关系通过关 系名和属性名来定义。关系的每一行是一个元组,表示一个实体;每一列 是记录中的一个数据项,表示实体的一个属性。 5.在关系数据库中,一个二维表中垂直方向的列称为属性,在表文件中叫

VisualStudio2017中使用ADO访问数据库的实例

Visual Studio 2017 使用ADO访问数据库的实例 Visual Studio 2017 version 以Visual Studio 2015 和后续的Microsoft Visual Studio 更新中的进展为基础构建而成,为开发团队

提供需要的解决方案,使其接纳这种转变并开发和交付利用下一波Windows 平台创新(Windows 10) 的新式应用程序,同时在所有Microsoft 平台上支持多种设备和服务。 支持Windows 10 App 开发 敏捷项目管理(Agile Portfolio Management) 版本控制 轻量代码注释(lightweight code commenting) 编程过程 Visual Studio 2017 预览版提供的工具集非常适合生成利用下一波Windows 平台创新(Windows 10) 的新式应用程序,同时在所有Microsoft 平台上支持设备和服务。支持在Windows 10 中开发Windows 应用商店应用程序,具体表现在对工具、控件和模板进行了许多更新、对于XAML 应用程序支持新近提出的编码UI 测试、用于XAML 和HTML 应用程序的UI 响应能力分析器和能耗探查器、增强了用于HTML 应用程序的内存探查工具以及改进了与Windows 应用商店的集成。

Visual Studio 2017 预览版进行了大量改进,可帮助您在编码时提高工作效率并集中精力。某些功能首先在Visual Studio Power Tools 扩展中以试验性质出现,经过改进后才纳入到Visual Studio 中。新版本中内置了多种提高工作效率的功能,如自动补全方括号、使用快捷键移动整行或整块的代码以及行内导航。此外,Visual Studio 2017 预览版的团队资源管理器增强了主页设计,可以更简便地导航到团队协作功能,并可取消停靠“挂起更改”和“生成”,使其显示在一个单独的窗口中。 在处理大型代码文件时,可能难以了解当前所处的位置。在Visual Studio 2017 预览版中,可轻松地在两种模式之间切换滚动条的行为。在栏模式中,可更直接地查看脱字号位置等注释、更改所在位置和跟踪错误。在图模式下,滚动条显示源代码的实时预览,而将鼠标悬停

数据库上机操作题

Access 上机操作题(共5题,3分/题) 数据库上机操作题 1. 建立学生管理数据库,添加相应数据库表,并建立表间关系 (1)打开Access2010,建立“学生管理”数据库,并添加三个表,分别是Student、Course 和Grade。 Student Grade

(2)在Student表中以“学号”建立主键,在Course表中以“课程号”建立主键 (3)以Student与Grad表按“学号”字段建立关系,以Grad表“课程编号”字段与Course 表中“课程号”字段建立关系。 2. 根据已有学生数据库建立简单查询 (1)按照操作题1中的Student、Course和Grade三个表,建立综合查询,要求包括三个表中无重复的所有字段,并将查询结果存到新表stud中。 (2)按照学号建立参数查询,查询学号是12102105学生的基本情况和选课情况。 (3)按照分数的降序排列显示学生所有信息。 (4)将学生成绩表的Grage成绩按80%修改。 3. 基于已有的学生管理数据库,建立高级查询 (1)创建一个选择查询,查询并显示学生的平均分数,所在班级名称。 (2)显示所有分数高于80分的学生姓名所有信息。 (3)创建一个选择查询,查询开课时间在2013年中121021班级学生的选课情况。 (4)在Grade表中添加“等级”字段,将成绩在80分或以上的学生在等级字段中添加“优良”标识。 4. 建立学生基本情况及成绩情况窗体 (1)基于建立的学生管理数据库,按照性别添加照片字段数据(有照片文件夹) (2)利用自动创建窗体,所建窗体命名为“学生基本信息”; (3)利用窗体设计修改窗体,调整窗体位置,添加背景图片(有图片文件) (4)添加4个导航按钮,分别指向“下一项记录”、“前一项记录”、“最后一记录”和

Access入门教程大全

Access教程第一章Access数据库基础 ◆数据库基础知识及关系数据库管理系统。 ◆Access 2003 中文版介绍。 数据库技术产生于60年代末、70年代初,它的出现使计算机应用进入了一个新的时期——社会的每一个领域都与计算机应用发生了联系。数据库是计算机的最重要的技术之一,是计算机软件的一个独立分支,数据库是建立管理信息系统的核心技术,当数据库与网络通信技术、多媒体技术结合在一起时,计算机应用将无所不在,无所不能。 作为本课程学习的开始,我们首先要了解的是:什么是数据库?什么是数据库管理系统?什么是Access呢? 一、数据库的基本知识 1.什么是数据库 数据库这个词有多种解释,简单的定义是这样的:数据库(DataBase)是结构化数据的集合。 从广义上讲,数据库就是数据或信息的集合,相当于一个数据仓库。具体来说,数据库是一组经过计算机整理后的数据,在关系数据库中,它由许多数据表组成。 David M.Kroenke关于数据库的定义是:数据库是指自描述的完整记录的集合。它表达了三层含义: ⑴数据库是自描述的。 数据库除了包含用户的源数据以外,还包含关于它本身结构的描述,这个描述称作数据词典(或数据目录、元数据)。从这个意义上讲,数据库与作为一个自描述的书的集合的图书馆相似:除了书籍以外,图书馆还包含一个描述它们的卡片目录。 ⑵数据库是集成记录的集合。 数据的标准结构如下:位—> 字节—> 域—> 记录—> 文件, 按这种模式说,文件组合成数据库是非常诱人的,但却无法深入,数据库将包含四种数据:用户数据文件、元数据、索引、应用元数据。 用户数据大多表示为表格,称之为数据表,它存放了用户的各种有用资料和数据。例如: 元数据是关于用户数据的结构的描述,称之为系统表。例如:

VC++使用ADO开发ACCESS数据库

VC++使用ADO开发ACCESS数据库 本文通过实例演示如何在VC++中使用ADO进行ACCESS数据库编程,并对涉及到的几个概念进行详细解释。 本文不对ADO和ACCESS的基本概念进行详细解释,主要包括以下内容: 第一部分 ADO和ADOX到底是什么,二者的作用和区别建立数据库 第二部分 ADOX创建ACCESS数据库 第三部分ADO创建ACCESS数据库的表 第四部分使用_ConnectionPtr接口开发ACCESS数据库 第五部分使用_RecordsetPtr接口开发ACCESS数据库 第一部分ADO和ADOX到底是什么,二者的作用和区别 ADO是Microsoft 最新推出的数据库访问的高层软件接口。它和Microsoft 以前的数据库访问接口DAO、RDO相比具有更大的灵活性,使用也更方便,开发效率大为提高。 ADOX是核心ADO对象的扩展库。它提供的附加对象可用于创建、修改和删除模式对象,如表和过程。要使用ADOX,则应建立对ADOX类型库的引用。ADOX 库文件名为 Msadox.dll。 通俗地讲,ADO是访问数据库的一种接口,可以使用它方便地进行数据库编程。而ADOX是微软对ADO功能的扩展,比如:可以ADOX创建数据库(而ADO 没有创建数据库的功能)。 第二部分ADOX创建ACCESS数据库 用ADOX创建access数据库方法很简单,只需要创建一个Catalog对象,然后调用它的Create方法就可以了。 例程ADOXCreateDatabase演示如何使用ADOX创建一个ACCESS数据库。 打开VC++ 6.0,新建一个基于对话框的工程ADOXCreateDatabase。在对话框IDD_ADOXCREATEDATABASE_DIALOG中添加一个编辑框IDC_DBNAME和一个按钮IDC_BTN_CREATE,编辑框用以输入数据库名称。 使用ClassWizard给编辑框创建一个CString变量m_dbName。 双击IDC_BTN_CREATE按钮,并编辑OnBtnCreate()函数如下: void CADOXCreateDatabaseDlg::OnBtnCreate() { //使输入到编辑框IDC_DBNAME的内容更新到m_dbName变量中 UpdateData(TRUE); CString str; str="d:\\"+m_dbName+".mdb"; //检查该数据库是否已经存在,如果该数据库已经存在,弹出消息框,返回//使用API函数PathFileExists()检查路径文件是否存在 //请注意:为了使用API函数PathFileExists(),需要加入

实验一-ACCESS数据库及表的操作

实验一数据库及表的操作 实验类型:验证性实验课时: 6 学时指导教师: 时间:2013 年月日课次:第节教学周次:第周 实验分室:实验台号:实验员: 一、实验目的 1.掌握数据库的创建及其它简单操作 2.熟练掌握数据表建立、数据表维护、数据表的操作 二、实验内容与要求 1.数据库的创建、打开、关闭 2.数据表的创建:建立表结构、设置字段属性、建立表之间关系、数据的输入 3.数据表维护:打开表、关闭表、调整表外观、修改表结构、编辑表内容 4.数据表的操作:查找替换数据、排序记录、筛选记录 三、实验步骤 案例一:创建数据库 1.创建空数据库 要求:建立“教学管理.accdb”数据库,并将建好的数据库文件保存在“E:\实验一”文件夹中。 操作步骤: 图1-1创建教学管理数据库 (1)在Access 2010启动窗口中,在中间窗格的上方,单击“空数据库”,在右侧窗格的文件名文本框中,给出一个默认的文件名“Database1.accdb”。把它修改为“教学管理”如图1-1所示。 (2)单击按钮,在打开的“新建数据库”对话框中,选择数据库的保存位置,在“E\实验一”文件夹中,单击“确定”按钮,如图1-2所示。 (3)这时返回到access启动界面,显示将要创建的数据库的名称和保存位置,如果用户未提供文件扩展名,access将自动添加上。 (4)在右侧窗格下面,单击“创建”命令按钮,如图1-1所示。 (5)这时开始创建空白数据库,自动创建了一个名称为表1的数据表,并以数据表视图方式打开这

个表1,如图1-3所示。 图1-2“文件新建数据库”对话框 (6)这时光标将位于“添加新字段”列中的第一个空单元格中,现在就可以输入添加数据,或者从另一数据源粘贴数据。 图1-3表1的数据表视图 2.使用模板创建Web数据库 要求:利用模板创建“联系人Web数据库.accdb”数据库,保存在“E:\实验一”文件夹中。 操作步骤: (1)启动Access。 (2)在启动窗口中的模板类别窗格中,双击样本模板,打开“可用模板”窗格,可以看到Access提供的12个可用模板分成两组。一组是Web数据库模板,另一组是传统数据库模板——罗斯文数据库。Web 数据库是Access2010新增的功能。这一组Web数据库模板可以让新老用户比较快地掌握Web数据库的创建,如图1-4所示 (3)选中“联系人Web数据库”,则自动生成一个文件名“联系人Web数据库.accdb”,保存位置在默认Window系统所安装时确定的“我的文档”中显示在右侧的窗格中,参见图1-3所示当然用户可以自己指定文件名和文件保存的位置,如果要更改文件名,直接在文件名文本框中输入新的文件名,如要更改数据库的保存位置,单击“浏览”按钮,再打开的“文件新建数据库”对话框中,选择数据库的保存位置。

ado连接 access 数据库

ado连接 access 数据库.txt-//自私,让我们只看见自己却容不下别人。如果发短信给你喜欢的人,他不回,不要再发。看着你的相片,我就特冲动的想P成黑白挂墙上!有时,不是世界太虚伪,只是,我们太天真。直接通过ADO操作Access数据库 作者:徐景周 下载示例源码 上次经过<直接通过ODBC读、写Excel表格文件>和<直接通过DAO读、写Access 文件>两篇文章,给大家介绍了ODBC和DAO两种数据库访问技术的基本使用方法,这次要给大家介绍的是ADO数据库访问技术的使用方法。ADO(Active Data Object,活动数据对象)实际上是一种基于COM(组件对象模型)中的自动化接口(IDispatch)技术,并以OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB精心包装后的数据库访问技术,利用它可以快速的创建数据库应用程序。 ADO提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。由于ODBC数据源也提供了一般的OLE DB Privider,所以ADO不仅可以应用自身的OLE DB Privider,而且还可以应用所有的ODBC驱动程序。关于OLE DB和ADO的其它详细情况,读者可以自行查阅相关书籍或MSDN,这里就不一一说明了。让我们直接步入主题,如何掌握ADO这种数据库访问技术。ADO的操作方法和前面讲过的DAO的操作在很多方面存在相似之处,在这里,笔者为了更有效的说明它的使用方法,用VC6.0做了一个示例程序(AdoRWAccess),这个示例程序可以直接通过ADO来操作Access数据库,示例程序的运行效果如下图所示: 在示例程序中我们仍采用原库结构,数据库名Demo.mdb,库内表名DemoTable,表内字段名为Name(姓名)和Age(年龄)的两个字段,来构造示例程序操作所需的Access数据库,这也和上两篇文章的示例源码中的库结构相兼容。 下面让我们看看ADO数据库访问技术使用的基本步骤及方法: 首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用#import引用它既可。可以直接在Stdafx.h文件中加入下面语句来实现: #import "c:\program files\common files\system\ado\msado15.dll" \ no_namespace \

Access上机操作题——查询操作说课材料

Access上机操作题之七 ——使用查询向导创建查询㈠ 在“教学”数据库中的“学生”、“课程”、“成绩”三张表中,完成下列操作: 1、建立表间关系: 根据“学生”表和“成绩”表中“学号”字段建立关系;根据“成绩”表和“课程”表中的“编号”字段建立关系;保存已建立的关系。 2、简单查询的创建: ⑴单表查询: 使用简单查询向导,对“学生”表创建一个名为“学生单表简单查询”,只要显示“学生,姓名,性别,出生日期,地址”等字段。 ⑵多表查询: 使用简单查询向导,对“学生”、“课程”、“成绩”表创建一个名为“学生多表简单查询”的简单查询,只要显示“学号,姓名,入学成绩,课程,成绩”等字段。 3、交叉表查询: 使用交叉表查询向导创建一个基于“学生”、“课程”、“成绩”三张表名为“学生成绩交叉查询”的查询。 ⑴若以上三张表没建立关系,则建立它们之间的关系。 ⑵建立一个包含“学生”表中“姓名”,“课程”表中“课程”,“成绩”表中“成绩”字段的简单查询。 ⑶按照书中P56—58页的②—⑤步操作。 4、重复项查询: ⑴使用重复项查询向导,在“学生”表中,查找入学成绩相同的学生。此查询命名为“入学成绩相同学生查询” ⑵使用重复项查询向导,在“学生”表中,查找出生日期相同的学生。此查询命名为“出生日期相同学生查询”。 ⑶使用重复项查询向导,在上面已建立的“学生多表选择查询”中,查找“计算机应用基础”分数相同的学生。此查询命名为“计算机应用基础分数相同查询”。 5、查找不匹配项查询: 使用查找不匹配项查询,在“学生”和“成绩”表中,查找没有成绩的学生。此查询命名为“缺考学生查询”。

Access上机操作题之八 ——使用查询向导创建查询㈡ 在“职工基本情况”数据库中的“职工”、“职工家属”、“职工工资”三张表中,完成下列操作: 1、建立表间关系: 根据“职工”表、“职工家属”和“职工工资”三张数据表中的“职工号”字段建立他们之间的关系,并保存其建立的关系。 2、简单查询的创建: ⑴单表查询: ①使用简单查询向导,对“职工”表创建一个名为“职工工作业绩单表简单查询”,只要显示“职工号,姓名,工作业绩”等字段。 ②使用简单查询向导,对“职工家属”表创建一个名为“职工爱人单表简单查询”,只显示“职工号”和“爱人姓名”字段。 ③使用简单查询向导,对“职工工资”数据表创建一个名为“职工奖金单表简单查询”,显示“职工号,奖金,保险”等字段。 ⑵多表查询: ①使用简单查询向导,创建一个基于“职工”和“职工家属”数据表,名为“职工子女多表查询”,显示“职工号,姓名,婚否,子女”等字段。 ②使用简单查询向导,创建一个基本“职工”和“职工工资”数据表,名为“职工收入多表查询”,显示“职工号,姓名,基本工资,奖金,保险”等字段。 ③使用简单查询向导,创建一个基本“职工”、“职工家属”和“职工工资”三张数据表,名为“职工情况多表查询”,显示“职工号,职工姓名,爱人姓名,子女,基本工资”等字段。 3、交叉表查询: 使用交叉表查询向导创建一个基于“职工”、“职工工资类别”、“职工工资汇总表”三张表名为“职工工资交叉查询”的查询。 ⑴根据“职工”和“职工工资汇总表”的“职工号”字段,和“职工工资类别”和“职工工资汇总表”的“编号”字段,建立以上三张数据表之间的关系。 ⑵建立一个名为“职工工资汇总查询”的简单查询,包含“职工”表中“职工号、姓名”,“职工工资类别”表中“工资类别”,“职工工资汇总表”表中“金额”字段的简单查询。 ⑶根据已建立的“职工工资汇总查询”,创建一个以“姓名”字段为行标题,“工资类别”为列标题,对每位职工工资情况进行汇总的交叉表查询,并将其命名为“职工工资交叉查询”。 4、重复项查询: ⑴使用重复项查询向导,在“职工”数据表中,查找工作业绩相同的职工。此查询命名为“工作业绩相同查询” ⑵使用重复项查询向导,在“职工工资”表中,查找基本工资相同的职工。此查询命名为“基本工资相同查询”。 ⑶使用重复项查询向导,在上面已建立的“职工工资汇总查询”中,查找“奖金”相同的职工。此查询命名为“奖金相同的职工查询”。 5、查找不匹配项查询: 使用查找不匹配项查询,在“职工”和“职工工资”表中,查找两张数据表中不匹配项的职工。此查询命名为“职工不匹配项查询”。

Access上机操作题——宏的创建与设计

Access上机操作题之三十二 ——宏的创建与设计㈠ 一、认识Access中的宏: ●宏的定义: 宏是一种以动作为单位的特殊代码,是由一连串动作组成的操作序列的集合,用来自动完成特定任务的操作或操作集。 ●动作的构成: 宏中的每个动作是由其动作名及其参数构成。如,Openform(动作名)表示打开指定的窗体。 ●宏、宏组与条件操作宏: ⑴宏:是一个操作序列的集合。 ⑵宏组:是多个操作序列的集合,即宏的集合。 ⑶条件操作宏:是带有条件的操作序列。 ●宏的功能: ⑴打开、关闭表单、报表,打印报表,执行查询。 ⑵移动窗口,改变窗口大小。 ⑶模拟键盘动作,为对话框或其他等待输入的任务提供字符串输入的功能。 ⑷显示信息框,响铃警告。 ⑸数据的导入、导出。 ⑹执行任意的应用程序模块。 ⑺为控件的属性赋值。 ●宏的设计视图窗口: 宏的设计视图用于宏的创建、编辑与测试,其窗口分为上下两个部分,上半部分为宏设计窗口,下半部分为宏参数的操作窗口。 1、宏设计窗口:一般包含宏名、条件、操作、注释等四个部分组成,其中“宏名”和“条件”两个部分经常被隐藏,可通过工具栏中的“宏名”和“条件”两个按钮显示出来。 ⑴宏名:是为所创建的宏命名。 ⑵条件:设置当前宏的运行条件。 ⑶操作:包含待执行的宏指令。 ⑷注释:为每一个操作提供注释说明,以帮助用户记忆宏的作用。 2、操作参数:是为当前宏指令设置相关的操作参数。当你选定“操作”栏中的宏指令时,就可在“操作参数”区中设置操作参数值。例如: ⑴当前选定的是“操作”栏中的“OpenForm”项,表示打开一个窗体或报表。 ⑵窗体名称:学生——表示打开的是“学生”窗体。 ⑶视图:窗体——表示在“窗体”视图方式下打开该窗体。 ⑷数据模式:只读——表示用户的操作权限为“只读”。 ⑸窗口模式:普通——表示窗口的显示方式为“普通”模式。

易语言数据库教程之ACCESS数据库全操作

易语言数据库教程之ACCESS数据库 前面我们已经对比分析过易语言所支持的几种常见数据库,在这几种数据库中,我们先来学习一个ACCESS数据库,当然,MSSQL数据库是完全一样的。 数据库的学习可以说非常的简单,也可以说很不简单,这要看你的出发点来定,当然,前面所学习的易语言基础同样很重要! 和前面所有的教程一样,所讲的内容部分来源我的课堂教学,面对的是高中学生,有些地方的讲解会非常的详细,而有些地方又会相对简单的一笔带过,如果有什么地方你理解起来有困难的话,请与我联系,呵呵! 本教程并不是要把易语言中对ACCESS数据库的所有操作和应用都讲一遍,都讲清楚,那是不可能的,这一点倒是有点遗憾,但我会尽我所能把一些必需的内容讲清楚! 一、准备工作 1、ACCESS的安装参见Microsoft Office2003安装图解教程 2、ACCESS数据库中数据表的建立 3、易语言ACCESS数据库控件介绍 二、数据库操作 1、易语言ACCESS数据库的连接及打开 2、易语言ACCESS数据库的读操作 3、易语言ACCESS数据库的读操作问题解决 4、易语言ACCESS数据库的高级打开操作 5、易语言ACCESS数据库的写操作 6、易语言ACCESS数据库记录的简单修改 7、易语言ACCESS数据库记录的高级修改 三、数据库与高级表格

1、易语言ACCESS数据库与高级表格一 ACCESS数据库中数据表的建立 在ACCESS中建立一个数据库及在数据库中建立数据库其实是非常简单的。 1、新建数据库,这就不用多说了,在“文件”菜单下第一个就是“新建”,它的快捷键是“Ctrl+N”,和大多数软件完全一样。 2、新建的数据库第一步操作就是要保存,这也不用多说了,相信大家都会的。 3、新建数据表,新建的数据库如下图,是一个表都没有,新建一个数据表的方法有很多,这里我们选择“使用设计器创建表”,如下图所示。 3、这里我们以建立一个学生成绩表为例进行操作,随便写了一些字段在里面,注意一下字段的类型,有些是“自动编号”,有些是“文本”,有些是“数字”,根据需要来,最后别忘记给“id”这个字段设置为“主键”。

ACCESS数据库基础知识习题

一、填空题 1. 数据类型为文本、备注、数值、日期时间、货币、自动编号、是/否、OLE对象、超级链接、查询向导。 2 .数据库技术的主要目的是有效地管理和存储大量的数据资源,包括:__提高数据共享性,使多个用户能够同时访问数据库中的数据; ____减少数据冗余,以提高数据的一致性和完整性;___提高数据与程序的独立性___,从而减少应用程序的开发和维护代价。 3 .数据库技术与网络技术的结合分为 ___Oracle__________ 与 ____sybase_________ 两大类。 4 . ACCESS 2003数据库包含的对象有表、查询、窗体、报表、宏、和模块。其中报表根据指定规则打印格式化和组织化的信息。宏是一系列操作的集合, 数据访问页作为一个独立文件存放在数据库的外部。 5 .数据库系统的 5 个组成部分: _数据库、硬件系统、数据库管理系统、数据库管理员、用户。 6 .实体之间的对应关系称为联系,有如下三种类型: __一对一,一对多,多对多___ 。 7 .任何一个数据库管理系统都基于某种数据模型的。数据库管理系统所支持的数据模型有三种: _层次模型、网状模型、关系模型_。 8 .两个结构相同的关系 R 和 S 的 __R-S____ 是由属于 R 但不属于 S 的元组组成的集合。 9 .查询的数据来源是表或其他表。 10 . Access 数据库由数据库对象和组两部分组成。其中对象分为 7 种: __表、查询、窗体、报表、页、宏、模块__ 。 二、选择题 1. 数据库系统的数据管理方式中,下列说法中不正确的是( C )。 A.数据库减少了数据冗余 B. 数据库中的数据可以共享 C. 数据库避免了一切数据的重复 D. 数据库具有较高的数据独立性 2. 数据库系统的核心是(A )。 A.数据库管理系统 B.数据库 C. 数据模型D.数据 3. 下列属于Access 对象的是( D )。 A. 文件 B. 数据 C. 记录 D. 查询 4. 用二维表来表示实体及实体之间联系的数据模型是(D )。 A.联系模型B.层次模型C.网状模型D.关系模型 5. 在Access数据库中,为了保持表之间的关系,要求在子表(从表)中添加记录时,如果主表中没有与之相关的记录,则不能在子表(从表)中添加改记录。为此需要定义的关系是( D )。 A. 输入掩码 B. 有效性规则 C. 默认值 D. 参照完整性 6. Access数据库中,表的组成是( A )。

相关主题
文本预览
相关文档 最新文档