QQ登录

只需一步,快速开始

267上位机VC MFC使用ODBC自动注册数据源

[ 复制链接 ]

267上位机VC MFC使用ODBC自动注册数据源

267上位机VC MFC使用ODBC自动注册数据源

267上位机VC MFC使用ODBC自动注册数据源


功能展示

数据源利用系统自带的ODBC管理器手动注册不够灵活,项目的可移植性不好,让用户来注册数据源也实在麻烦,我们当前例程实现用代码自动注册数据源的功能,效果如图,事先准备一数据库文件,如果例程的文件E:\\每日任务\\Student.mdb,然后程序在初始化时调用函数SQLConfigDataSource()就可实现数据源的调用;

要点提示
1.我们程序自动注册数据源的步骤如下:
生成Cdatabase类的对象,生成Crecordset类对象,调用SQLConfigDataSource函数注册数据源,
调用Cdatabase类的成员函数OpenEx()连接数据源,调用Crecordset类的成员函数Open()打开记录集

2. SQLConfigDataSource()函数所在的头文件为ODBCINST.H所以在使用函数前包含头文件,另外使用例程时记得修改SQLConfigDataSource()函数的参数为自己的,如数据库文件全路径名,数据源名记得修改;
实现功能
1.新建一视窗派生于CListView的单文档的应用程序;
2.在视窗类中包含两头文件#include <afxdb.h>//数据库支持头文件
//SQLConfigDataSource()函数所在的头文件,此函数自动注册数据源
#include <ODBCINST.H>
3.在视窗类中添加三成员变量public:
  CDatabase m_DB;
  CListCtrl*m_List;//列表视图控件的指针
  CRecordset* m_Set;//记录集对象的指针

并在构造函数中初始化,在析构函数中删除
  1. CGkbc8View::CGkbc8View()
  2. {
  3.         m_Set=NULL;
  4.         m_List=&GetListCtrl();//获取列表视图控件
  5.         m_dwDefaultStyle|=LVS_REPORT;//以报表的格式显示
  6. }
  7. CGkbc8View::~CGkbc8View()
  8. {
  9.         if(m_Set!=NULL)
  10.                 delete m_Set;
  11. }
复制代码
4.在视窗中化函数OnInitialUpdate()中注册数据源,并连接记录集显示数据
  1. void CGkbc8View::OnInitialUpdate()
  2. {
  3.         CListView::OnInitialUpdate();
  4.         //<>
  5.         if(m_Set==NULL)
  6.         {
  7.         if(!SQLConfigDataSource
  8.                                           (
  9.                                                         NULL, //父窗口指针;
  10.                                         ODBC_ADD_DSN,  //添加的数据源的类型;
  11.                                                         "Microsoft Access Driver (*.mdb)",//驱动程序名;
  12.                                                         //属性:
  13.                             "DSN=Students\0"  //数据源名
  14.                             "Description=工控编程吧gkbc8.com 测试用\0"    //数据源的说明
  15.                             "FileType=Microsoft Access\0"    //数据源文件类型
  16.                                                         "DBQ=E:\\每日任务\\Student.mdb\0"//数据库文件全路径名
  17.                     //在根据现有数据设置列的数据类型时所要扫描的行数。 可以为 1 到 16,
  18.                                          //默认值为 8;如果设置为 0,将扫描        所有行。(如果数字超出界限,会返回一个错误)        
  19.                                                 "MaxScanRows=0\0"  
  20.                                                                                                                                                                                                                                                               
  21.                                                         )
  22.                   )
  23.                 {
  24.                         AfxMessageBox("创建数据源失败!!");
  25.                         return;
  26.                 }
  27.                 m_Set=new CRecordset(&m_DB);
  28.                 if(!m_DB.OpenEx(_T("DSN=Students"),0))
  29.                 {
  30.                         AfxMessageBox("打开数据源失败!!");
  31.                         return;
  32.                 }
  33.                 m_Set->Open(CRecordset::dynaset,_T("Select * from Basic"));
  34.         }

  35.         int i=0,j=0;
  36.         CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
  37.         LV_COLUMN m_Lc;//存储列信息的结构体
  38.         m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
复制代码
  1. //读取记录集的字段信息
  2.         int nDBFields=m_Set->GetODBCFieldCount();
  3.         for(i=0;i<nDBFields;i++)
  4.         {
  5.                 m_Set->GetODBCFieldInfo(i,DbFi);
  6.                 m_Lc.iSubItem=i;
  7.                 m_Lc.fmt=LVCFMT_CENTER;
  8.                 m_Lc.cx=DbFi.m_strName.GetLength()*10+20;
  9.                 m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
  10.                 GetListCtrl().InsertColumn(i,&m_Lc);
  11.         }
  12.         //根据记录集的数据信息添加行
  13.         LV_ITEM m_item;//条目结构体对象
  14.         CString string;//字符串临时变量
  15.         CDBVariant DbVariant;
  16.         i=0;
  17.         if(m_Set->IsEOF())//记录集是否为空
  18.         {
  19.                 AfxMessageBox("记录集没有记录");
  20.                 return;
  21.         }
  22.         m_Set->MoveFirst();//从第一个记录开始
  23.         while(m_Set->IsEOF()==0)//是否到达最后一个记录
  24.         {
  25.                 m_item.mask=LVIF_TEXT;
  26.                 m_item.iItem=i;
  27.                 m_item.iSubItem=0;
  28.                 m_Set->GetFieldValue((short)0,string);
  29.                 m_item.pszText=string.GetBuffer(string.GetLength());
  30.                 m_List->InsertItem(&m_item);//插入条目
  31.                 //显示列数据
  32.                 for(j=1;j<nDBFields;j++)
  33.                 {
  34.                         m_Set->GetFieldValue((short)j,string);
  35.                         m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
  36.                 }
  37.                 m_Set->MoveNext();//下移记录
  38.                 i++;
  39.         }
  40. }
复制代码
我们来演示功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:267上位机VC MFC使用ODBC自动注册数据源.rar 
文件大小:34.35 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索