近期写一个数据库的课程设计,用的是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里面的就不变了,这个能够自己随便写,没有影响的。

以下就是基本的了,首先要做的就是加入成员变量,在主对话框右键单击->类向导->成员变量,然后就是自己加入成员,这里要注意的是类型,这个类型为什么要这么写,下文我会一一说明

  这些基础工作都做好之后,接下来就是加入ODBC使用者了,这里的ODBC使用者的加入也非常easy,类向导->加入类->MFC ODBC使用者
然后PV数据源,点击机器数据源
要注意的是这里的数据源是须要自己去配置的,具体的配置方法这里就不具体介绍了,百度上随便搜一下都有好多,也非常easy,基本上3分钟就能配置好,我这里用的数据源已经是配置好的了,叫Test,配置好数据源之后就会生成一个类,这个类的名字就是SQL 2008里面列的名字,比方我这里就是CKC,由于我的数据库中的列就是KC。以下我们来看下这个类里面有什么内容。以下是.h文件的一些内容。
        CString m_cno;

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_cno,m_cname,m_xf当中m_cno,m_cname是CStringA类型的,仅仅只是我把它改成了CString,CStringA是和UNICODE有关的,这里我们临时不须要考虑编码的问题,所以直接改成CString。
  这就是为什么刚刚加入的成员变量的类型是CString,CString,long,要和这个类里面的类型一样。
再来看看.cpp文件的一些内容,比較重要的是
m_cno = "";

m_cname = "";

m_xf = 0;

m_nFields = 3;

m_nDefaultType = dynaset;
这个是类生成初始化的结果,GetDefaultConnect()这个函数返回的是连接字符串,里面包含DSN,UID,PSW等等,自己能够去看看,由于包含了帐号和password,这里我就不贴出来了,其它的都没什么。OK,如今我们正式開始实现对数据库的操作,在MFC界面上双击查询BUTTON,这时候我们就会进代码界面了。
  開始,我们要做的是对List Control进行初始化,废话不多说,上代码。
  首先,须要自己写一个初始化函数,这个函数是BOOL CXSKC::OnInitDialog(),实际上这个函数应该是在生成dlg时候就有的,可是不晓得为什么我生成的时候没有,非常愚蒙,可能是之前的步骤弄错了,可是这不影响,假设有的就直接在函数里面写,假设没有就自己加一个函数进去,非常easy吧。
函数里面的内容是
UpdateData(FALSE);

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;
这个是对List Control的一些初始化,详细含义非常easy,随便查一查都知道,没什么好说的。
  然后找到DoDataExchange()函数,在函数里面加上这些代码CDialogEx::DoDataExchange(pDX);

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"");
这个也没什么好说的,都非常easy。如今,List Control就初始化好了,接下来就是重中之重了,查询的实现。SQL 中的查询语句是select * from KC where cno =。。。,由于cno是主键,为了简洁,我们就仅仅用主键查询就能够了。
void CXSKC::OnBnClickedButton1()//这个就是查询button的代码

{

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

}
我解释一下,要操作数据库,首先要做的就是打开数据库,CKC定义一个对象,调用open()函数,打开数据库之后把EDIT里面的内容给str,三个EDIT相应三个str,注意顺序不要错了,不然就悲剧了。然后,须要调用一个movefirst()函数,移动到第一个记录,这样就能够从头到尾顺序的扫描表了(大概的过程就这样),毕竟不是专业的数据库project师,对于数据库的深入理解还不够。。。然后就是sql语句了,CString
创建一个对象,用来存放sql语句,Format()函数真是一个好东西,我太喜欢这个函数了,它能够把后面str的内容插入‘%’,简直就是神器啊!s说明的是一个字符串,还有u,等等,有兴趣的能够自己去了解一下。MessageBox()是我用来測试SQL语句对不正确的,ListAll()函数是须要自己写的,以下是ListAll()函数的代码。
void CXSKC::ListAll(CString str)

{

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

}
说明一下,t.Format(L"%Id",m_kc.m_xf);

    const TCHAR * ip = (LPCTSTR)t;
    MyCjList.SetItemText(index,2,t);
这两句是一个简单的类型转换,设计到LPCTSTR类型,所以有些麻烦。
这样就写好了查询BUTTONbutton了,接下来就是加入,删除和改动了,详细的思想都差点儿相同,假设查询能搞清楚,那么其它的应该非常easy就写出来,以下我把代码贴上来。
oid CXSKC::OnBnClickedButton2()//加入

{

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

}
这些代码都非常easy,用CDataBase类生成一个对象,这个对象来调用ExecuteSQL(),这个函数能够运行SQL语句。
然后就是异常处理机制,这些就不详细多说了。
注意的是:1.每调用一次open()都要调用一次close();不要忘记了,不然会出现无法操作数据库的情况,切记切记!
                    2.记得#include “afxdb.h"。仅仅有include了这个头文件之后才干用CDataBase。

剩下的就没什么好说的,主要的就是这样,假设大家还有什么意见和建议或者发现了文章有什么写的不对的地方欢迎指正~!
卖个萌哈哈~!感谢阅读!

VS2012+SQL2008+ODBC编程,第一篇博客,写的不好忘各位大神指点一二~的更多相关文章

  1. “Hello, my first blog”------第一篇博客的仪式感

    本人在校大学生一枚,开通博客,主要是想记录自己的学习过程,分享自己的学习经历.记得大一的时候,很多不懂的操作和知识,都是在博客上找到了相应的解决办法.但比较讽刺的是,很多时候,曾经解决了的问题,当再次 ...

  2. C博客作业00—我的第一篇博客

    C博客作业00-我的第一篇博客 1. 你对网络专业或者计算机专业了解是怎样? 泛泛了解 - 原先只知道网络工程隶属于计算机工程学院,与院中其他专业一样,同样都需要学习大量的计算机基础知识,然后再分支学 ...

  3. 第一篇博客:Hello World

    2016年10月10日,双十,好日子,决定开始写第一篇博客,标题想了会,就叫Hello World 吧,哈哈^_^. 首先感谢博客园的管理们能批准我的申请,记得在14年的时候申请过一次,竟然没申请通过 ...

  4. 我的第一篇博客 ——【ToDoList】小程序开发

    我是一只即将大四的大三狗,这是我的第一篇博客,说来惭愧.今年1月份,学校放寒假的时候开始自学的IOS,放假的时候比较起劲,看了一堆Object-C的视频,然后照着中英文对照的IOS基础开发教程,做了两 ...

  5. Hello World -- 第一篇博客

    今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...

  6. Ginger的第一篇博客

    怀着无感的心情,没有技术的身体,写下第一篇博客作为标记. 目前应该会搞清楚数据结构上相关的操作.算法,然后用c语言实现后记录在博客. 我是有目标的咸鱼! 2019/4/19

  7. 我的第一篇博客。(JavaScript的声明和数据类型的一些笔记)

    这是我的第一篇博客,务必请大家多多关照. 下面是前端js的变量和数据类型的一些笔记,不是很全请多多包涵. 1.变量 变量的声明 var 变量名 变量这个容器中放的是数据 变量的赋值 变量名 = 数据 ...

  8. 我的第一篇博客:不用sizeof求int的bit数

    我的第一篇博客..  还不会什么高端的东西就来点基础的. 不用sizeof求int的bit数 //不用sizeof求int的bit数 #include<stdio.h> int main( ...

  9. 第一篇博客 安装open live writer

    第一篇博客安装open live writer http://openlivewriter.org/ 有的人可能会打不开,所以我准备了一个百度云的链接地址 链接:https://pan.baidu.c ...

随机推荐

  1. c++面试知识点

    static #include<stdio.h> #include<iostream> #include<assert.h> using namespace std ...

  2. html和css实现一级菜单和二级菜单学习笔记

    实现一级菜单: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...

  3. Objective-C(十八、谓语使用及实例说明)——iOS开发基础

    结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,仅仅是作为參考,以苹果官方文档为准~ 十八.谓语的使用及 ...

  4. LinearLayout使用简单实例

    1.代码 import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActionB ...

  5. SQL Server 2008 geometry 数据类型

    摘自SQL Server 2008帮助 平面空间数据类型 geometry 是作为 SQL Server 中的公共语言进行时 (CLR) 数据类型实现的.此类型表示欧几里得(平面)坐标系中的数据. 注 ...

  6. Qt Creator下载

    Qt官网 http://qt.digia.com qt的历史版本可以到http://download.qt-project.org/archive/qt/下载

  7. (译+原)std::shared_ptr及std::unique_ptr使用数组

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462363.html 参考网址: http://stackoverflow.com/questions ...

  8. (原)调用jpeglib对图像进行压缩

    网址:http://www.cnblogs.com/darkknightzh/p/4973828.html.未经允许,严禁转载. 参考网站: http://dev.w3.org/Amaya/libjp ...

  9. Js中单引号和双引号的区别

    <html> <body> <input value="外双引号内双引号-错误" type="button" onclick=&q ...

  10. activiti笔记四 关于部署信息表act_re_deployment

    一.简要描述 部署流程定义时需要被持久化保存下来的信息.二.表结构说明 字段名称 字段描述 数据类型 主键 为空 取值说明 ID_ ID_ nvarchar(64) √ 主键ID NAME_ 部署名称 ...