数据库访问技术之ODBC

来源:互联网 发布:isis软件中电源 编辑:程序博客网 时间:2024/05/21 17:59

在具体的应用之前,我们先了解一下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 herem_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 herem_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 herem_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 hereUpdateData(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 herem_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 herem_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 herem_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转换为CStringm_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 herem_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