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的数据源名称,大家也不陌生。而通过程序动态建立ODBCDSN,在有安装程序的情况下也需要它。它是在已有数据库文件的情况下建立数据源名称。

       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);

//得到rc列的文本

                            switch(c)

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

                            file.WriteString(str);

                     }

              }

              file.SetLength(file.GetPosition());     

//设置文件长度

              file.Close();                      

//关闭文件

              str="notepad "+cFile;

              WinExec(str,SW_SHOW);            

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

}

6、配置设置文件:

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

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的操作类似。
目录
相关文章
|
29天前
|
安全 算法 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits处理弱枚举和强枚举
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits处理弱枚举和强枚举
46 3
|
30天前
|
安全 算法 编译器
【C++ 泛型编程 进阶篇】深入探究C++模板参数推导:从基础到高级
【C++ 泛型编程 进阶篇】深入探究C++模板参数推导:从基础到高级
247 3
|
30天前
|
存储 算法 编译器
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
237 0
|
1月前
|
安全 算法 C++
【C++泛型编程 进阶篇】模板返回值的优雅处理(二)
【C++泛型编程 进阶篇】模板返回值的优雅处理
32 0
|
1月前
|
安全 算法 编译器
【C++泛型编程 进阶篇】模板返回值的优雅处理(一)
【C++泛型编程 进阶篇】模板返回值的优雅处理
43 0
|
1月前
|
存储 网络协议 C语言
【C/C++ 串口编程 】深入探讨C/C++与Qt串口编程中的粘包现象及其解决策略
【C/C++ 串口编程 】深入探讨C/C++与Qt串口编程中的粘包现象及其解决策略
79 0
|
30天前
|
算法 编译器 数据库
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
246 0
|
1月前
|
机器学习/深度学习 算法 编译器
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
47 0
|
30天前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
258 2
|
1月前
|
算法 安全 C++
【C++ 泛型编程 入门篇】深入探索C++的numeric_limits:全面理解数值界限(一)
【C++ 泛型编程 入门篇】深入探索C++的numeric_limits:全面理解数值界限
45 0

热门文章

最新文章