VS2012+SQL2008+ODBC编程,第一篇博客,写的不好忘各位大神指点一二~
近期写一个数据库的课程设计,用的是C++ MFC 。最開始用的是ADO技术,可是苦于网上大部分的教程都是VC6.0的,对着教程敲了4,5遍还是执行不成功。我用的IDE是VS2012,毕竟VC6.0和VS2012之间的差距太大了,所以就改成了ODBC编程,实际上ODBC对于数据库类的操作封装的非常好,能够非常方便的使用相关的函数并且不须要自己去写一些异常处理机制,对于新手来说是非常方便的,网上也有非常多的ODBC教程,我照着网上的VS2010的ODBC教程然后加上自己的理解写了一个学生成绩管理系统,非常easy,可是也基本上能把ODBC的思想和简单的使用方法说清楚了,声明:此文章仅适合刚刚接触数据库的新手以及相关专业的大学生,大神就能够直接忽略了,如有大神看了文章后对代码或者思想提出宝贵的改进意见,在下不胜感激!
OK,废话不多说。首先打开VS2012->建立一个MFC应用程序(基于DIALOG),然后就是自己拉EDIT和BUTTON了,这个非常easy,基本学过一点MFC的都晓得怎么去弄,大小间距什么的就不具体介绍了,VS2012->格式,里面有对齐和使大小同样,自己去弄就能够了,基本上4个static,4个EDIT,四个BUTTON,一个List Control,注意的是List Control的格式设置为report。
这个就是我的基本界面,cno是课程号,cname是课程名,xf是学分,由于数据库中就是这么写的,所以static里面的就不变了,这个能够自己随便写,没有影响的。
以下就是基本的了,首先要做的就是加入成员变量,在主对话框右键单击->类向导->成员变量,然后就是自己加入成员,这里要注意的是类型,这个类型为什么要这么写,下文我会一一说明
E9DC)R4LLWOE%]K.jpg)
CString
m_cname;
long m_xf;
// 重写
// 向导生成的虚函数重写
public:
virtual CString GetDefaultConnect();
// 默认连接字符串
virtual CString GetDefaultSQL();
// 记录集的默认 SQL
virtual void DoFieldExchange(CFieldExchange* pFX);
// RFX 支持
// 实现
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
m_cname = "";
m_xf = 0;
m_nFields = 3;
m_nDefaultType = dynaset;
MyCjList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_TWOCLICKACTIVATE);
MyCjList.InsertColumn(0,L"xf",LVCFMT_CENTER,80,0);
MyCjList.InsertColumn(0,L"cname",LVCFMT_CENTER,160,0);
MyCjList.InsertColumn(0,L"cno",LVCFMT_CENTER,80,0);
return TRUE;
DDX_Control(pDX, IDC_LIST1, MyCjList);
DDX_Text(pDX, IDC_EDIT1, MyCno);
DDX_Text(pDX, IDC_EDIT2, MyCname);
DDX_Text(pDX, IDC_EDIT3, MyXf);
GetDlgItem(IDC_EDIT3)->SetWindowTextW(L"");
{
// TODO: 在此加入控件通知处理程序代码
CKC MyKC;//XS类操作对象
MyKC.Open();
MyKC.MoveFirst();
CString str1,str2,str3;
GetDlgItem(IDC_EDIT1)->GetWindowTextW(str1);
GetDlgItem(IDC_EDIT2)->GetWindowTextW(str2);
GetDlgItem(IDC_EDIT3)->GetWindowTextW(str3);
CString sql;
sql.Format(L"select * from KC where cno = '%s'",str1);
MessageBox(sql);
ListAll(sql);
}
创建一个对象,用来存放sql语句,Format()函数真是一个好东西,我太喜欢这个函数了,它能够把后面str的内容插入‘%’,简直就是神器啊!s说明的是一个字符串,还有u,等等,有兴趣的能够自己去了解一下。MessageBox()是我用来測试SQL语句对不正确的,ListAll()函数是须要自己写的,以下是ListAll()函数的代码。
{
MyCjList.DeleteAllItems();
MyCjList.InsertItem(0,L"");
CKC m_kc;//类的对象,用来调用操作数据库函数
try
{
if(m_kc.IsOpen())
{
m_kc.Close();
}
if(!m_kc.Open(CRecordset::snapshot,str))
{
MessageBox(L"数据库打开失败",L"数据错误",MB_OK);
return;
}
}
catch(CDBException *e)
{
e->ReportError();
}
int index = 0;
//int line = 0;
CString t;
m_kc.MoveFirst();
while(!m_kc.IsEOF())
{
//MessageBox(L"123");
MyCjList.SetItemText(index,0,m_kc.m_cno);
m_kc.m_cname.Remove(' ');
MyCjList.SetItemText(index,1,m_kc.m_cname);
//MessageBox(m_xs.m_name);
t.Format(L"%Id",m_kc.m_xf);
const TCHAR * ip = (LPCTSTR)t;
MyCjList.SetItemText(index,2,t);
m_kc.MoveNext();
index++;
}
m_kc.Close();
}
const TCHAR * ip = (LPCTSTR)t;
{
// TODO: 在此加入控件通知处理程序代码
CString str1,str2,str3;
GetDlgItem(IDC_EDIT1)->GetWindowTextW(str1);
GetDlgItem(IDC_EDIT2)->GetWindowTextW(str2);
GetDlgItem(IDC_EDIT3)->GetWindowTextW(str3);
CString sql;//sql语句
CDatabase m_xs;//对象
m_xs.Open(L"Test",FALSE,FALSE,L"ODBC;UID=;PWD=;");
try{
if(str1.IsEmpty()||str2.IsEmpty()||str3.IsEmpty())
{
MessageBox(L"输入的信息不完好请完好后在插入数据",L"提示");
MyCno = (L"");
MyCname = L"";
MyXf = _ttoi(L"");
UpdateData(FALSE);
}
else
{
sql.Format(_T("insert into KC values('%s','%s','%s')"),str1,str2,str3);
MessageBox(sql);
m_xs.ExecuteSQL(sql);
MessageBox(L"加入成功!",L"提示");
//UpdateData(FALSE);
}
}
catch(CDBException ex)
{
MessageBox(L"插入异常");
ex.ReportError();
ex.Delete();
}
m_xs.Close();
}
void CXSKC::OnBnClickedButton3()//删除
{
// TODO: 在此加入控件通知处理程序代码
CString str1,str2,str3;
GetDlgItem(IDC_EDIT1)->GetWindowTextW(str1);
GetDlgItem(IDC_EDIT2)->GetWindowTextW(str2);
GetDlgItem(IDC_EDIT3)->GetWindowTextW(str3);
CString sql;//sql语句
CDatabase m_xs;//对象
m_xs.Open(L"Test",FALSE,FALSE,L"ODBC;UID=;PWD=");//帐号与password我就不写了,自己把自己的SQL的帐号与password写上就好。
sql.Format(L"delete from KC where cno = '%s'",str1);
try{
if(str1.IsEmpty())
{
MessageBox(L"信息不完整",L"提示");
UpdateData(FALSE);
return;
}
else
{
//sql.Format(L"delete from KC where cno = '%S'",str1);
MessageBox(sql);
m_xs.ExecuteSQL(sql);
MessageBox(L"删除成功!",L"提示");
}
}
catch(CDBException ex)
{
ex.ReportError();
ex.Delete();
}
m_xs.Close();
}
void CXSKC::OnBnClickedButton4()//改动
{
// TODO: 在此加入控件通知处理程序代码
CString str1,str2,str3;
GetDlgItem(IDC_EDIT1)->GetWindowTextW(str1);
GetDlgItem(IDC_EDIT2)->GetWindowTextW(str2);
GetDlgItem(IDC_EDIT3)->GetWindowTextW(str3);
CString sql;//sql语句
CDatabase m_xs;//对象
m_xs.Open(L"Test",FALSE,FALSE,L"ODBC;UID=;PWD=;");
sql.Format(L"update KC set cno = '%s' , cname = '%s',xf = '%s' where cno = '%s'",str1,str2,str3,str1);
try
{
if(str1.IsEmpty()||str2.IsEmpty()||str3.IsEmpty())
{
MessageBox(L"信息输入不完整",L"提示");
UpdateData(FALSE);
return;
}
else
{
sql.Format(L"update KC set cno = '%s' , cname = '%s',xf = '%s' where cno = '%s'",str1,str2,str3,str1);
MessageBox(sql);
if(MessageBox(L"cno:"+str1+'\n'+L"cname:"+str2+'\n'+L"xf:"+str3+'\n',L"确认改动?",MB_OKCANCEL)==IDCANCEL)
{
return;
}
else
{
m_xs.ExecuteSQL(sql);
MessageBox(L"改动成功",L"提示");
}
}
}
catch(CDBException ex)
{
ex.ReportError();
ex.Delete();
}
m_xs.Close();
}
哈哈~!感谢阅读!VS2012+SQL2008+ODBC编程,第一篇博客,写的不好忘各位大神指点一二~的更多相关文章
- “Hello, my first blog”------第一篇博客的仪式感
本人在校大学生一枚,开通博客,主要是想记录自己的学习过程,分享自己的学习经历.记得大一的时候,很多不懂的操作和知识,都是在博客上找到了相应的解决办法.但比较讽刺的是,很多时候,曾经解决了的问题,当再次 ...
- C博客作业00—我的第一篇博客
C博客作业00-我的第一篇博客 1. 你对网络专业或者计算机专业了解是怎样? 泛泛了解 - 原先只知道网络工程隶属于计算机工程学院,与院中其他专业一样,同样都需要学习大量的计算机基础知识,然后再分支学 ...
- 第一篇博客:Hello World
2016年10月10日,双十,好日子,决定开始写第一篇博客,标题想了会,就叫Hello World 吧,哈哈^_^. 首先感谢博客园的管理们能批准我的申请,记得在14年的时候申请过一次,竟然没申请通过 ...
- 我的第一篇博客 ——【ToDoList】小程序开发
我是一只即将大四的大三狗,这是我的第一篇博客,说来惭愧.今年1月份,学校放寒假的时候开始自学的IOS,放假的时候比较起劲,看了一堆Object-C的视频,然后照着中英文对照的IOS基础开发教程,做了两 ...
- Hello World -- 第一篇博客
今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...
- Ginger的第一篇博客
怀着无感的心情,没有技术的身体,写下第一篇博客作为标记. 目前应该会搞清楚数据结构上相关的操作.算法,然后用c语言实现后记录在博客. 我是有目标的咸鱼! 2019/4/19
- 我的第一篇博客。(JavaScript的声明和数据类型的一些笔记)
这是我的第一篇博客,务必请大家多多关照. 下面是前端js的变量和数据类型的一些笔记,不是很全请多多包涵. 1.变量 变量的声明 var 变量名 变量这个容器中放的是数据 变量的赋值 变量名 = 数据 ...
- 我的第一篇博客:不用sizeof求int的bit数
我的第一篇博客.. 还不会什么高端的东西就来点基础的. 不用sizeof求int的bit数 //不用sizeof求int的bit数 #include<stdio.h> int main( ...
- 第一篇博客 安装open live writer
第一篇博客安装open live writer http://openlivewriter.org/ 有的人可能会打不开,所以我准备了一个百度云的链接地址 链接:https://pan.baidu.c ...
随机推荐
- python学习之路-4 内置函数和装饰器
本篇涉及内容 内置函数 装饰器 内置函数 callable() 判断对象是否可以被调用,返回一个布尔值 1 2 3 4 5 6 7 8 9 10 11 num = 10 print(callabl ...
- go - 复合类型 array, slice, map
Go 语言支持复合类型: 数组:array 切片:slice 指针:pointer 字典:map 通道:chan 结构体:struct 接口:interface 1. array 同一类型数据的集 ...
- androidHandler讲解
秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭". 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是 ...
- hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
Problem Description 小明自从告别了ACM/ICPC之后,就開始潜心研究数学问题了,一则能够为接下来的考研做准备,再者能够借此机会帮助一些同学,尤其是美丽的师妹.这不,班里唯一的女生 ...
- HDU 1863:畅通project(带权值的并查集)
畅通project Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hadoop多文件输出
现实环境中,经常遇到一个问题就是想使用多个Reduce,可是迫于setup和cleanup在每个Reduce中会调用一次,仅仅能设置一个Reduce,无法是实现负载均衡. 问题,假设要在reduce中 ...
- Rss 的作用 及使用方法
也可以参考http://jingyan.baidu.com/article/e73e26c0c73e1f24adb6a70f.html 什么是RSS RSS是站点用来和其他站点之间共享内容的一种简易方 ...
- DataList、Repeater、GridView中的Checkbox取值问题
先看页面代码 <asp:DataList id="DataList1" runat="server" Width="100%" Rep ...
- java静态成员的初始化过程
public class Price{ final static Price INSTANCE = new Price(2.8); static double initPrice = 20; doub ...
- git删除分支
git branch -d branchname删除一个分支需要具备的条件: 1 如果待删除的分支没有upstream branch,那么待删除的分支需要合并到HEAD上,否则需要使用-D强制删除 2 ...