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

MFC 数据库编程 增删改查的一个例子的更多相关文章

  1. shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)

    shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查) Shell脚本与MySQL数据库交互(增删改查) # 环境准备:安装mariadb 数据库 [ro ...

  2. 【转载】通过JDBC对MySQL数据库的增删改查

    通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...

  3. Mybatis学习笔记(二) 之实现数据库的增删改查

    开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...

  4. 用C#实现对MSSqlServer数据库的增删改查---DAL层

    说明:本人完成的工作是对传感器--超声波物位计进行硬件集成,上位机通过串口接收传感器数据并将其存到数据库中:在DAL层实现对数据库的增删改查,其中包含两个数据表分别是WaterLevelSet表和Wa ...

  5. [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?

    [译]聊聊C#中的泛型的使用(新手勿入)   写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...

  6. ThinkPHP实现对数据库的增删改查

    好久都没有更新博客了,之前老师布置的任务总算是现在可以说告一段落了,今天趁老师还没提出其他要求来更新一篇博客. 今天我想记录的是我之前做项目,自己所理解的ThinkPHP对数据库的增删改查. 首先要说 ...

  7. Android学习---数据库的增删改查(sqlite CRUD)

    上一篇文章介绍了sqlite数据库的创建,以及数据的访问,本文将主要介绍数据库的增删改查. 下面直接看代码: MyDBHelper.java(创建数据库,添加一列phone) package com. ...

  8. Android SQL语句实现数据库的增删改查

    本文介绍android中的数据库的增删改查 复习sql语法: * 增 insert into info (name,phone) values ('wuyudong','111') * 删 delet ...

  9. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

随机推荐

  1. 基于Http替补新闻WebService数据交换

    该系统的工作之间的相互作用.随着信息化建设的发展,而业界SOA了解并带来低TOC(总拥有成本)其他优势.越来越多的高层次的信息使用者关注. 这里暂且不提SOA这种架构规划.在系统间集成协议简单的讨论. ...

  2. Redis 中文入库成功,读取数据写入文件乱码问题

    近期须要用到redis ,可是在编码这个问题上,纠结了非常久.        需求 :每天一个进程将中文文件入库到redis中(不定时更新) ,另外几个进程读取redis中的信息 ,并处理数据结果.使 ...

  3. JS判断字符串是否全为中文

    //第一种代码(全为中文则返回"true",不全为中文则返回"false"): <script language="javascript&quo ...

  4. C# 解析bt种子

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...

  5. javaproject积累——java 反射 invoke

    铅: 在java工程,我们已经听到很多ORM的概念,我一直耿耿于怀,如何从上rs转换成了对象呢?难道要写非常多的推断吗?答案肯定是否定.我们就要探索怎么解决问题,刚好在研究我们系统底层架构的时候,挖掘 ...

  6. MVC 用扩展方法执行自定义视图,替代 UIHint

    MVC 用扩展方法执行自定义视图,替代 UIHint 项目中用了 Bootstrap , 这样就不用写太多的CSS了,省去很多事情.但是这个业务系统需要输入的地方很多,每个表都有100多个字段,每个页 ...

  7. C#快速随机按行读取大型文本文件

    原文:C#快速随机按行读取大型文本文件 下面是我实现的一个数据文件随机读取类,可以随机读取大型文本文件的某一行.在我机器上对一个130MB的文本文件,读取第200000的速度从传统做法的400ms提高 ...

  8. sql材料分级统计及汇总案例参考

    --第一步:根据系统编号.列.单价分组求和 select CLBH,DJ,sum(SL) as SL,sum(JE) as JE,Lie into #TempSZCMX from #ShouZhiCu ...

  9. Http Pipeline详细分析(下)

    Http Pipeline详细分析(下) 文章内容 接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件, ...

  10. c/c++中typedef详解

    1. typedef 最简单使用 typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4 你可以在任何需要 long 的上下文中使用 byte_4.注意 ty ...