ODBC & ACCESS

原创 2004年02月13日 11:19:00

ODBC 与 Access

这是一篇关于本人使用ODBC 具体步骤(Visual C++6.0 +Access 2000)
动态创建数据源,数据库(默认test.mdb),表及其查询,插入,修改,删除。


一般说来ODBC数据库的使用分为以下几步是:

创建数据库对象-> 连接数据库-> 创建记录集-> 打开记录集-> 操作记录集- > 关闭和销毁记录集-> 关闭和销毁数据库对象。


下面就具体步骤介绍:
1.打开Visual C++6.0(并确定安装了Access 2000),为了简便我们就新建一个基于对话框的工程(Dialog),
新建->工程->MFC AppWizard(exe)->在工程名处输入:DyODBC(工程名称)->选基于对话框->其它默认点完成即可

 

2.在FileView选项卡的Header Files文件夹中
(1)打开DyODBCDlg.h加入代码:
 #include <odbcinst.h>
 #pragma comment(lib,"odbccp32.lib") //为了使用ODBC API的函数 SQLConfigDataSource


(2)打开StdAfx.h加入代码:
 #include <afxdb.h> //以提供对CDatabase 类的支持

3.在ResourceView选项卡的Dialog文件夹中
 点击标记为IDD_DYODBC_DIALOG来编辑对话框界面,为对话框加入如下控件(先删除:TODO: 在这里设置对话控制。):

 6个按钮控件
 ID  Caption

 IDC_CREATEDSN  创建数据源
 IDC_CREATEDATABASE 创建数据库
 IDC_CREATETABLE 创建表
 IDC_DELETEDSN  删除数据源
 IDC_DELETEDATABASE 删除数据库
 IDC_DELETETABLE 删除表
 IDC_SHOWDATAINFO  显示数据表

 加入显示对话框:选ResourceView  的 DyODBC resources 目录下Dialog点右键Insert Dialog,选IDD_DIALOG1右键Properties将ID改为:IDD_SHOWDATADLG然后加入如下控件:
 1个列表控件

 ID  Styles
 IDC_LISTCONTROL  View:Report
为对话框加一个类,在对话框上点击右键->ClassWizard->CLassWizard再弹出的的对话框(Adding a Class)选Create a new class (默认选项,这是提示我们为刚才第二个对话框加一个新类),点确定,在弹出的New Class对话框中填写类名为:ShowDataDlg,其他默认即可,点确定;
为列表控件绑定变量,在列表控件点击右键双击后在弹出的对话框 Member variable name:输入m_showlist 其它默认,点确定;

 

4.为控件加入相应的代码
 
(1)双击按钮“创建数据源”在弹出的对话框(Add Member Function)默认名OnCreatedsn,点确定即可;
 // TODO: Add your control notification handler code here
//在此处加入如下代码:
 CString strPath=GetCurrentPath();//得到应用程序的路径
 CString strDSN;
 strDSN.Format("%s",dsnName);
// strDSN.Format("%s%s%s",dsnName,strPath,mdbName);


 if(SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,sDriver,strDSN))//创建数据源
  MessageBox("Create DSN is OK!!","Create",MB_OK);
 else
  MessageBox("Create DSN isn't OK!!","Create",MB_OK);

(2)双击按钮“创建数据库”在弹出的对话框(Add Member Function)默认名OnCreatedatabase,点确定即可
 // TODO: Add your control notification handler code here
//在此处加入如下代码:
 CString strPath=GetCurrentPath();
 CString strMDB="CREATE_DB="+strPath+mdbName;
 MessageBox(strMDB,"!!!",MB_OK);
 
 if(SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,sDriver,strMDB))
  MessageBox("Create Database is OK!!","Create",MB_OK);
 else
  MessageBox("Create Database isn't OK,May be test.mdb is exist!!","Create",MB_OK);


(3)双击按钮“创建表”在弹出的对话框(Add Member Function)默认名OnCreatetable,点确定即可
 // TODO: Add your control notification handler code here
//在此处加入如下代码:
CString strSQLexe[]={
_T("Create table test(iID int , tmJoin datetime, szName varchar(40),fTall float );"),
_T("create table student(sno varchar(10) , sname varchar(12), age int);"),
_T("insert into student(sno,sname,age) values('jkx0013001','xkl',22);"),
_T("Insert into test values(1111, '2002-1-3 13:25' , 'user_3',1.76 );"),
_T("Insert into test values(2222, '2002-1-1 15:25' , 'user_1',1.56 );"),
_T("Insert into test values(3333, '2002-1-2 12:25' , 'user_2',1.53 );"),
_T("Insert into test values(4444, '2002-1-3 13:25' , 'user_3',1.76 );"),
  };

TRY
{
 CString strPath=GetCurrentPath();
 pDb.OpenEx(dsnName+strPath+mdbName);//,CDatabase::openReadOnly);//打开
 if(!pDb.IsOpen())//判断是否打开
  MessageBox("Open Database is Failed!!!","Create",MB_OK);
 else
 {
  pDb.ExecuteSQL(strSQLexe[0]);
  pDb.ExecuteSQL(strSQLexe[1]);
  pDb.ExecuteSQL(strSQLexe[2]);
  pDb.ExecuteSQL(strSQLexe[3]);
  pDb.ExecuteSQL(strSQLexe[4]);
  pDb.ExecuteSQL(strSQLexe[5]);
  pDb.ExecuteSQL(strSQLexe[6]);
 }
}
CATCH(CDBException, e)
{ // The error code is in e->m_nRetCode
  
    pDb.Close();
    CString strTip=_T("Database operate Fail!/n");
    strTip+=_T("Because:/n")+e->m_strError;
 AfxMessageBox(strTip);
}
END_CATCH
    pDb.Close();


(4)双击按钮“删除数据源”在弹出的对话框(Add Member Function)默认名OnDeletedsn,点确定即可
 // TODO: Add your control notification handler code here
//在此处加入如下代码:
 if(SQLConfigDataSource(NULL,ODBC_REMOVE_SYS_DSN,sDriver,dsnName))
  MessageBox("Delete DSN is OK!!","Delete",MB_OK);
 else
  MessageBox("Delete DSN isn't OK,May be the DSN isn't exist!!","Delete",MB_OK);

(5)双击按钮“删除数据库”在弹出的对话框(Add Member Function)默认名OnDeletedatebase,点确定即可
 // TODO: Add your control notification handler code here
//在此处加入如下代码:
 if(DeleteFile(GetCurrentPath()+mdbName))
  MessageBox("Delete Database Success!","Delete",MB_OK);
 else
  MessageBox("Delete Database Fail!","Delete",MB_OK);

(6)双击按钮“删除表”在弹出的对话框(Add Member Function)默认名OnDeletetable,点确定即可
 // TODO: Add your control notification handler code here
//在此处加入如下代码:
TRY
{
 CString strPath=GetCurrentPath();
 pDb.OpenEx(dsnName+strPath+mdbName);//,CDatabase::openReadOnly);//打开
 if(!pDb.IsOpen())//判断是否打开
 { MessageBox("Open Database is Failed!!!","Create",MB_OK);
  
 }
 else
 {
  pDb.ExecuteSQL("delete  table from test;"); //delete table
  pDb.ExecuteSQL("delete  from student"); //delete table
  pDb.Close();
 }
}
CATCH(CDBException, e)
{ // The error code is in e->m_nRetCode
  pDb.Close();
    CString strTip=_T("Database operate Fail!/n");
    strTip+=_T("Because:/n")+e->m_strError;
 AfxMessageBox(strTip);
}
END_CATCH
 pDb.Close();

(7)双击按钮“显示数据表”在弹出的对话框(Add Member Function)默认名OnShowdatainfo,点确定即可
 // TODO: Add your control notification handler code here
//在此处加入如下代码:
 ShowDataDlg dlg;
 dlg.DoModal (); 
(8)在DyODBCDlg.cpp文件开始处加入
 #include "globals.h"    //自定义的变量
 #include "ShowDataDlg.h"

5.为ShowDataDlg 添加显示功能,

(1)在ShowDataDlg.cpp文件开始处
 #include "DyODBCDlg.h"
 extern CDatabase pDb;
 extern CString dsnName;
 extern CString mdbName;
(2)在ClassView处选ShowDataDlg点右键选Add Window Message Handler...项,在弹出的对话框,New Windows messages/events:栏中找到WM_INITDIALOG双击后,点Add Handler 按扭,加入如下代码:
 
 // TODO: Add extra initialization here
        // 对记录集的操作
 CRecordset* dbset=new CRecordset(&pDb);//
 CDyODBCDlg dlg;
 
 CString strPath=dlg.GetCurrentPath ();//Get application path
TRY
{
 pDb.OpenEx(dsnName+strPath+mdbName,CDatabase::noOdbcDialog);//打开
 if(!pDb.IsOpen ())
      AfxMessageBox("Open dsnName Error.");//m_databaseinfo);
 else
 {
         CString strSQL=_T("select * from test");
//  CString strSQL=_T("select * from student");
//  CString strSQL=_T("select sname from student where age=33;");
//  CString strSQL=_T("select iid, tmjoin from test where iid=1111;");

  dbset->Open(CRecordset::dynaset,strSQL,CRecordset::readOnly); 
 
  //统计table信息
  short FieldCount=dbset->GetODBCFieldCount ();
  do {  dbset->MoveNext();  } while (!dbset->IsEOF());
  long RecordCount=dbset->GetRecordCount();


  CString title[MAX_PATH]={""};
  CODBCFieldInfo fieldinfo;
         CStringArray strColTitle;
  if(!dbset->IsBOF())   dbset->MoveFirst();
  if(strColTitle.GetSize())  strColTitle.RemoveAll();

  //显示列标题(字段名)
  for(int i=0;i<FieldCount;i++)
         {
      dbset->GetODBCFieldInfo(i,fieldinfo);
             strColTitle.Add(LPCTSTR(fieldinfo.m_strName));
               m_showlist.InsertColumn (i,strColTitle[i]);//title[i]);
         }

  CString item[MAX_PATH];
  CString strField;

  //显示记录
  dbset->MoveFirst();
  for(i=0;i<RecordCount;i++)
  { 
   m_showlist.InsertItem (i,"");
   for(int j=0;j<FieldCount;j++)
   {
    dbset->GetFieldValue (j,strField);
    m_showlist.SetItemText (i,j,strField);
    m_showlist.SetColumnWidth (j,LVSCW_AUTOSIZE);
   }
   dbset->MoveNext ();
  }
  dbset->Close ();
  delete dbset;

  pDb.Close();
 }
}
CATCH(CDBException, e)
{ // The error code is in e->m_nRetCode
 dbset->Close ();
 delete dbset;

  pDb.Close();
     CString strTip=_T("Database operate Fail!/n");
     strTip+=_T("Because:/n")+e->m_strError;
 AfxMessageBox(strTip);
}
END_CATCH

 

6.为工程加入全局变量,点新建 -> 文件 里C/C++ Header File 名为:globals.h
 
 CDatabase pDb;
 CString dsnName=_T("DSN=演示数据源;DBQ=");  //数据源
 CString sDriver=_T("Microsoft Access Driver (*.mdb)"); //驱动
 CString mdbName=_T("//test.mdb");   //数据库名   


7.为DyODBCDlg.cpp加入成员函数GetCurrentPath(),
 在ClassView 选中CDyODBCDlg点右键,选Add Member Function...;在弹出的对话框中对应如下:
  Function Type: CString
  Function Declaration: GetCurrentPath()
  Access :  Public
点确定后加入以下代码:
    //取得当前的工作路径
    CString sPath;
    CString strDBFile;
    GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
    sPath.ReleaseBuffer();
    int nPos=sPath.ReverseFind ('//');
    sPath=sPath.Left(nPos);
    strDBFile = sPath;
  
 return _T(strDBFile);

8.连接,运行。。。
//这是我的学习的笔记,有什么不对之处,请与我联系
//qingbo8@163.com 非常希望能得到你的教诲
//感谢你的浏览(完)

 

 

 

php+odbc+access 数据库操作函数,在windows下测试通过

前些天下载了adodb,想用adodb连access数据库,后来连是连上了,不过不能更新和插入记录,也不知道为什么到现在还没人给我回答那个苦恼的问题,后来就放弃了adodb,使用php自己的odbc,...
  • 34n
  • 34n
  • 2005年06月19日 16:13
  • 1249

MS ACCESS ODBC开放式接口连接字符串

MS ACCESS ODBC开放式接口连接字符串 标准链接: "Driver= {Microsoft Access Driver(*.mdb)};DBQ=C:\App1\你的数据库名.mdb;Ui...
  • flyuniverse_shell
  • flyuniverse_shell
  • 2012年04月14日 09:12
  • 3117

#1045 - Access denied for user 'ODBC@localhost'

刚开始安装的时候直接输入mysql 是可以进去的,这是进入了一个基本的没有密码的账号 但是给root设置完密码后,发现输入mysql后进不去了,出现 ERROR 1045 : Access...
  • zitian886
  • zitian886
  • 2015年09月04日 06:37
  • 1327

[Microsoft][ODBC Microsoft Access ????] ????? '(???)'?

Struts Problem Report Struts has detected an unhandled exception: Messages: [Microso...
  • imhml1987
  • imhml1987
  • 2013年01月16日 21:28
  • 974

access使用odbc导出文件到mysql

首先安装my sql和my sql odbc 然后在设置面板中添加数据源 ==============================================================...
  • u014027437
  • u014027437
  • 2014年07月17日 13:44
  • 699

win7-64位系统添加access的ODBC数据源的方法

转载(http://www.linuxso.com/windows/18912.html):                一般是控制面板-管理工具-数据源(ODBC),打开“ODBC数据源管理...
  • yongzhen150
  • yongzhen150
  • 2014年11月21日 13:40
  • 2387

实现JDBC-ODBC桥连接到Access数据库

如何实现JDBC-ODBC桥连接到Access? (让你对java运行环境有更好的了解)   1、        首先要建立ODBC数据源,我的系统是Win8.1系统,所以依次选择“控制面板----管...
  • u013975800
  • u013975800
  • 2015年07月01日 13:29
  • 2148

ODBC访问带密码的access数据库

法1,创建数据源时解锁:创建数据源有两种方式,一是手动创建(到控制面板下);二是用代码创建(见 动态创建数据源)。但是如果想在创建数据源的同时解锁,就只能采用手动的方式了:只需在输入了数据源名之后点“...
  • iwantnon
  • iwantnon
  • 2009年07月13日 23:47
  • 1685

利用 mysql-connector-odbc 把access表导到mysql数据库

方法步骤1.下载 mysql-connector-odbc 然后安装http://www.skycn.com/soft/2141.html2.进行 - -   [ 用户DNS] 处点[添加]    ...
  • gggxin
  • gggxin
  • 2007年06月27日 10:57
  • 2625

MySQL ERROR 1045 : Access denied for user 'ODBC'@'localhost' (using password: NO)

刚开始安装的时候直接输入mysql 是可以进去的,这是进入了一个基本的没有密码的账号 但是给root设置完密码后,发现输入mysql后进不去了,出现 ERROR 1045 : Access den...
  • linxinyuluo
  • linxinyuluo
  • 2011年08月29日 11:37
  • 22202
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ODBC & ACCESS
举报原因:
原因补充:

(最多只允许输入30个字)