您的位置:首页 > 数据库

数据库访问技术之ODBC

2013-04-12 23:12 211 查看
在具体的应用之前,我们先了解一下ODBC数据库访问技术的工作原理:

应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。但是需要注意:在ODBC中,ODBC API不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBC
API的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。

接下来就为我们编写Demo做一些准备工作:

1 使用Access建立1个数据库odbcdemo.mdb和1个表studentinfo(注意将id设置为主键) 包含:学号(id)、姓名(name)、性别(sex)、年龄(age)、专业(profession)、籍贯(address)六个字段,再顺便添加几个记录,保存并退出。

2 使用控制面板---管理工具---数据源(ODBC),添加数据源;

具体步骤: 单击添加,在打开的创建数据源对话框中选择Microsoft Access Driver(*.mdb),单击完成; 在弹出的ODBC Microsoft Access安装对话框中选择数据库odbcdemo.mdb; 并设置数据源名DSN,在此我们设置为dsn_odbcdemo,当然,也可以单击高级按钮,在其中对数据库进行用户名和密码的设置。待一切设置完成

后,单击确定即可完成对数据源的添加。此时你就会发现在用户数据源列表中已经存在dsn_odbcdemo。

3 接下来就开始我们的Demo的编写了。

具体步骤:

1. 建立基于对话框的应用程序。 注意:可以选上winsock,以后进行服务器身份验证使用;

2. 建立基于CRecordset类的派生类CRecordsetChild,在Database Options对话框中指定数据源,选择ODBC里的dsn_odbcdemo,在Recordset type中选动态Dynaset。点击OK,然后在弹出的对话框中选择表studentinfo,确定退出;

3. 在stdafx.h中增加头文件 #include <afxdb.h>

4. 在*Dlg类中增加成员变量

public:
CDatabase m_db;		//数据库对象
CRecordsetChild * m_pSet;		//记录集的指针
5.在*Dlg.h中增加头文件 #include "RecordsetChild.h"

6. 在OnInitDialog()函数中增加代码
CString dsn="DSN=dsn_odbcdemo;DBQ=odbcdemo.mdb";	//注意:在此数据库位于工程所在文件夹中,如果你的数据库在其他地方,应该修改后面的数据库路径
CString dsn = "DSN=dsn_odbcdemo;DBQ=odbcdemo.mdb";
m_db.OpenEx(dsn);
m_pSet = new CRecordsetChild(&m_db);
CString sql = "select * from studentinfo";
m_pSet->Open(CRecordset::dynaset, sql);		//按照select语句将查询结果放到记录集里。动态的。
7. 为了将信息显示在界面上,需在界面上加6个控件(编辑框),分别关联6个变量: m_edit_name m_edit_id m_edit_sex m_edit_age m_edit_profession
m_edit_address, 同时在OnInitDialog()函数中增加代码:
m_edit_name = m_pSet ->m_name;
m_edit_sex = m_pSet->m_sex;
m_edit_age.Format("%d", m_pSet ->m_age);
m_edit_id = m_pSet ->m_id;
m_edit_profession = m_pSet ->m_profession;
m_edit_address = m_pSet ->m_address;
UpdateData(FALSE);	//更新使其在页面显示


编译运行后,便可看到从数据库中读取到的信息。

9 怎样看后面的记录信息

增加6个Button控件,并添加如下代码:

void CODBCDemoDlg::OnButtonAdd()	//增加记录
{
// TODO: Add your control notification handler code here
m_pSet->AddNew();
UpdateData(TRUE);
m_pSet ->m_name = m_edit_name;
m_pSet ->m_age = atoi((LPCTSTR)m_edit_age);
m_pSet ->m_sex = m_edit_sex;
m_pSet ->m_id = m_edit_id;
m_pSet ->m_profession = m_edit_profession;
m_pSet ->m_address = m_edit_address;
m_pSet ->Update();
m_pSet ->MoveLast();
}

void CODBCDemoDlg::OnButtonDelete()	//删除记录
{
// TODO: Add your control notification handler code here
m_pSet ->Delete();
m_edit_name = "";
m_edit_age = "";
m_edit_sex = "";
m_edit_id = "";
m_edit_profession = "";
m_edit_address = "";
UpdateData(FALSE);
}

void CODBCDemoDlg::OnButtonUpdate()	//修改记录
{
// TODO: Add your control notification handler code here
m_pSet ->Edit();
UpdateData(TRUE);
m_pSet ->m_name = m_edit_name;
m_pSet ->m_age = atoi((LPCTSTR)m_edit_age);
m_pSet ->m_sex = m_edit_sex;
m_pSet ->m_id = m_edit_id;
m_pSet ->m_profession = m_edit_profession;
m_pSet ->m_address = m_edit_address;
m_pSet ->Update();
}

void CODBCDemoDlg::OnButtonFind()	//查看
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_pSet->Close();	//在此注意:由于查询时使用的sql语句不同,所以在再次查询时应先将前面打开的记录集关闭
CString sql;
sql.Format("select * from studentinfo where name='%s'", m_edit_name);
m_pSet->Open(CRecordset::dynaset, sql);

if (m_pSet != NULL)
{
m_edit_name = m_pSet ->m_name;
m_edit_sex = m_pSet->m_sex;
m_edit_age.Format("%d", m_pSet ->m_age);
m_edit_id = m_pSet ->m_id;
m_edit_profession = m_pSet ->m_profession;
m_edit_address = m_pSet ->m_address;
UpdateData(FALSE);
}

}

void CODBCDemoDlg::OnButtonFirst()	//查看第一条记录
{
// TODO: Add your control notification handler code here
m_pSet->MoveFirst();

m_edit_name = m_pSet ->m_name;
m_edit_sex = m_pSet->m_sex;
m_edit_age.Format("%d", m_pSet ->m_age);
m_edit_id = m_pSet ->m_id;
m_edit_profession = m_pSet ->m_profession;
m_edit_address = m_pSet ->m_address;
UpdateData(FALSE);
}

void CODBCDemoDlg::OnButtonPrevious()	//查看前一条记录
{
// TODO: Add your control notification handler code here
m_pSet->MovePrev();

if (m_pSet ->IsBOF())
{
m_pSet->MoveFirst();
}
m_edit_name = m_pSet ->m_name;
m_edit_sex = m_pSet->m_sex;
m_edit_age.Format("%d", m_pSet ->m_age);
m_edit_id = m_pSet ->m_id;
m_edit_profession = m_pSet ->m_profession;
m_edit_address = m_pSet ->m_address;
UpdateData(FALSE);
}

void CODBCDemoDlg::OnButtonNext()	//查看下一小记录
{
// TODO: Add your control notification handler code here
m_pSet->MoveNext();
if (m_pSet->IsEOF())
{
m_pSet->MoveLast();
}

m_edit_name = m_pSet ->m_name;
m_edit_sex = m_pSet->m_sex;
m_edit_age.Format("%d", m_pSet ->m_age);	//int转换为CString
m_edit_id = m_pSet ->m_id;
m_edit_profession = m_pSet ->m_profession;
m_edit_address = m_pSet ->m_address;
UpdateData(FALSE);

}

void CODBCDemoDlg::OnButtonLast()	//查看最后一条记录
{
// TODO: Add your control notification handler code here
m_pSet->MoveLast();
m_edit_name = m_pSet ->m_name;
m_edit_sex = m_pSet->m_sex;
m_edit_age.Format("%d", m_pSet ->m_age);
m_edit_id = m_pSet ->m_id;
m_edit_profession = m_pSet ->m_profession;
m_edit_address = m_pSet ->m_address;
UpdateData(FALSE);
}

至此,我们的Demo便编写完成。具体的实例代码可以在一下地址进行下载:

http://download.csdn.net/detail/jhg1204/5252298
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: