VC++6.0MFC编程心得

数据库:

       一个程序的最基本功能有输入、查询、修改、删除、保存、打印,均与数据库有关。而对数据库的基本操作使用最频繁,以Access 为例:

1、用程序创建Access 数据库文件:

手工创建数据文件的方法大家并不陌生,如果用程序创建有时候也需要,下面就是其中一种方法,可以使用ADOX::CatalogPtr来创建mdb文件。用下面“配置设置文件”文件方法设置数据库的参数,配置数据文件的名称、密码、ID和路径,在有安装程序的情况下需要它。

ADOX的建库,它是在没有数据库文件的情况下,用ADOX的目录指针CatalogPtr来创建ACCESS数据库文件,如下:

BOOLCRecord::UseADOXCatalogPtrCreatAccessDB()

{

       CString str=DBPath + DBName;         //数据库的路径和名称

       CString strPassword=DBPasswd;         //数据库的密码

       CStringstrcnn=_T("Provider=Microsoft.JET.OLEDB.4.0;Data source ="+str+";\

              Jet OLEDB:DatabasePassword="+strPassword); //数据库的字串

             

       //使用ADOX::CatalogPtr来创建mdb文件:

       HRESULT hr = S_OK;

       hr=::CoInitialize(NULL);

       if(SUCCEEDED(hr))

       {

              HRESULT hr = S_OK;

              try

              {

                     ADOX::_CatalogPtrm_pCatalog = NULL;

                     hr=m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog));

                     if(FAILED(hr))

                     {

                            _com_issue_error(hr);

}else

                     {

                            m_pCatalog->Create(_bstr_t(strcnn));//Create MDB

                     }

              }catch(_com_error e)  //异常处理

{//错误显示}

       }

       ::CoUninitialize();

       return TRUE;

}

2、用程序在系统中创建Access的数据源名称DSN:

手工配置ODBC的数据源名称,大家也不陌生。而通过程序动态建立ODBC的DSN,在有安装程序的情况下也需要它。它是在已有数据库文件的情况下建立数据源名称。

       BOOLCRecord::CreatAccessDSN()

{

              CString DBID ,lpszFile=DBPath+DBName;

              int mlen;

              char* szDesc=new char[512];

              sprintf(szDesc,"DSN=%s?UID=%s?;PWD=%s?;DESCRIPTION=;?DBQ=%s?\

FIL=MicrosoftAccess?DEFAULTDIR=%s??"\

                     ,DBName,DBID,DBPasswd,lpszFile,DBPath);

              mlen=strlen(szDesc);

              for(int i=0;i<mlen;i++)

              {

                     if(szDesc[i]=='?')    szDesc[i]='\0';

              }

              if(SQLConfigDataSource(NULL,ODBC_ADD_DSN,"MicrosoftAccess\

                    Driver (*.mdb)\0", (LPCSTR)szDesc)) return TRUE;

              ……

}

3、动态建数据库表

       一种方法可以通过一个配置数据库表的txt文件,它包括创建数据表的SQL语句,程序读入该文件的,并分析该文件的内容,得到一SQL字串,进行创建,这种方法建表比较灵活;另一种方法也可以通过有包括创建Access数据表SQL语句的程序代码创建。两种创建方法都要注意在字段名与它的字段类型之间必需用tab键隔开。如下,采用后者:

       try

       {

              VARIANT* RecordsAffected=0;

              CStringstrSQL=\

"CREATE TABLE accesstable(ID  longinteger ID ENTITY(1,1) not null,";

              strPSW=strPSW+"name        text(10)not null,";

              strPSW=strPSW+"cash  DOUBLE,remark   text(100));";   //SQL字串

              m_pCon->Execute((_bstr_t)(LPCTSTR)strSQL,NULL,adExecuteNoRecords);

       }

       catch(_com_error&e)    { …… }

       用VC++程序来动态建库很多数据类型不支持,但表名、字段名可以是变量。

4、数据库的连接和关闭

       boolCRecordSonPrg::CreatConnect()   //数据库的连接

{

CStringstr="Provider=MSDASQL.1;Password='"+DBPasswd+"';\

              PersistSecurity Info=True;Data Source="+DBName;  //连接字串

              try

              {

                     m_pCon.CreateInstance(__uuidof(Connection));

                     m_strConnection = _T(str);  

                     intbCon=m_pCon->Open(_bstr_t(m_strConnection),"","",adConnectUnspecified);

              }

              catch(_com_error &e)    { ……    }

              return true;

}

voidCRecordSonPrg::CloseConnect()  //数据库的关闭

{

       try

       {

              m_pCon->Close();  //关闭连接

              m_pCon.Release(); //释放

       }

       catch(_com_error &e){ ……       }

}

5、用ADO对数据库记录的增、删、改、存、查、排序、过滤、打印

       //打开一个数据表DBtable

       m_pRs.CreateInstance(__uuidof(Recordset));

       m_strCmdText= _T("DBtable");

       m_pRs->Open((LPCTSTR)m_strCmdText,(LPCTSTR)m_strConnection,adOpenStatic,adLockOptimistic,adCmdTable);

       ①增加记录:

       try

       {

              if(!m_pRs->Supports(adAddNew))return false;

              m_pRs->AddNew();

       m_pRs->Fields->GetItem("user")->Value=(_variant_t)strm_newuser;

              ……

             m_pRs->Update();

       }

       ②删除记录:

       try

       {    

              m_pRs->Delete(adAffectCurrent );      //删除当前记录

       }

       ③改动、保存记录:

       voidCRsCgDlg::SaveModifiedRecord()       //记录修改后保存

       {

              ……       //拷贝对话框数据到ADOC++ 绑定成员

              //调用ADO数据绑定更新模式的接口

              HRESULThr = m_piAdoRecordBinding->Update( (CADORecordBinding*)this );

       }

       ④查找记录:

       CStringtemp ="user='"+m_FindUserName+"'";  

//查找字串

       _bstr_ttemp1=(_bstr_t)temp;                                  

//类型转换为_bstr_t

       m_pRs->Find(temp1,0,adSearchForward,"");

       ⑤排序记录:

CString temp="’user,"+m_FindUserName+"'";  

//排序字串

       _bstr_ttemp1=(_bstr_t)temp;                                  

//类型转换为_bstr_t

m_pRs->Sort=(temp1);

m_pRs->Sort=("");                                          

//取消排序

⑥过滤记录:

CStringstrfilter = _T("name = '"+m_strFilter+"'");    

//过滤字串

m_pRs->Filter= (_variant_t)strfilter;

m_pRs->Filter= (long) adFilterNone;        

//取消过滤

       ⑦打印记录:

       打印记录可以采用CDocument类的serialize()文档类的方式,也可以借助显示控件实现。这里是用FlexGrid控件编写的打印代码。

       voidCMyApp::PrintToText()

{

              CStringcFilePath = "C:\\Documents and Settings\\Administrator\\";

              CString cFileName = "打印统计表.txt";

              CString cFile = cFilePath+cFileName;

CStdioFile file; 

//CStdioFile类是CFile类的派生类,它是以流方式操作文本

              file.Open(cFile,CFile::modeCreate|CFile::modeWrite|CFile::typeText)

CString str;

              str.Format("%s\n\n",cFileName);      

//格式化文件主题

              file.WriteString(str);                   

//写入文件主题

              int RowCount = m_MSFGrid.GetRows();   

//从FlexGrid控件表取行数

              int ColCount = m_MSFGrid.GetCol();       

//从FlexGrid控件表取列数

              for(long r=0;r<RowCount;r++)     //行循环

              {

                     for(long c=0;c<ColCount;c++)     //列循环

                     {

                            CString Matrix =m_MSFGrid.GetTextMatrix(r,c);

//得到r行c列的文本

                            switch(c)

                            { str.Format( …… );//产生打印格式 }

                            file.WriteString(str);

                     }

              }

              file.SetLength(file.GetPosition());     

//设置文件长度

              file.Close();                      

//关闭文件

              str="notepad "+cFile;

              WinExec(str,SW_SHOW);            

//利用记事本打开生成的文本文件

}

6、配置设置文件:

为了增加程序的灵活性,对配置文件的读、写也是必要的。Windows操作系统专门为此提供了6个API函数来对配置设置文件进行读、写:  

GetPrivateProfileInt()               

//从私有初始化文件获取整型数值  

GetPrivateProfileString()  

//从私有初始化文件获取字符串型值  

GetProfileInt                    

//从win.ini获取整数值  

GetProfileString                      

//从win.ini获取字符串值  

WritePrivateProfileString  

//写字符串到私有初始化文件  

WriteProfileString      

//写字符串到win.ini 

下面采用私有初始化文件获取或写入字符串型值的函数来读写配置文件:

       读文件:

       CStringCMyApp::GetOneIniData(CString sFilePath)

{

              CString str;

              char buf[256] =NULL;

              int len=0;

              len = GetPrivateProfileString(

                     "Custom",      //节名

                     "UserName"   //项名

                     "No",             //没找到此项时的返回值

                     buf,               //目标缓冲区地址

                     256,               //目标缓冲区长度

                     sFilePath        //配置文件的准确路径

              );

              str=buf;

              return str;

}

写文件:

BOOLCKaApp::WriteIniData(CString cstr,CString strUserName)

{

       CString sFile = cstr;

       CFileStatus status;  

       BOOL RetUser=WritePrivateProfileString(

              "Custom",             //节名

              "UserName",         //项名

              strUserName,         //内容

              sFile                            //配置文件的准确路径

              );

              returnTRUE;

       }

对于SQL Server的操作类似。

时间: 2024-10-31 04:32:40

VC++6.0MFC编程心得的相关文章

入门级技巧:FLASH 编程心得

编程|技巧|心得 其实我本人水平也不怎么样,今天之所以搞出个编程心得(主要是自己的一点点经验总结)的介绍,主要是想帮助有兴趣往深处研究AS的朋友,由于个人的水平有限,其中难免有谬误,欢迎大家讨论纠正.一来,帮助我进步:二者也是更重要的是,防止初学者养成不好的编程习惯! 废话说多了,下面开始: 一.FLASH有三个地方可以加代码,关键帧,MC(影片剪辑),按钮. 1.关键帧上加代码的灵活性很大,建议初学者:能写在MC或者按钮上的代码,就尽量不要写在关键帧上,关键帧上添加代码后,会出现一个a,如图一

c++-VC++与VC#的windows编程有区别吗??使用的类库一样吗??

问题描述 VC++与VC#的windows编程有区别吗??使用的类库一样吗?? VC++与VC#的windows编程有区别吗??使用的类库一样吗?? 比如这个里面的一些框架函数如Button等的使用相同吗? 解决方案 微软为C++做了一些扩展,搞出一种向下兼容C++,但是又有自己的语法以兼容.net的语言,叫C++/CLI(以前叫C++ ME,托管扩展) VC++/CLI可以同时支持MFC和.NET.但是事实上几乎没有人用,是很冷僻的技术. 相比较MFC,WinForms和WPF要好太多,C#也

vc++图像-VC++中图形编程一些函数定义问题

问题描述 VC++中图形编程一些函数定义问题 有没有知道下列几个函数的函数定义即函数体的?获取窗口显存指针函数GetImageBufferCOLORREF BGR(COLORREF color);(显存操作绘制烟花)SetWorkingImage( &fm );(储存烟花的像素点颜色)loadimage( &fm./fire/flower.jpg"" 3120 240 );(储存烟花的像素点颜色)

vc++6.0MFC如何用基于对话框获取实时数据画曲线图?

问题描述 vc++6.0MFC如何用基于对话框获取实时数据画曲线图? 在vc++6.0下,将文件中前2通道的数据读出,并在界面上显示其形状,能放大和缩小波形,以便看到更多波形的细节. 文件后缀名:.cmc 解决方案 用mschart控件http://blog.csdn.net/youoran/article/details/8460875http://blog.sina.com.cn/s/blog_9a2a952201018ey9.html

c语言 编程-DirectX 9.0 Summer 2004 SDK和VC++6.0编程时总是出现问题,怎么办???

问题描述 DirectX 9.0 Summer 2004 SDK和VC++6.0编程时总是出现问题,怎么办??? #define DIRECTINPUT_VERSION 0x0800 //声明DirectX Input的版本是8.0 #ifndef _WIN32_DCOM #define _WIN32_DCOM #endif #define pr printf #pragma once #define INITGUID //确保INITGUID已被定义 #define INTERFACE IDi

Android编程心得分享——JSON学习过程_Android

让我说说Android编程心得,在我们初步学习JSON时我们都知道JSON作为现在比较流行的数据交换格式,有着它的许多优点,Android的WEB应用中更是广泛用到了它,这里将我学习JSON的过程记录如下 在Android的Android.jar包中已经默认引入了这个包,这里我们就可以直接调用它了 JSON有五种基本类型,分别是object,array,value,string,number Object 以下面这个为例 {"person":{"id":100,&q

Android编程心得分享——JSON学习过程

让我说说Android编程心得,在我们初步学习JSON时我们都知道JSON作为现在比较流行的数据交换格式,有着它的许多优点,Android的WEB应用中更是广泛用到了它,这里将我学习JSON的过程记录如下 在Android的Android.jar包中已经默认引入了这个包,这里我们就可以直接调用它了 JSON有五种基本类型,分别是object,array,value,string,number Object 以下面这个为例 {"person":{"id":100,&q

VC操作XML编程实例

xml|编程 XML编程实例 文章正文 前段时间,由于工作的需要,利用到了XML,所以对其进行了一些简单的研究.在此愿把一些心得写出来,与各位分享,不对的地方还望多多包涵. 1.什么是 XML? 首先,我想各位应该都已经大概知道什么是XML了.如果,你对什么是XML还没有一个概念的话,你可以看一些相关的材料,我就不多说了. 2.为什么要用XML? 其实,刚开始我也不是很明白,后来在工作中才慢慢意识到.首先,我写的程序需要传送很多的数据结构,比如表格,目录树等等.要在以往,我想自己会去定义一个数据

谈谈学习ASP动态网页制作技术的编程心得

学好一门编程语言有两个条件是必不可少的,一是理论与实践结合,在实际例程去验证书本上的理论能加深你对理论的理解:二是学会总结,把学习.运用中的心得体会记下来,当成一种经验或者教训加以提炼并在日后的应用中加以改进,一定能提高你对这门编程语言的认识.以下是笔者在学习与运用ASP编程中的两点经验,希望能对大家有所帮助. ASP页面内VBScript和JScript的交互 ASP具备管理不同语言脚本程序的能力,能够自动调用合适的脚本引擎以解释脚本代码和执行内置函数.ASP开发环境提供了两种脚本引擎,即VB