• 西门子6ES7216-2BD23-0XB8代理直销
  • 西门子6ES7216-2BD23-0XB8代理直销
  • 西门子6ES7216-2BD23-0XB8代理直销

产品描述

产品规格模块式包装说明全新品牌西门值+ 包装说明 全新 - 产品规格子

西门子6ES7216-2BD23-0XB8代理直销

如何在VC++6.O 下动态加载 ODBC数据源

SQLConfigDataSource() 
SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft FoxPro Driver (*.dbf)", 
"DSN=MYDB"

"DefaultDir=c:mydir"

"FIL=FoxPro 2.5"

"DriverId=280"))

在注册DSN时,SQLConfigDataSource函数的第二个参数应该是ODBC_ADD_DSN,第三个参数*了ODBC驱动程序,它的写法可以参照ODBC管理器的驱动程序页。第四个参数说明了数据源的各种属性,它是由一系列子串构成,每个子串的末尾必须有一个“”。较重要的属性是“DSN=数据源名”,其它属性包括缺省目录以及驱动程序版本信息。在上例中,使用FoxPro 2.5的版本,所以DriverId应该是280,对应地,FoxPro 2.6的DriverId是536,FoxPro 2.0的是24。

如果读者对SQLConfigDataSource函数的第四个参数的设置方法不清楚,那么可以打开bbbbbbs的注册表看一看已注册过的DSN的各项属性。运行RegEdit可以打开注册表,然后依次打开HKEY_CURRENT_USER->Software->ODBC->ODBC.INI,就可以看到已注册的DSN,打开各DSN,则可以看到该DSN的各项属性,读者可以DSN属性来设置第四个参数。

的名字必须一,因此如果要注册的DSN已被注册过,那么SQLConfigDataSource就修改原来DSN的属性。

一、ODBC
开放数据库连接ODBC(Open Database Connec-tivity)是微软开放服务结构WOSA中关于数据库的一
个重要部分,它允许应用程序通过ODBCAPI访问不同数据资源中的数据,从而为数据库编程提供了
一个标准接口。ODBC是对SQL Access Group的CLI标准的一种实现,它允许应用程序访问范围很广
的数据库(从简单的ASCII文本到复杂的主框架数据库),除了bbbbbbs平台外,ODBC还可以在其
他诸如UNIX等的操作平台上使用,因此ODBC获得了世界上大多数良好的数据库和应用程序开发商
的广泛支持。
ODBC主要包括了四层结构:较上层是应用程序,第二层是驱动程序管理器,第三层是不同的驱
动程序,对应不同的数据库,较底层是具体的数据源。每个不同的数据资源类型由一个ODBC驱动程
序支持,这个驱动程序完成了ODBC API程序的核心,而且与数据库通讯。
二、一般加表数据源的方法
通常,开发ODBC应用程序之前必须要手动加入所用的数据源,利用位于控制面板中的ODBC管
理器可以方便地实现数据库加载。双击控制面板中32-bit ODBC的图标就会出现管理器对话框,点击
Add按钮数据源,选择使用的驱动程序、数据库名称、服务器地址或其他缺省设置后就把数据源
加载到ODBC管理器中了。ODBC管理器负责安装驱动程序、管理数据源,帮助程序员跟踪ODBC的函
数调用,并能将应用程序的SQL语句及其他消息传递给驱动程序,而驱动程序则负责将结果集传回应
用程序。
利用VC++6.0的AppWizard创建一个基于单文档的工程,选择数据库支持并根据提示所需
数据库,这样就可以在应用程序中实现对该数据源的增加、修改和删除等操作了。
毫无疑问,采用上述方法就能方便地对*数据库进行操作。但是,实际运用中,用户往往要求
在同一个应用程序中能任意访问不同的数据源,开发人员无法确定要加载的数据源,采用一般的加载
方法就有了无法克服的缺陷。显然,这时就要求动态地进行ODBC数据源加载,用户只要选择所需的
数据源,应用程序就会自动地把它装载到ODBC管理器。 "
三、动态加载数据库
创建ODBC数据源可以调用bbbbbbs系统子目录下的动态链接库Odbcint.dll中的函数SQLConfigDataSource()
该函数可以动态地增加、修改和删除数据源。
lQLConfigDataSource()函数
SQLConfigDataSource()的原型如下:
BOOLSQLConfigDataSource(HWND hwndParent, UINT
fRequest,LPCSTR IpszDriver, LPCSTR IpszAttributes);
其中四个参数的用法如下:
●参数hwndPwent是父级窗口句柄。如果句柄为NULL,将不会显示一些有关的对话框。
如果参数 IpszAttributes提供的信息不够完善,在创建过程中就会出现对话框要求用户提供相应信息。
●参数fRequest可以设置为下面的数值之一:
ODBC_ADD_DSN: 增加_个新数据源
ODBC_CONHG_DSN: 配置(修改)一个已经存在的数据源
ODBC_REMOVE_DSN: 删除一个已经存在的数据源
ODBC_ADD_SYS_DSN:. 增加一个新的系统数据源
ODBC_CONFIG—SYS—DSN: 更改一个已经存在的系统数据源
ODBC_REMOVE_SYS_DSN:. 删除一个已经存在的系统数据源
●参数lpszDriver是数据库引擎名称,可以参见
ODBC管理器中对ODBC驱动程序的描述。比如要加
载的是Excel数据库,那么数据库引擎名称就为Microsoft Excel Driver(*.xls)

●参数lpszAttributes为一连串的"KeyName=value"
字符串,每两个KeyName值之间用""字符隔开。KeyName主要是新数据源缺省的驱动程序注册说明,其中较主要的关键字是"DSN"-----    新数据源的名称,其余关键字则根据不同的数据源有不同要求。关于lpszAttributes参数的具体设置,详细可以参考bbbbbbs系统目录下帮助文件Odbcjtn.hlp主题目录标签中的"ODBC API函数改变|SQLConfigDatasource"条目。
2.SqlConfigDataSource的应用条件
  使用SqlConfigDataSource函数之前,必须把
ODBCINST.H文件包含在工程头文件中,将ODBC-
CP32.LIB工程,同时保证ODBCCP32.DLL运行时处于系统子目录下。
3.SqlConfigDataSource的应用示例
  以下的例子采用SQLConfigDataSource  ODBC API函数在VC++6.0下动态加载任意一个Excel数
据源。
  由于要求是动态地加载数据源,事先没法手动向ODBC管理器加载数据源,因此无法选择数据库
支持,不能建立基于单文档或多文档的应用程序。启动VC++6.0,利用AppWizard建立一个基于对
话框的应用程序,工程名称为"My"。在对话框模板上放置一个按钮,其ID号为IDC-GETDATA,
Caption为"调数据源"。再派生出一个基于CFile-Doialg类的新类CMyFileDialog,以标准文件对话框
方式选择打开文件,具体做法请参阅有关资料,这里不作说明。
  由于应用程序没有对数据库的支持,故必须手工在STDAFX.H文件中加入对数据库的支持,添加有
数据库支持的STDAFX.H文件清单如下所示:

         #define VC-EXTRALEAN
         / / Exclude rarely-used stuff from bbbbbbs headers
         #include <afxwin. h>
         //MFC core and standard components
         #include <afxext. h>     // MFC extensions
         #include <afxdb. h //MFC database classes
         #include <afxdisp. h> // MFC OLE automation classes
         #ifndef _AFX_NO_AFXCMN- SUPPORT
         #include <afxcmn. h>
         // MFC support for bbbbbbs Common Controls
         #endif//- AFX-NO_AFXCMN_SUPPORT
         //{{AFX_Insert_bbbbbbbb}}
         #endif
利用classwizard给按纽添加函数OnGetData,定位到该函数并添加SqlConfigDataSource()以动态调用数据源,值得指出的是,对于要加载的excel数据源的lpszAttributes参数中有个关键字必须要说明,数据源名称:"DSN"
         主程序如下
#include"odbcinst.h"
#include"bbbbbb.h"
#include"stdafx.h"
#include"my.h"
#include"mydlg.h"
         IMPLEMENT_DYNAMIC ( CMyFileDialog ,CFileDialog)
         CMyFileDialog:: CMyFileDialog ( BOOL bOpenFileDialog,
         LPCTSTR lpszDefExt, LPCTSTR lpszFileName,DWORD
         dwFlags, LPCTSTR lpszFilter, CWnd * pParentWnd):
         CFileDialog (bOpenFileDialog lpszDefExt, lpszFileName,
         dwFlags, lpszFilter, pParentWnd)
           {}
         //CAboutDlg dialog used for App About
         class CAboutDlg :public CDialog
         
         public:
           CAboutDlg ();
         // Dialog Data
           / / { { AFX DATA I CAboutDlg)
           enum { IDD = IDDABOUTBOX };
           //} }AFX_DATA
           / / ClassWizard generated virtual function overrides
           / / { {AFX VIRTUAL CAboutDlg)
           protected:
         / / Implementation
         protected:
            / / {AFX_MSG (CAboutDlg)
            //}}AFX_MSG
            DECLARE_MESSAGEMAP()
         
       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_MESSAGEMAP ( CAboutDlg, CDialog)
            // ( {AFX_MSG_MAP(CAboutDlg)
               / / No message handlers
            //}}AFX_MSG_MAP
        END_MESSAGEMAP()
         
        / / CMyDlg dialog
        CMyDlg:    : CMyDlg(CWnd* pParent / * =NULL* /)
              CDialog(CMyDlg: : IDD, pParent)
         {
            //{{AFX_DATA_INIT(CMyDlg)
               //  NOTE: the ClassWizard will add member
                 initialization here
            //}}AFX_DATA_NIT
        m_hlcon =AfxGetApp()->Loadlcon(IDR_MAINFRAME);
         }
         void CMyDlg: : DoDataExchange ( CDataExchange * pDX)
         I
          {  CDialog:: DoDataExchange(pDX);
            //{{AFX_DATA_MAP(CMyDlg)
        // NOTE: the ClassWizard will add DDX and DDV calls here
            //})AFX_DATA_MAP
         }
         BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
            //{{AFX_MSG_MAP(CMyDIg)
            ON WM_SYSCOMMAND()
            ON_WMPAINT()
            ON WM_QUERYDRAGICON()
            ON_BN_CLICKED(IDC_GETDATA, OnGetdata)

            //}}AFX_MSG_MAP
         END_MESSAGEMAP()
         
         / / CMyDlg message handlers
         BOOL CMyDlg: : OnlnitDialog()
         {
            CDialog: : OnlnitDialog ();
         ASSERT( (IDM_ABOUTBOX& OxFFFO) = =IDM_ABOUTBOX);
            ASSERT(IDMABOUTBOX < OxF000);
            CMenu * pSysMenu = GetSystemMenu ( FALSE);
if(pSysMenu!=NULL)
{Cbbbbbb strAboutMenu;
strAbooutMenu.Loadbbbbbb(IDS_ABOUTBOX);
if(!strAboutMenu.IsEmpty())
   {  
       pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_bbbbbb,IDM_ABOUTBOX,strAboutMenu);
    }
}
           SetIcon(m.hlcon, TRUE);     // Set big icon
           SetIcon ( m.hlcon, FALSE); / / Set small icon
           / / TODO: Add extra initialization here
           return TRUE; / / return TRUE unless you set the focus to a control
}  
         void CMyDlg:: OnSysCommand( UINT nlD, Lbbbbb
         lbbbbb)
      {   if ((nID & OxFFFO) = = 1DM_ABOUTBOX)
           { CAboutDlg dlgAbout;
            dlgAbout. DoModal ();
           }
         else
           {CDialog:   : OnSysCommand(nID, lbbbbb);}
      }
         void CMyDlg: : OnPaint()
         {if (lslconic0)
           {CPaintDC dc (this); / / device context for painting
           SendMessage (WM_ICONERASEBKGND, (Wbbbbb)
         dc.GetSafeHdc0, 0);
           / / Center icon in client rectangle
           int cxIcon = GetSystemMetrics ( SMCXICON);
           int cyIcon = GetSystemMetrics ( SMCYICON);
           CRect rect;
           GetClientRect( & rect);
           int x = (rect.Width() -cxlcon + 1) / 2;
           int y = (rect. Height()-cylcon + 1) / 2;
           // Draw the icon
           dc.Drawlcon(x, y, m_hlcon);
        }
        
        
         else
         {CDiaLog:   : OnPaint();}
}
         HCURSOR CMyDlg: : OnQueryDraglcon()
         {return (HCURSOR) m_hIcon;}
         
        void CMyDlg: OnGetdata ()
         
         / / TODO: Add your control notification handler code here
            CMyFileDialog filedlg (TRUE);
            filedlg. DoModal ();   / /弹出打开对话框
            Cbbbbbb drivername;//数据库引擎名称
            Cbbbbbb filetitle = filedlg. GetFileTitle ();
         //取得*文件名(不包含后缀)
            Cbbbbbb extention =filedlg. GetFileExt();
         / /取得后缀
            if(extention = = "xls")
             drivername = "Microsoft Excel Driver (* xis) ";}
            char str[50];
            strcpy(str, "DSN =");
            Cbbbbbb keyname = strcat( str, filetitle);
         //keyname 指明了数据源名称
            if (FALSE = = SQLConfigDataSource (NULL, ODBC_
         ADD_DSN, drivername, keyname)
            {MessageBox("加载失败");}
            else
           {MessageBox("成功将数据源加载到管理器");}
}
进行上述编程之后,用户只要点击"调数据源"按钮,在对话框里任意选择所需Excel数据源,程序就会自动把数据源加载到ODBC管理器而不再需要手动加入,用户可以通过双击"控制面板"中的32位ODBC图据,查看"用户DSN"一栏,即可看见数据源己经自动加载到ODBC管理器了。利用动态加载数据库,用户还可以多次加载所需数据源,操作起来非常方便灵活,应用程序的处理能力也大大增强了

对于一个计算机监控系统来说,硬件是基础,软件是灵魂。软件已经成为计算机系统的主体,在很大程度上决定了系统的先进性、可靠性、实用性以及实时性。信息管理及软件是一种特殊的软件,它具有如下特点:

1.要求可靠性特别高。可靠性不仅意味着系统工作的正确性,而且要求系统工作的连续性。例如控制过程不允许中断,系统中各种参数不允许丢失;

2.要求软件实时性强。实时性要求系统能够实时反映监测量并及时做出控制决策,即具有较快的响应速度。

3.要求软件的使用和维护方便。信息管理及软件主要由工程技术人员和操作人员使用,要求系统的使用和维护都很方便。

4.要求支持数据库安全登录,数据库访问权限和程序使用安全。

5.支持数据库备份和基于事务的数据库操作,数据集中管理并且具有很强的综合统计、分析及报表输出功能。

充分利用计算机的强大的处理能力,设计出实时性好、监测控制可靠,软件分析功能齐全,并且具有动画效果、操作界面友好的信息管理及软件是本系统的主要任务。

bbbbbbs 2000是bbbbbbs NT 4.0的升级产品,不但集bbbbbbs 9x和bbbbbbs NT 4.0的众多优良的功能/性能于一身,而且在稳定性、网络功能和安全性能方面,比bbbbbbs NT 4.0都有了极大的改善。它不仅可以在一个小的工作组网络中为用户提供文件服务和打印服务,也可以在一个大型企业的网络中为用户提供应用程序、Web浏览与发布、文件传输、电子邮件和通讯等服务,是一个性能更好、工作更稳定、更容易管理的操作系统。因此上位机采用的操作系统是Microsoft公司的bbbbbbs 2000 Server。

由Inprise公司(原Borland公司)推出的基于bbbbbbs平台的可视化快速应用开发工具Delphi 6.0在数据库编程方面功能十分强大而且有很强的程序界面开发能力。本控制系统的系统软件主要采用Delphi 6.0来开发。

系统软件总体结构设计

软件总体设计的是确定软件的总体结构、子系统和模块的划分,并确定模块间的接口和评价模块划分的质量,以及进行数据分析。按照软件工程学的观点,软件的总体设计在整个软件的开发过程中处于十分重要的地位。在详细编写代码之前进行总体设计,可以站在全局的高度上,用较少的成本,从抽象的层次上来分析对比多种可能的系统实现方案和较合理的软件结构,从而可以用较低的成本开发出质量较高的软件来。总体设计过程通常由两个主要的阶段组成:

1)系统设计,即确定系统的具体实现方案;

2)结构设计,即确定软件的结构。

软件总体设计的具体步骤如下:

1.提出各种可供选择的方案;

2.对各个方案进行论证,选取合理的方案,对于每个合理的方案都应该有系统流程图、组成系统的物理元素清单、成本效益分析和实现这个系统的进度进化;

3.确定较佳方案,在综合分析对比各种合理方案的基础之上选择一个较佳方案;

4.功能分解。通常分为结构设计和过程设计两个阶段。结构设计确定程序由哪些模块组成,以及这些模块之间的关系;过程设计确定每个模块的处理过程。

5.设计软件结构,将各个模块组织成良好的层次系统;

6.数据库设计,即在需求分析阶段对数据要求所做的分析的基础上进一步进行数据库设计、子模式设计、完整性设计和安全性设计并进行优化;

7.制定测试计划:在软件开发的早期考虑测试问题,能促使软件设计在设计时注意提高软件的可测试性;

8.书写文档:应该用正式的文档记录总体设计的结果,在这个阶段应该完成的文档有系统总体设计说明、用户手册、测试计划、详细的实现计划和数据库设计说明;

9.审查与复查:对总体设计的结果进行严格的技术审查,在技术审查之后由使用部门的负责人从管理的角度进行复审。



http://zhangqueena.b2b168.com

产品推荐