zoukankan      html  css  js  c++  java
  • MFC 数据库编程 增删改查的一个例子

    1.先看下效果图:


    主界面:

    一个最简单的1对多的表,一张Article(文章)表,一张Category(类别)表。有添加,修改,删除文章按钮。点击类别编辑按钮就会跳到第二个对话框。点击数据库配置就会跳到第三个对话框。



    类别编辑的对话框,类别做了防止重复数据添加的功能。



    数据库配置的对话框,记录会保存到文件中。



    2.保存数据库信息到文件中。


    //写一条记录
    WritePrivateProfileString(
        LPCSTR lpAppName,
        LPCSTR lpKeyName,
        LPCSTR lpString,
        LPCSTR lpFileName
        );
    //读一条记录
    GetPrivateProfileString(
        LPCWSTR lpAppName,
        LPCWSTR lpKeyName,
        LPCWSTR lpDefault,
        LPWSTR lpReturnedString,
        DWORD nSize,
        LPCWSTR lpFileName
        );


    程序中保存的样子:



    3.连接Sqlserver 2000


    记得之前写.NET的程序时,非常简单就一条连接字符串。在MFC用ADO还有点麻烦。


    首先要在StdAfx.h文件里添加:


    #import "C:\program files\common files\system\ado\msado15.dll" rename_namespace("ADOBS") rename("EOF","adoEOF")
    using namespace ADOBS;


    然后在你MFC主App类的InitInstance方法中添加

    AfxOleInit();


    最后就是初始化连接数据库:


    CMFCDatabaseApp theApp;
    _ConnectionPtr m_pCon;  //ADO连接对象
    _RecordsetPtr m_pRs;
    _RecordsetPtr m_pRs1;
    _CommandPtr m_pCom;
    
    try
    	{		
    		CString temp;
    		char filepath[MAX_PATH];
    		GetModuleFileName(NULL,filepath,MAX_PATH);
    		
    		temp = theApp.ExtractFilePath(filepath);//获取可执行文件的路径
    		
    		//m_pCon.CreateInstance("ADODB.Connection");
    		CString strAdoConn;
    		char temp1[100];
    		
    		GetPrivateProfileString(ConfigTitle,ConfigServer,"127.0.0.1",temp1,100,temp+ConfigFileName);
    		strserver = (TCHAR *)temp1;
    		GetPrivateProfileString(ConfigTitle,ConfigDatabase,"",temp1,100,temp+ConfigFileName);
    		strdbName = temp1;
    		GetPrivateProfileString(ConfigTitle,ConfigUser,"sa",temp1,100,temp+ConfigFileName);
    		strUser = temp1;
    		GetPrivateProfileString(ConfigTitle,ConfigPWD,"123456",temp1,100,temp+ConfigFileName);
    		strPassword = temp1;
    		strAdoConn.Format("driver={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=%s", 
    			strserver, strUser, strPassword, strdbName);
    		m_pCon.CreateInstance(_uuidof(Connection));
    		m_pCon->ConnectionString = (_bstr_t)strAdoConn;
    		m_pCon->Open("","","",NULL);
    		m_pCom.CreateInstance("ADODB.Command");
    		m_pRs.CreateInstance(_uuidof(Recordset));	
    		
    		m_pRs1.CreateInstance(_uuidof(Recordset));
    		//	ADOFLAG = TRUE;
    		
    	}
    	catch(_com_error)
    	{		
    		//ADOFLAG = FALSE;
    		//Flag = FALSE;
    		MessageBox(0,"请检查系统配置信息", "数据库连接失败",MB_OK);		
    		return;
    	}
    	catch(...)
    	{	
    		AfxMessageBox("SYS Error");
    		return ;
    	}


    你最好还是下载整个程序看下比较清楚。这程序用的是MFC + Sqlserver2000。说起来也不好意思,2013年了还在用Sqlserver2000。没办法,一个很老的项目。


    4.执行Sql语句


    void CMFCDatabaseDlg::OnButtonAdd() 
    {
    
       CString title, body, author;
       GetDlgItemText(IDC_EDIT_TITLE, title);
       GetDlgItemText(IDC_EDIT_BODY, body);
       GetDlgItemText(IDC_EDIT_AUTHOR, author);
       int categoryId = m_categories.GetItemData(m_categories.GetCurSel());
    
    
       CString sql;
       sql.Format("Insert into Article(Title, Body, Author, CategoryId) values('%s','%s','%s',%d)",title,body,author,categoryId);
       try
       {
    	   m_pRs->raw_Close();
    	   m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
    	   MessageBox("操作成功.","提示",MB_OK|MB_ICONINFORMATION);
    	   LoadArticleInfo();
       }
       catch (...)
       {
    	   AfxMessageBox("操作失败");
       }
    }


    多的就不写出来了,大部分就是这种裸sql语句,想了下之前写ASP.NET MVC 用的linq to sql,一下子回到了解放前。


    写完这个程序的感觉就是,MFC做做简单的小应用还是不会难的,它封装了太多,微软的工具还是蛮好用的。


    5.怕上传的数据库有问题,把建表语句写在这里


    记得没有包含建数据库的语句,读者可以自己建一个叫做"MFCDatabase"的数据库。


    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Article_Category]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    ALTER TABLE [dbo].[Article] DROP CONSTRAINT FK_Article_Category
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Article]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Article]
    GO
    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Category]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Category]
    GO
    
    CREATE TABLE [dbo].[Article] (
    	[ID] [int] IDENTITY (1, 1) NOT NULL ,
    	[Title] [char] (30) COLLATE Chinese_PRC_CI_AS NULL ,
    	[Body] [ntext] COLLATE Chinese_PRC_CI_AS NULL ,
    	[Author] [char] (30) COLLATE Chinese_PRC_CI_AS NULL ,
    	[CategoryId] [int] NOT NULL 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[Category] (
    	[ID] [int] IDENTITY (1, 1) NOT NULL ,
    	[CategoryName] [char] (30) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
    
    


    项目下载:http://www.waitingfy.com/?attachment_id=595

    原文链接:http://www.waitingfy.com/?p=584


  • 相关阅读:
    DEDECMS5.5/5.6/5.7列表页调用TAG标签(热门标签)的两种方法
    DEDE列表页和内容页调用顶级栏目ID的方法
    解决dede图集上传图片时跳出302错误
    DEDE用{dede:sql}标签取出当前文档的附加表中的内容
    DEDE模板中如何运行php脚本和php变量的使用
    织梦DEDECMS {dede:arclist},{dede:list}获取附加表字段内容
    把DEDE的在线文本编辑器换成Kindeditor不显示问题
    ExtJS:文件上传实例
    ExtJS:GridPanel之renderer:function()和itemdblclick : function()方法参数详解
    ExtJS:菜单ComboBox及级联菜单应用
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3215077.html
Copyright © 2011-2022 走看看