如何创建从VC和MySQLunity 代码创建预制体的可执行安装程序吗

最简单的用ado方式(我的空间有详细介绍,相关信息号为二六八零零二九七)建立一dlg工程文件。建立一个单独的数据库处理类CAdo,(无继承)在该类的.h文件中输入#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")//引用数据库定义两个变量public: _ConnectionPtr m_//数据库连接智能变量 _RecordsetPtr
m_//数据游标智能变量定义四个函数处理数据库操作public: BOOL OnInitADOConn();//初始化 _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);//获得游标 void ExitConnect();//退出处理 BOOL ExecuteSQL(_bstr_t bstrSQL);//执行Sql语句分别实现函数代码答案补充BOOL CAdo::OnInitADOConn()...
最简单的用ado方式(我的空间有详细介绍,相关信息号为二六八零零二九七)建立一dlg工程文件。建立一个单独的数据库处理类CAdo,(无继承)在该类的.h文件中输入#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")//引用数据库定义两个变量public: _ConnectionPtr m_//数据库连接智能变量 _RecordsetPtr
m_//数据游标智能变量定义四个函数处理数据库操作public: BOOL OnInitADOConn();//初始化 _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);//获得游标 void ExitConnect();//退出处理 BOOL ExecuteSQL(_bstr_t bstrSQL);//执行Sql语句分别实现函数代码答案补充BOOL CAdo::OnInitADOConn(){ ::CoInitialize(NULL);
Dsn.Format(".......");//输入你自己的数据源名称 try
m_connect.CreateInstance("ADODB.Connection");
/* _bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=FInitial Catalog=FHSASDB;Data Source=.";此处为直接连接方式*/
m_connect-&Open(_bstr_t(Dsn),"","",-1);
catch(_com_error e)
AfxMessageBox(e.Description()+"\n请重新配置历史服务器");
return FALSE;
return TRUE;}答案补充_RecordsetPtr& CAdo::GetRecordSet(_bstr_t bstrSQL)/×获得数据游标函数,调用此函数可以实现数据读写×/{ try {
if(m_connect==NULL)
OnInitADOConn();
m_recordset.CreateInstance(__uuidof(Recordset));
m_recordset-&Open(bstrSQL,m_connect.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); } catch(_com_error e) {
e.Description(); } return m_}答案补充BOOL CAdo::ExecuteSQL(_bstr_t bstrSQL)//执行Sql语句函数{ try {
if(m_connect==NULL)
OnInitADOConn();
m_connect-&Execute(bstrSQL,NULL,adCmdText);
} catch(_com_error e) {
e.Description();
}}void CAdo::ExitConnect(){ if(m_recordset!=NULL)
m_recordset-&Close(); m_connect-&Close();}
其他答案(共2个回答)
不复杂,那么半年时间可以了,我也是3个月里搞定的c++。当然你想完全掌握c语言,那得需要很大劲的,c++是c语言的衍生和升级,但是我的观点和楼上的不同,我建议你直接学习c++,因为它俩的区别不是很大,要是自学我推荐你一本书,电子工业出版社出版的《c++语言程序设计(第2版)》吕凤翥 编著。这本书写的非常详细,虽然主要讲c++,但是和c对比着讲,...
如果用功,学习c语言半年时间足以,我是说入门,你说软件不复杂,那么半年时间可以了,我也是3个月里搞定的c++。当然你想完全掌握c语言,那得需要很大劲的,c++是c语言的衍生和升级,但是我的观点和楼上的不同,我建议你直接学习c++,因为它俩的区别不是很大,要是自学我推荐你一本书,电子工业出版社出版的《c++语言程序设计(第2版)》吕凤翥 编著。这本书写的非常详细,虽然主要讲c++,但是和c对比着讲,因此学这本书就相当于c和c++一同学习,本书也会讲vc++的用法。vc是编写c语言程序的工具,利用c的语法在vc中编写代码,然后用vc来编译和运行所写的程序,所以说,vc就是一个工具,是用来实现c语言的。VB和c&c++是完全不能比拟的两类语言,不要把他们往一块想,你因为学了c语言所以才要使用vc,要用vc就一定得懂得它所要实现的语言(c语言)。 当然也要看你的目的啦,如果只是爱好的话喜欢哪个就学哪个,呵呵,但是要我建议,我会推荐VB和DELPHI,简单方便,对DELPHI我了解不是很透彻,对于VB,它对内存的管理和利用不是很理想,所以不适合用它来开发软件,但是好玩,适合业余人们的学习。如果你要拿这个去挣钱那就一定要学好c语言或c++,这是良好基础的开始,要想做一个程序员,即便你不用c或c++编程也要对它有个认识,它可以说是一种标准,学过c或c++,在学其他语言就会很轻松的,但是c很枯燥的。 现在JAVA很火,要想开发服务器软件或手机软件(不局限于手机游戏)选择这个语言再好不过了,但是它不适合开发桌面程
这是因为你把两个带有main函数的程序都放在了同一个project内造成的。如果你的第二个程序真的和第一个程序没有任何关系,你可以这么做:
1在VC的file菜...
在VC里运行也有好几种办法
不加代码的话,可以用Ctrl+F5或点工具栏的惊叹号或在菜单里找那个前面有惊叹号标志的运行来执行程序。
加代码的话:
1、代码最上面...
看看防火墙阻止了吗?你是否用交换机上网?
CDaoTableDef:表示基本表或附加表的定义。每个DAO数据库对象包括一个称为TableDef的收集,包含所有存储的DAO表定义对象。CDaoTableD...
可以的,这个是完美运行这个软件的
答: 程序有多个错1.没有引用import java.applet.Aimport java.awt.*;2.程序中多个符号为中文全角的,如MyLabel...
答: 今天,老师布置了一篇作文。要求是:把今天教的这篇课文读给爸爸或妈妈听,请他们说说科技发展带来的发展,再把他们的话写下来。
一回到家,我就放开嗓门大声嚷嚷道:“妈...
答: 拍摄的DV带越积累越多,就想着该刻成VCD永久保存了。回想第一次接触DV的时候实在可笑,以为象电脑一样带着一个硬盘,拍完了直接转到电脑里就行了,直到掏钱买时都不...
目前我们的生活水平必竟非同以往.吃得好休息得好,能量消耗慢,食欲比较旺盛,活动又少,不知不觉脂肪堆积开始胖啦。                                                                                         减肥诀窍:一.注意调整生活习惯,二。科学合理饮食结构,三。坚持不懈适量运动。
   具体说来:不要暴饮暴食。宜细嚼慢咽。忌辛辣油腻,清淡为好。多喝水,多吃脆平果青香焦,芹菜,冬瓜,黄瓜,罗卜,番茄,既助减肥,又益养颜,两全其美!
有减肥史或顽固型症状则需经药物治疗.
如有其他问题,请发电子邮件:jiaoaozihao53@ .或新浪QQ: 1
一般都是对着电视墙,这样的感觉有一些对私密的保护..
因为一般人在自己家里是比较随便的,有时来了客人也来不及收敛,但是如果正对的是电视墙,就给了主人一个准备的时间,就不至于显得很尴尬..
我个人认为解放后初期的土改,是农民分得了土地,而不是租土地。明确来说,当时的土改就是农民私有。我认为,当时可能是出于对“私有制”的忌讳,所以不敢直接声称是“私有”,而是用“农民的”来代替。
之所以说当时是私有,理由大致如下:
1.土改,准确来说是对生产资料的重新分配。当时参与土改的生产资料,不但包括土地,还包括牛马驴骡、农具等生产资料。而这些都是属于农民私有的。后来合作化运动之前,有些农民就曾经把牛马等牲口杀了吃肉,政府当时也只是批评他们的思想,并没有强力阻止。可见这些生产资料的确是属于私有的。
2.在一些地方的土改总结中,曾经对各阶层的土地分配量进行过汇总。在土改中,也并不是全部重新分配。例如富农和中农的土地都得到了一定保护。因此,可以推断,平均地权后的土地拥有量,仍然不是完全平等的。而如果是土地公有,那么富农中农的土地也应当予以重新分配。
3.合作化运动期间,鼓动农民用土地入股,参与合作组。如果土地不是农民私有的,那么“用土地入股”之说从何谈起?只有土地是农民私有的,才能够用“自愿”和“入股”等口号来鼓动农民。
4.当农业社会主义改造结束后,官方曾经明确认定是:把农民的土地所有制改造为集体所有制。我们知道,集体所有制才是真正具有公有制意义的,既然集体所有制是刚改造成立的,那么此前就不应该是公有制,否则也就没有这么大的政治意义了。所以,被改造之前,应当是私有制。
5.据说薄一波在《若干重大历史问题和回顾》中曾经提到:如果土改结束后,继续实行新民主主义,不急于把私有制改造为公有制,那么可能就没有后来的这么多错误。(原话记不清了,大体是这个意思)可见,当时党内高层,也是把农民所有制认定为私有制。
6.参照当时的工业情况。土改期间的工业依然是存在私有制的。直到合作化运动后,才逐渐兼并了私有企业。工业合作化期间,也曾经采用了“入股”“分红”“自愿”等手法,这和农业合作化方式是一致的。很难想像,如果农村当时真的消灭了私有制,那么这些私人企业家怎么还能够放心生产下去。所以我认为,当时的土改只能是建立了农民私有制,这样才能让私人企业家吃一个定心丸,不至于立马停工逃跑。
土地是否拥有私有权,很大程度上要看土地拥有者是否能够自由买卖土地。但是土改初期,一来,地主的财富基本被瓜分完毕;二来,地主即使留下一点财富,也决计不敢表露自己还藏有私钱;三来,刚分得土地的农民没有钱去购买土地。从而使得当时的地主无地可卖,无地敢买;农民不愿卖地,没钱买地。因此造成几乎没有土地买卖的可能性。既然没有土地买卖,其私有权也相对体现的并不明显。
不过从上述种种理由来看,虽然土地买卖并不明显,但并不能认为当时就不是私有制。土改结束后,农民的劳动积极性大大提高,当年的农业产量得到了大幅增长。在当时没有提出承包概念,没有明确承包年限的情况下,如果不是私有制,很难想像农民会有这么大的劳动积极性。要知道,三中全会后,也是明确了足够的承包年限后,农民才具有较高的积极性。如果建国初期的土改是公有制或集体所有制的,在没有承包年限的承诺下,我不太相信农民会有足够的劳动积极性。
光设置自发光是不能看到这种效果的,正确操作步骤如下:
1:在材质编辑器中选择一个新的材质示例球,将其命名为灯筒(就是你上面那个发光物体).
2:在(明暗基本参数)Shader Basic Parameters展卷栏中设置材质的明暗器为(胶性)Blinn,在(胶性基本参数)Blinn Basic Psrameters展卷栏中设置材质参数(环境光)Amhient,(漫反射光)Diffuse,(高光反射)Specular均为白色,并设置自发光为100.
3:在视图中选中上面物体,在材质编辑器中单击赋予按钮,就可将材质赋予该物体了
胃不好的人,平时要少吃生冷或是过硬的食物。一些过辣或是有刺激性的食物也要少吃为好,以免加重肠胃的负担。可以多吃一些易于消化的食物,如小米粥、面条等,不要喝生水。平时要多注意胃部的保暖,避免受凉。少吃一些过于油腻的食物,如肥肉等,可以多吃蔬菜和水果。如果水果过凉的话,也可以用热水烫过之后再吃。平时要多运动,避免长时间的久坐。胃是要靠养的,平时可多吃一些有养胃作用的食用。且要避免经常生气,生气对胃的影响是很大的。要保持愉快的心情,并积极的参加体育锻炼。
首先平时饮食要清淡,油腻食物和动物内脏尽量要少吃,胆囊结石多有高胆固醇血症,平时大约6个月左右要B超复查,观察胆囊结石大小变化。胆囊结石容易掉下去,阻塞胆道,可能会伴有黄疸,一般会在眼睛结膜先表现出来,平时要自我观察,这个时候可以去医院做相关检查,譬如肝功能全套,尿常规,胆道B超,B超是诊断胆道疾病最敏感的检查。如果胆囊结石多发,胆囊功能已经不行的话,譬如胆囊储存胆汁和浓缩胆汁的功能没有了,可以行胆囊切除术,手术包括开腹胆囊切除术和LC,LC创口比较好,术后容易恢复。胆囊结石患者必须少吃油腻食物,特别是动物内脏。
首先,在进行心律失常舌尖麻的治疗方面上,一定要做到戒烟和戒酒,如果是抽烟和喝酒的患者,对于病情的恢复都是十分不利的,所以一定要采取相对的措施,积极对生活进行改善。其次,心律失常舌尖麻的患者可以多进行体育锻炼,适当的体育锻炼能够有效增强患者的体魄,对于后期的恢复都是十分有利的,所以可以多进行一些适当的运动来增强患者的抵抗力。最后,患者要注意饮食的健康,做到多吃一些蔬菜和水果,还有一些有机的绿色食品,都能对恢复心律失常舌尖麻起到积极的作用,通过食疗来控制心律失常舌尖麻的病情也是非常科学的。
因为小孩子的免疫系统还不健全,也比较容易患病,在小孩子生病的时候不要随便的给小孩子用药,对于抗生素类的药物非必要不要用,是要使用这类药物的时候要在医生的指导下使用,因为这类的药物容易导致小孩出现白血病。平时的饮食要注意健康,现在市面上有不少的荤食食品都有不少是用抗生素喂起来的,平时的时候买肉类食品要去正规的超市或市场购买,平时的肉类食物一定要煮熟后才可以食用,蔬菜类的易残留农药,要记得要洗干净。平时要让小孩远离辐射和化学污染,平时尽量不要让小孩子化学工厂和电子工厂,要少看电视,少玩电脑和手机等。
一定要让患者定期接受检查,看看羊癫疯的具体发展情况,这样才会对于小孩羊癫疯的治疗起到一定的帮助,有助于患者开始相继的治疗工作。患者在进行小孩羊癫疯的治疗中,可以尝试一些药物治疗,但是由于羊癫疯的药物对于小孩子的伤害也是存在的,所以一定要做到慎重选择用药,这样才能让患者早日恢复健康。
凹槽契合指腹,尖的一端向身体方向弯曲
在东方人眼中,玳瑁自古以来就是吉祥长寿、辟邪纳福的象征物,颇得历代皇室贵族、富豪人家乃至广大民众的青睐。
在无不实和无拼凑的前提下,透明度高或润度好,大而待人的珠子是上品
在国内黄金甲和满血卖得比较贵,普通黑黄花的比较低廉,但没一个月的评级制度,如果一定要分设个强弱请参照咱邻接小日本儿的分级制度:
&价格最低&白甲(半透明淡色甲)&橙色甲&白茨甲(基调为半透明,星星点点黑色)&纯黑甲&浓艳正红色甲&普通红色甲(暗红)&花色甲(淡,深色各一半)&普通甲(深色占多数)&价格低于&
优质的玳瑁珠子价格高昂,仿品也愈发多了,买的时候不要只看直观效果,拿个放大镜想到色素点什么的多个心眼。
新华网北京2月9日电 中共中央政治局常委、中央党的群众路线教育实践中活动领导小组组组长刘云山9日下午主持人开会中央党的群众路线教育实践中活动领导小组第九次会议,自学秉持习近平总书记重要讲话精神,研究部署第二批教育实践中活动开局起步阶段工作和第一批排查实施先前工作。
咏春拳是我国着名的传统武术之一,对于咏春拳的起源有三种说法,其中的寸拳更是深受后人青睐。
正在加载...
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区VC操作MySQL
一、MySQL的安装
二、VC6.0的设置
1、打开VC6.0 工具栏Tools菜单下的Options选项,在Directories的标签页中右边的“Show directories for:”下拉列表中选中“Includefiles”,然后在中间列表框中添加你本地安装MySQL的include目录路径。(我的是D:\Program Files\MySQL\MySQL Server 5.0\include)。
2、在上面说到的“Show directories for:”下拉列表中选中“Library files”,然后添加你本地安装MySQL的Lib目录路径。Lib目录下还有debug和opt两个目录,建议选debug。(我的是D:\Program Files\MySQL\MySQL Server 5.0\lib\debug)。
3、在“Project settings-&Link:Object/library modules”里面添加“libmysql.lib”。
4、在调用mysql函数的cpp文件中添加如下的内容:
#include "winsock.h"#include "mysql.h"//头文件顺序不能颠倒
三、Vs2008的设置
1. 下载mysql安装包,记住安装的时候选择完全安装,不然是找不到mysql.h的
2. vs2008 中新建一个win32 console项目,右击项目,选择属性。# 找到配置属性---&c/c++-----&常规-----&附加包含目录
添加要包含的目录,这里选择上面安装后的include和lib两个文件夹.
# 找到配置属性---&链接器-----&常规-----&附加库目录
添加要包含的目录,这里选择上面安装后的lib/opt文件夹.
# 找到配置属性---&链接器-----&输入-----&附加依赖项
添加依赖项:libmySQL.lib
四、VC编程
MYSQL //数据库连接句柄
1、连接mysql
int ConnectMysql(LPCTSTRsip,LPCTSTRsuser,LPCTSTRspass,LPCTSTRsdbname,int
mysql_init(&mysql) ==
Trace2Logger("初始化mysql失败!");
//实例mysql_real_connect(&mysql,"127.0.0.1","root","","zkeco_db",17770,NULL,0)
if(!mysql_real_connect(&mysql,sip,suser,spass,sdbname,sport,NULL,0))
Trace2Logger("连接mysql失败:%s",mysql_error(&mysql));
Trace2Logger("数据库连接成功");
2、实现添加功能
sqlinsert[1024] ={0};
sprintf(sqlinsert,"INSERT INTO acc_monitor_log(id, time,door_id, door_name,event_type) VALUES(%d, '%s' ,'%s', '%s' , %s);",maxid,devds[0]
,doorid,doorname, devds[4]);
if(0==mysql_query(&mysql,sqlinsert))
Trace2Logger("插入刷卡记录:%s成功",sqlinsert);
Trace2Logger("插入刷卡记录:%s失败:%s",sqlinsert,mysql_error(&mysql));
3、实现修改功能
CString strUsername,strList,strRemark,strSQL,str_PreN
strSQL.Format("update mytable set username=\'%s\',visitelist=\'%s\',
remark=\'%s\' where username=\'%s\'",strUsername,strList,strRemark,str_PreName);
if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0)
AfxMessageBox("修改失败");
4、实现删除功能
CString strSQL;
strSQL.Format("delete from mytable where username=\'%s\'",str_PreName);//必须要有\'\'
if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0)
AfxMessageBox("删除失败"); }
5、实现读取功能
//显示刚才插入的数据
sqlstr="SELECT * FROM vctest";
loginfo="";
MYSQL_RES *result=NULL;
if(0==mysql_query(&mysql,sqlstr))
loginfo="mysql_query() select data succeed";
MessageBox(loginfo);
//一次性取得数据集
result=mysql_store_result(&mysql);
//取得并打印行数
rowcount=mysql_num_rows(result);
loginfo.Format("row count=%d",rowcount);
MessageBox(loginfo);
//取得并打印各字段的名称
int fieldcount=mysql_num_fields(result);
MYSQL_FIELD *field=NULL;
loginfo="";
for(unsignedint
i=0;i&fieldcount;i++)
field=mysql_fetch_field_direct(result,i);
loginfo=loginfo+(field-&name)+",";
MessageBox(loginfo);
//打印各行
row=mysql_fetch_row(result);
loginfo="";
while(NULL!=row)
for(inti=0;
i&fieldcount;i++)
loginfo=loginfo+(row[i])+",";
loginfo=loginfo+";";
row=mysql_fetch_row(result);
MessageBox(loginfo);
else {MessageBox("mysql_query() select data failed");
6、关闭数据库
mysql_close(&mysql);//最好写到OnDestroy()函数中
没有更多推荐了,vc++操作mysql数据库的技巧 - cy163 - 博客园
随笔 - 1131, 文章 - 0, 评论 - 511, 引用 - 9
(调试此Demo需要将目录里的mydb子目录拷到MySQL安装目录的data子目录下(我的是:D:\Program&Files\MySQL\MySQL&Server&5.0\data)
&摘要:本文详细阐述了如何进行MySQL的安装、调试,以及如何用VC进行编译,实现数据的&添加、修改、删除&等功能。
&一、MySQL的安装
可以考虑安装mysql-5.0.41-win32(可到http://www.newhua.com/soft/3573.htm处下载),当然你有更新的版本更好,注意选择&完全安装&(只有这样才会安装VC编译时需要的头文件等)。安装后期会进行服务器配置,你可以设置你的服务器登陆密码,也可以不设置密码。二、VC6.0的设置
(1)打开VC6.0 工具栏Tools菜单下的Options选项,在Directories的标签页中右边的&Show directories for:&下拉列表中选中&Includefiles&,然后在中间列表框中添加你本地安装MySQL的include目录路径。(我的是D:\Program Files\MySQL\MySQL Server 5.0\include)。
(2)在上面说到的&Show directories for:&下拉列表中选中&Library files&,然后添加你本地安装MySQL的Lib目录路径。Lib目录下还有debug和opt两个目录,建议选debug。(我的是D:\Program Files\MySQL\MySQL Server 5.0\lib\debug)。
(3)在&Project settings-&Link:Object/library modules&里面添加&libmysql.lib&。
(4)在stdafx.h里面添加如下的内容:
(5)建议将&libmySQL.lib、libmySQL.dll&拷到你所建的工程的目录下。
三、数据库、表的创建
打开&开始-&所有程序-&MySQL-&MySQL Server 5.0-&MySQL Command Line Client.exe&,如果没有设置密码就直接按回车,会提示服务器启动成功。
mysql& SHOW DATABASES;//显示所有的数据库,注意一定要 敲&;&后再按回车mysql& CREATE DATABASE//创建数据库mydbmysql& USE//选择你所创建的数据库mydbmysql& SHOW TABLES; //显示数据库中的表mysql& CREATE TABLE mytable (username VARCHAR(100), visitelist VARCHAR(200),
remark VARCHAR(200));//创建一个表mytable: 用户名;访问列表;备注mysql& DESCRIBE//显示表的结构
四、VC编程
(1)实现添加 功能
(2)实现修改功能
CString strUsername,strList,strRemark,strSQL;strSQL.Format("insert into mytable(username,visitelist,remark) values(\''%s\'',\''%s\'',\''%s\'')",
strUsername,strList,strRemark);//注意一定要写在一行,而且必须要有\''\''if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){ AfxMessageBox("增添失败"); }
CString strUsername,strList,strRemark,strSQL,str_PreN//str_PreName用于记录想要修改的行,详情请看源代码strSQL.Format("update mytable set username=\''%s\'',visitelist=\''%s\'',
remark=\''%s\'' where username=\''%s\''",strUsername,strList,strRemark,str_PreName);if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){ AfxMessageBox("修改失败"); }
(3)实现删除功能
(4)读取表格内容到CListCtrl控件m_list
(5)关闭数据库
mysql_close(&mysql);//最好写到OnDestroy()函数中
m_list.DeleteAllItems();char *ch_ch_query="select * from mytable";if(mysql_real_query(&mysql,ch_query,(UINT)strlen(ch_query))!=0){ AfxMessageBox("数据库中表格出错"); }CSMYSQL_RES *MYSQL_ROWif(!(result=mysql_use_result(&mysql))){ AfxMessageBox("读取数据集失败"); }int i=0;while(row=mysql_fetch_row(result)){str.Format("%s",row[0]);m_list.InsertItem(i,str);str.Format("%s",row[1]);m_list.SetItemText(i,1,str);str.Format("%s",row[2]);m_list.SetItemText(i,2,str);i++;}mysql_free_result(result);
CString strSQL;strSQL.Format("delete from mytable where username=\''%s\''",str_PreName);//必须要有\''\''if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){ AfxMessageBox("删除失败"); }
MYSQL //数据库连接句柄mysql_init (&mysql);if(!mysql_real_connect(&mysql,"localhost","root",NULL,"mydb",3306,NULL,0)){//mydb为你所创建的数据库,3306为端口号,可自行设定 AfxMessageBox("数据库连接失败"); return FALSE;}
#include "mysql.h"#include "winsock.h"#pragma comment(lib,"libmySQL.lib")VC6的操作方式和VC2008非常相似
时间: 20:31:59
&&&&&&&&板书:1、C语言不是只能开发黑底白字的控制台界面程序。学习本课的基础:本课程不讲C语言基础知识,C语言考及格,学的过程中配合复习,有不懂的回去翻书。2、学完本课程以后同学们做的一些作品赏析:计算器、俄罗斯方块、音乐播放器、学生管理系统(http://www.rupeng.com/forum/thread-.html),邮件客户端(http://www.rupeng.com/forum/thread--uid7.html),Web论坛(http://www.rupeng.com/forum/thread--uid7.html)可以开发游戏、网络程序、网站程序等。C语言什么都可以开发3、准备工作,安装VC6(在网上搜“VisualC++6”,找合适的地址下载)。VC6在Vista、Windows下启动可能有兼容性提示。3、开始做第一个C语言的程序【文件】→【新建】,打开【工程】选项页,选择【Win32Application】(不要选错了),在“位置”中修改工程保存的路径。(以前用TuborC的同学会问“什么叫工程?”。在以前大家用TurboC写的程序一般也就是一个文件,但是用C语言写大程序的时候不可能把所有的代码都写在一个文件中,肯定要写很多文件。“工程(Project)”就是这些文件的一个集合。)在“工程名”中写入你为这个工程取的名字,最好有一定意义。下一步【一个简单的Windows程序】4、向Windows的世界问好MessageBox(NULL,TEXT(世界你好),TEXT(问好),MB_OK);VC6在Vista、Windows下编译调试时可能有兼容性提示。5、学本课程常见问题(1)为什么不用TurboC?TurboC(Win-TC)太老了,界面还是DOS界面,库也是DOS的库,没有网络开发包、没有Windows界面开发包。TC只能用来学C的基础,要进行实际开发必须使用先进一点的工具。还是让TurboC进博物馆吧。(2)为什么不用更高版本的VC?我们不使用高版本的VC主要是如下考虑:VC6和高版本的VC没有本质区别(VC6是1998年的东西,大部分人、公司还是用VC6,市面上的书也都是用VC6),只不过是升级了一下C++的版本、STL的版本而已,对咱们这次学习没有什么影响;VC6的操作方式和VC2008非常相似,用熟了VC6再学高版本的VC只用半小时而已;高版本的VC体积太大,要五六百兆,而上面给出的VC6只有100MB。VC2008下建立工程。(3)学C语言还是学其他语言,用其他语言实现岂不是更好?用最熟悉的语言深入编程的各个领域(网络、数据库、图形学、内核等),一通百通,一切语言都是纸老虎。参考资料如鹏网首页。6、深入研究MessageBox(1)MessageBox(NULL,TEXT(世界你好),TEXT(问好),MB_OK);第一个参数暂时不讲;第二个是正文;第三个是标题(Caption);第四个是类型。MB_OK就是表示有一个OK按钮【确定】)TEXT是一个宏,当字符串中有中文的时候最好用TEXT来包围这个字符串,虽然不使用TEXT在VC6中没问题,但是在VC7中有问题,而且微软也建议使用TEXT宏,因此在涉及到中文的场合要使用它。他的作用就是把中文转化成不会乱码的格式。(暂时这么认为)。_T(问好),其实_T只是TEXT的一个缩写而已。而且_T在有的低版本里不识别。TEXT()低版本也识别。暂时不用关心TEXT的细节。换个样子:MessageBox(NULL,TEXT(世界你好),TEXT(你好),MB_OKCANCEL);可从设置希望在对话框中显示的按钮:#defineMB_OK0xL#defineMB_OKCANCEL0xL#defineMB_ABORTRETRYIGNORE0xL#defineMB_YESNOCANCEL0xL#defineMB_YESNO0xL#defineMB_RETRYCANCEL0xL也可以设置对话框中显示的图标:#defineMB_ICONHAND0xL#defineMB_ICONQUESTION0xL#defineMB_ICONEXCLAMATION0xL#defineMB_ICONASTERISK0xL比如:MessageBox(NULL,TEXT(世界你好),TEXT(你好),MB_ICONQUESTION);(2)可是如果我想显示“确定、取消”按钮的时候同时使用问号图标呢?MessageBox(NULL,TEXT(世界你好),TEXT(你好),MB_OKCANCEL|MB_ICONQUESTION);MessageBox(NULL,TEXT(世界你好),TEXT(你好),MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION);(3)思考:到这一步如果你只是在背诵“第一组和第二组中间放一个竖线就可以实现两种效果的组合形式”,那么你未来只会成为一个代码工人。我们要思考一下其背后的原理。“|”是什么意思?“|”是位运算里的“或”运算,只有对应的两个二进位有一位为1时,结果位才为1,否则为0。MB_OK、MB_OKCANCEL等的低四位不同,但是高位永远为0;MB_ICONHAND、MB_ICONQUESTION等的低5至第8位不同,而其他位永远为0。这样“MB_OK、MB_OKCANCEL”组的数值与“MB_ICONHAND、MB_ICONQUESTION”组的数值进行或运算后能分别保留各自的部分,也就是在结果值中同时体现两组的取值。这种风格叫“掩码”,在Windows编程中这种用法会经常用到。(4)返回值MessageBox是有返回值的,返回值为用户点击的按钮:#defineIDOK1#defineIDCANCEL2#defineIDABORT3#defineIDRETRY4#defineIDIGNORE5#defineIDYES6#defineIDNO7代码:intret=MessageBox(NULL,TEXT(你是人吗?),TEXT(火星人),MB_YESNO|MB_ICONQUESTION);if(ret==IDYES){MessageBox(NULL,TEXT(火星人你好),TEXT(问好),MB_OK);}else{MessageBox(NULL,TEXT(欢迎回家来),TEXT(问好),MB_OK);}6、课后作业:自己动手写恶搞程序。运行以后弹出询问对话框(有【是】、【否】两个按钮以及问号图标)“你是好人吗?”,如果点击【是】,则弹出对话框(只有一个【确定】按钮以及一个警告图标)“你看你就不像好人,点击【确定】开始格式化C盘!”;如果点击【否】,则弹出对话框(有【重试】、【取消】两个按钮)“尝试把你变成好人失败,是否重试?”。别把教学视频当电影看!!!多练!!!多写!!!板书:运行以后弹出询问对话框(有【是】、【否】两个按钮以及问号图标)“你是好人吗?”,如果点击【是】,则弹出对话框(只有一个【确定】按钮以及一个警告图标)“你看你就不像好人,点击【确定】开始格式化C盘!”;如果点击【否】,则弹出对话框(有【重试】、【取消】两个按钮)“尝试把你变成好人失败,是否重试?”。1、怎么生成exe程序。怎么把做好的exe程序发给别人?在我的电脑里直接进入工程文件夹。工程目录下生成的debug/release文件就是生成好的可执行文件,发给别人就可以。Debug和Release版本区别。怎么生成Release版本。1、对话框程序VC6下安装Win32DialogBasedApplicationhttp://down1.rupeng.com/download/software/Win32DlgBasedAppWizard.zipVC2008下安装Win32DialogBasedApplicationhttp://down1.rupeng.com/download/software/DlgBasedAppWizardVS2008.zip如鹏的Win32DialogBasedApplication没有做神奇的事情,只是简化了创建的过程,大家也可以手工创建,创建的代码可以在没有安装Win32DialogBasedApplicationWizard的机器上用。演示在2008上从win32application创建一个Win32DialogBasedApplication。在资源编辑器中编辑对话框界面并且拖放控件上去。试试常用的那些控件什么是属性。作业:开发一个注册界面。2、常见问题(1)开发Windows程序有什么前途?不要急于求成,用自己最熟悉的语言探索编程的各个方面,内核级开发、数据库、网络、动态网站开发等。学《C语言也能干大事》的目的并不是直接找开发Windows程序的工作,只要锻炼了动手能力和一通百通的数据库、网络、动态网站开发、面向对象等技能,学什么东西、找什么工作都很轻松。(2)学MFC不是更好?MFC乱七八糟的东西太多,隐藏了太多,隐藏不仅没有有利于初学者学习,反而使得更复杂。MFC只是一个稍微封装的SDK,学会了这里的课程如果又需要再去学MFC的话会发现90%是相同的。http://www.rupeng.com/forum/thread-338-1-1.html3、对话框中图片资源的应用在资源视图中,选择“引入”,然后文件过滤器选择“*.*”,找到bmp图片文件。选中图片空间,要点击边缘。拖一个IMAGE控件过来,并且修改IMAGE控件的Type属性为BitMap,在控件的Image属性中选择刚才添加的BITMAP资源。jpg的格式怎么转换为bmp格式的呢?用画图工具(mspaint)。图片被编译到了程序中,不再依赖于源文件4、菜单资源制作好菜单资源后,在对话框的Menu属性中选择刚才制作好的对话框。子菜单项(选中【弹出】)、快捷键(在要担当快捷键的字母前加)、分隔符5、只有控件、菜单,可以点击控件、菜单以后的动作怎么做呢?就要写代码了。后面会讲板书:1、怎么修改程序图标,引入一个ico文件(可以用一些工具制作ico图标,网上搜“制作ico”),然后命名ID为1,重新构建。2、在编写控制台程序的时候一切流程都是有先后关系、并行的,而且所有函数都是由我们来调用的,比如下面的实例性代码:printf(确定请输入y,取消输入n);charc=getchar();//scanfif(c==y){///}elseif(c==n){///}Voidfunc1(){MessageBox(NULL,TEXT(“按钮1被按下了”)….);}Voidfunc2(){MessageBox(NULL,TEXT(“按钮2被按下了”)….);}我们可以用getchar来等待用户输入一个值。但是到了Windows编程中就不一样了,同一时刻用户即可能点击【OK】按钮,又可能点击【Cancel】按钮,又可能在文本框中输入几个字,还可能在窗口上双击几下,这样就无法同时等待用户的这些动作。为了解决这个问题,Windows引入了消息机制(也可以叫做回调机制或者事件机制)。在程序启动的时候把函数func1要响应【OK】按钮1的点击动作、函数func2要响应【Cancel】按钮的点击动作、函数func3要响应窗口的双击动作等等这些信息告诉Windows,然后当用户执行相应操作的时候Windows就会来主动调用你注册的函数,主动通知你。不再是程序调用操作系统的函数,而是操作系统反过来调用你的函数。Dontcallme,Illcallyou!(也被人称为“好莱坞法则”)。2、关于上面的这个问题要慢慢来理解,下面就来通过第一个例子来初步理解这个Dontcallme,Illcallyou!//HANDLE_MSG的意思就是告诉Windows,当发生WM_COMMAND消息的时候,请//通知Main_OnCommand函数//id这个参数是Windows给咱们“送”过来的看Main_OnCommand方法,初探windows的消息机制。voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){switch(id){caseIDC_OK:{MessageBox(hwnd,TEXT(欢迎访问如鹏网www.RuPeng.com大学生计算机学习社区),TEXT(问好),MB_OK);}default:}}不同的控件要有不同的id,控件的名字,在人类社会中名字有可能重名,但是在windows中id不能重复按钮被按下的时候Main_OnCommand方法被调用,hwnd是对话框句柄(什么是句柄后面讲,通俗的说就是通过它能够操纵对话框),id是控件的id,后两个参数暂时不关心。Main_OnCommand方法中根据id,也就是被点击按钮的名字来决定不同的动作。Hwnd是当前窗口的句柄,句柄就是把柄!操作一个东西,要先抓住他的把柄!通过句柄就可以操作这个对象。//不要忘了break//不要忘了case中用大括号3、定制自己的对话框,不同的按钮不同的问好然后重新添加一个自己的按钮,在属性中修改Name属性为IDC_BTNHELLO。控件名字的潜规则:所有控件的Name都以“IDC_”开头,然后后边跟着控件类型的简称(按钮简称BTN、文本框简称EDT等等),最后才是控件的真正的名字。修改按钮的Caption属性(也就是按钮上显示的文字)为“问好”。编辑Main_OnCommand方法:voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){switch(id){………………………caseIDC_BTNHELLO:{MessageBox(NULL,TEXT(世界你好),TEXT(问好),MB_OK);}//不要忘记breakdefault:}}运行程序,点击“问好”按钮,咱们第一个响应按钮动作的程序就做好了。4、自己动手写计算器1.0版(1)、得到控件中用户输入的文本GetDlgItemText(hwnd,IDC_EDTNAME,str,sizeof(str));第一个参数是对话框的句柄;第二参数就是控件的id(name);第三个参数就是字符串数组的指针;疑问:为什么不能像MessageBox一样把字符串做为返回值返回呢???这就涉及到C语言中函数返回指针的问题了在函数内部返回函数内构建的指针有可能出现数据混乱.当f1函数在执行的时候,这段内存是被占用的,一旦函数返回,那么内存就标记为可以被其他人、函数占用。如果你把这段内存中的指针返回了,那么一旦其他地方用了这段内存,那么你引用的就是错误的数据了。用GetWindowText、GetDlgItemText的时候为什么要传数组名呢?复习:初学者可以认为数组名就是指针,函数只有得到指针,才能直接操作数组中的数据。(2)c语言中字符串连接:wsprintf(str,”….”,a1,a2);还有sprintf,但是在编写windows程序的时候最好使用wsprintf。//GetDlgItemText(hwnd,IDC_EDITNAME,str,sizeof(str));//第一参数是窗口的句柄,第二个参数是要取得内容的控件的ID//第三个参数就是字符串指针,第四个参数就是指针指向区域的大小TCHARname[256];//为什么不用strlen,sizeof。//如鹏网站内搜索搜“strlen,sizeof”区别//Windows编程中一般都用TCHAR代替char。TCHAR有时候就是char。//解决Unicode、中文编码问题。GetDlgItemText(hwnd,IDC_EDITNAME,name,sizeof(name));//printf是打印到屏幕上//printf(%s你好,name);//sprintf是打印到字符串中//相当于很多C#、Java语言里的字符串相加name+你好//sprintf(字符串,...,a1,a2,a3....);TCHARmsg[256];//sprintf(msg,%s你好,name);//wsprintf,C语言开发Windows程序的时候用wsprintf代替sprintf//解决中文等问题wsprintf(msg,%s你好,name);MessageBox(hwnd,msg,msg,MB_OK);(3)向用户问好TCHARname[256];GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));TCHARmsg[256];wsprintf(msg,%s你好,name);MessageBox(hwnd,msg,TEXT(问好),MB_OK);(4)C语言里边字符串转换为数字:atoi:asciitoint(5)编写windows程序的时候最好用TCHAR来代替char,可以避免中文的问题caseIDC_BTNHELLO:TCHARname[256];GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));inti=atoi(name);intj=i*2;TCHARresult[256];itoa(j,result,10);MessageBox(hwnd,result,TEXT(问好),MB_OK);(6)Get、Set:配对的,设置对话框的值用SetDlgItemText:代码:caseIDC_BTNADD://取第一个文本框的字符串,然后得到整数表示//取第二个文本框的字符串,然后得到整数表示//计算两个整数的和//把和重新转换成字符串,然后Messagebox出来。TCHARcNumber1[256];GetDlgItemText(hwnd,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHAR));intn1=atoi(cNumber1);TCHARcNumber2[256];GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHAR));intn2=atoi(cNumber2);intn3=n1+n2;TCHARcResult[256];itoa(n3,cResult,10);SetDlgItemText(hwnd,IDC_EDTRESULT,cResult);//inti1;//inti2;//不能梦想着直接定义两个int类型的参数,就让windows告诉你两个数的值TCHARstr1[256];TCHARstr2[256];GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));//两个字符串不能直接相加,要先转换成int类型。//C标准库函数:atoi,a:asciitoi:int理解了atoi的简写不用死记硬背了inti1=atoi(str1);inti2=atoi(str2);inti3=i1+i2;//printf(%i,i3);TCHARstr3[256];itoa(i3,str3,2);//字符串转换为整数,第三个参数就是进制。//wsprintf(str3,%i,i3);SetDlgItemText(hwnd,IDC_EDIT3,str3);(7)代码中有UINT、TCHAR、LRESULT、HWND之类的新的数据类型,其实它们只是一些类型的别名而已,可以通过宏定义看出来。但是考虑到可移植性,尽量不要使用它们的真实类型。TypedefC语言中声明类型别名。(8)作业:做一个面积计算器,用户输入半径,在另外一个文本框中显示面积。(10)作业:用户输入十进制整数,在另外一个文本框中显示整数的二进制形式。做一个十进制到二进制的转换小工具。(10)作业:计算两个数的差。(11)思考:这个计算两个数的和程序有什么缺陷?没有阻止用户输入非数字。怎么解决。多练手,光听视频什么用都没有,浪费时间,必须练手,再简单的代码也要自己写,不要眼高手低!!!你没有多牛X。板书:上节课作业(8)作业:做一个面积计算器,用户输入半径,在另外一个文本框中显示面积。(10)作业:用户输入十进制整数,在另外一个文本框中显示整数的二进制形式。做一个十进制到二进制的转换小工具。(10)作业:计算两个数的差。不要总认为看很多书、学高深技术、看很多视频就是牛人,能把一个最简单的程序快速写出来的才是牛人!!!(11)思考:这个计算两个数的和程序有什么缺陷?没有阻止用户输入非数字。怎么解决。调试的技巧,断点:执行到断点的时候程序暂停住。板书:上节课的作业你自己写了吗?比我快吗?如果没有写的话别继续往下看,先回去自己写。实现“自己动手写计算器2.0版”,允许选择运算符号。ComboBox的操作(1)添加项:填入Combo最简单的方法是借助ComboBox_AddString“函数”(其实是宏):ComboBox_AddString(hwndCtrl,str)每个控件也有自己的句柄。句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例、窗口、图片、图标等等。控件句柄和控件id的区别:控件句柄在每次运行的时候都是不一样的,而控件id则是确定的。ComboBox_AddString等几乎所有控件函数都可以对整个Windows中的控件进行控制(有的游戏外挂的原理),在一个对话框内id不能重复,但是在不同的对话框内则可以重复,因此需要一个全局的不重复的句柄来表示控件,通过对话框+id联合确定。两个不同的程序(哪怕是同一个程序启动的两个不同的实例,开两个记事本)是找到我爸,然后找我父亲的id=1的儿子,也就是我,然后再打我。这就是通过我父亲的把柄和我的id=1来定义我GetDlgItem由对话框句柄+id得到控件的句柄。Main_OnInitDialog对话框初始化的时候被调用。做一个例子(2)确定目前选项的索引:intComboBox_GetCurSel(HWNDhwndCtl);Cur:CurrentSel:Selection返回值是当前项的编号,从0开始。得到的不是“北京市”这样的字符串,而是索引(编号)如果没有项目被选中,那么从函数中传回的iIndex值为CB_ERR。做一个例子(3)删除项:intComboBox_DeleteString(HWNDhwndCtl,intindex);做一个例子(4)取得有多少项:intComboBox_GetCount(HWNDhwndCtl);返回值是个数。(5)选定某一项intComboBox_SetCurSel(HWNDhwndCtl,intindex);将index设定为-1则取消所有选择(6)得到某项的值intComboBox_GetLBText(HWNDhwndCtl,intindex,LPCTSTRlpszBuffer);怎么让Combo不能改?类型:下拉列表更多ComboBox的用法http://msdn.microsoft.com/en-us/library/cc656426(VS.85).aspx是宏,不是函数。SendDlgItemMessage/SendMessage。额外知识,不讲,自学(不想变成填鸭式教育,课上只讲思想性的东西,会给大家学习资料,希望大家培养自学能力)实现四则运算器:作业(1)给本节课的小练习提改进建议并且自己实现。(2)学生管理系统(画原型界面布置)增、删、查(双击)、搜多练手,光听视频什么用都没有,浪费时间,必须练手,再简单的代码也要自己写,不要眼高手低!!!你没有多牛X。板书:上节课作业:学生管理系统(画原型界面布置)增、删、查(双击)、搜接下来我们要实现小时钟。涉及到的主要知识点是定时器的使用,涉及到的C知识就是函数指针(回调函数)使用定时器回调就是不是你调别人,而是别人调你。时间到了会叫你,没到的时候不会烦你。让Windows直接将定时器消息发送给您程序的另一个函数。我们把以下的callback函数称为TimerProc(您能够选择与其它一些用语不会发生冲突的任何名称),它只处理WM_TIMER消息:VOIDCALLBACKTimerProc(HWNDhwnd,UINTmessage,UINTiTimerID,DWORDdwTime);SetTimer(hwnd,iTimerID,iMsecInterval,TimerProc);19、得到当前日期:voidGetLocalTime(LPSYSTEMTIME);课上练习:SYSTEMTIMEstLcharchBuf[256];GetLocalTime(stLocal);//显示时间的间隔。wsprintf(chBuf,TEXT(%u/%u/%u%u:%u:%u:%u周%d\r\n),stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute,stLocal.wSecond,stLocal.wMilliseconds,stLocal.wDayOfWeek);MessageBox(NULL,chBuf,,MB_OK);SetTimer(hwnd,1,1000,TimerProc);voidCALLBACKTimerProc(HWNDhwnd,UINTmessage,UINTiTimerID,DWORDdwTime){SYSTEMTIMEGetLocalTime(time);TCHARstrTime[256];//%后面的0表示不够的位数补零,5是总位数,就这样wsprintf(strTime,%04d-%02d-%02d%02d:%02d:%02d,time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);SetDlgItemText(hwnd,IDC_EDTTIME,strTime);}作业:定时关机、定时关闭显示器,如何编程实现关机、关显示器。到整天播放音乐。自学!!!“关闭显示器API”、“关闭显示器函数”9、取酶囱“磁サ氖欠裱≈校?/fontLRESULTButton_GetCheck(HWNDhwndCtl);BST_CHECKEDBST_UNCHECKED设置复选按钮是否选中:LRESULTButton_SetCheck(HWNDhwndCtl,intcheck);BST_CHECKEDBST_UNCHECKED7、ListBox(和Combo类似)(1)添加项:如果采用LBS_SORT样式,那么填入清单方块最简单的方法是借助ListBox_AddString:intListBox_AddString(HWNDhwndCtl,LPCSTRlpsz);如果没有采用LBS_SORT,那么可以使用ListBox_InsertString指定一个索引值,将字符串插入到清单方块中:intListBox_InsertString(HWNDhwndCtl,intindex,LPCSTRlpsz);(2)删除项:intListBox_DeleteString(HWNDhwndCtl,intindex);(3)取得有多少项:intListBox_GetCount(HWNDhwndCtl);(4)选定某一项intListBox_SetCurSel(HWNDhwndCtl,intindex);将iParam设定为-1则取消所有选择(5)确定目前选项的索引:intListBox_GetCurSel(HWNDhwndCtl);如果没有项目被选中,那么从呼叫中传回的iIndex值为LB_ERR。(6)将某项目复制到文字缓冲区中:intListBox_GetText(HWNDhwndCtl,intindex,LPCTSTRlpszBuffer);9、菜单资源(1)制作好菜单资源后,在对话框的Menu属性中选择刚才制作好的对话框。(2)响应菜单操作。菜单点击后也会发送WM_COMMAND消息id就是被选择菜单的id。例子:caseIDM_QUIT:EndDialog(hwnd,id);作业:文件操作。自己动手写记事本。路径写固定的路径。下节课内容:作业点评,文件对话框、播放音乐板书:作业点评:文件操作。自己动手写记事本。RichEdit控件。LoadLibrary(riched32.dll);参考资料:http://msdn.microsoft.com/en-us/library/bb787605(VS.85).aspx5、给结构体所有字段置零复习一下C语言中memset以及结构体的应用。C语言中声明一个结构体变量之后,在使用这个变量之前要首先用memset来把各个位清零。使用C语言内置的函数memset来完成:memset(s1,sizeof(s1),0);在这里我们使用ZeroMemory“函数”,ZeroMemory其实并不是函数,其实是memset的宏定义ZeroMemory其实就是memset,纸老虎而已,不是一个全新的函数。6、打开文件对话框的使用首先#includecommdlg.hOPENFILENAMEcharszFile[MAX_PATH];ZeroMemory(ofn,sizeof(ofn));ofn.lStructSize=sizeof(ofn);ofn.lpstrFile=szFofn.lpstrFile[0]=TEXT(\0);ofn.nMaxFile=sizeof(szFile);ofn.lpstrFilter=TEXT(ALL\0*.*\0Text\0*.TXT\0);ofn.nFilterIndex=1;ofn.lpstrFileTitle=NULL;ofn.nMaxFileTitle=0;ofn.lpstrInitialDir=NULL;ofn.hwndOwner=//自学能力、探索能力、猜测能力ofn.Flags=OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;if(GetOpenFileName(ofn)){MessageBox(NULL,szFile,,MB_OK);}参数太多只能搞Struct。下面将对这段代码作解释:(1)、ZeroMemory的含义见上边(2)charszFile[MAX_PATH];//定义一个长度为MAX_PATH的char数组。MAX_PATH是系统定义的一个宏,260。Windows操作系统文件路径的最大长度。(3)ofn.lpstrFile=szF//szFile是一个字符数组,那么szFile这个名字就代表这个字符数组的首地址(4)文件类型过滤器*.*就表示所有文件*.txt就表示所有文本文件abc*.*就表示所有以abc开头的文件abc*.txt就表示所有以abc开头的文本文件(txt)ofn.lpstrFilter=TEXT(ALL\0*.*\0Text\0*.TXT\0);用“\0”分割出几个段,每两段是一组过滤器,每组的第一个段代表过滤器的显示的值,而第二段表示真正的过滤器(5)ofn.nFilterIndex=2;默认选择第几个过滤器,是1开始的,不是0.这也是试验出来的。(6)windows的一个惯例:结构体的指针类型别名一般是LP+结构体的名字GetOpenFileName(ofn)而不是GetOpenFileName(ofn),因为GetOpenFileName函数要的是OPENFILENAME的指针(7)用户关闭对话框,GetOpenFileName函数返回,返回值是BOOL,等于TRUE表示用户选择了文件,如果等于FALSE就表示用户选择了【取消】按钮第三节1、GetOpenFileName希望同学们不要只记我教的结果,而是要跟着我的思路进行思考,看解决问题的方式。否则就又变成“我教同学们学”的填鸭式教育了。(2)课上练习:打开对话框,用户选择一个音乐文件,然后用MCIsendString播放,注意ShortPath的问题。如何让音乐文件跟着文件走,GetModuleFileName、GetCurrentDirectory(3)打开多个文件:增加OFN_ALLOWMULTISELECT选项后测试一下。发现如果选择一个文件后显示的还是这个文件的路径,可是如果选择多个文件显示的就只有目录的路径,怎么回事?调试一下,看看szFile在内存中的样子。调试的是发现内存中的样子是目录的路径然后加上各个文件名,中间用“\0”分割,现在明白为啥值显示目录的路径了吗?大家明白这一点就可以了,有兴趣的可以课后来做多文件选择的处理。做播放器的时候经常需要这个功能,也就是播放列表。有一篇文章可以参考一下:http://xxkkff.blog.51cto.com/222、GetSaveFileName保存文件对话框只要把上边函数换成GetSaveFileName。OFN本来是OpenFileName的简写,它SaveFileName也跑来凑热闹,吼吼。如果需要保存文件覆盖提示怎么办呢?看看OFN有选项吗?OFN_OVERWRITEPROMPTMcisendstring播放音乐,配合GetOpenFileName实现播放器GetShortPathNamemciSendString(“play***”,,0,NULL);Mcisendstring更多用法(暂停、继续、录音、播放进度控制)参考http://baike.baidu.com/view/1622810.htm?fr=ala0_1http://msdn.microsoft.com/en-us/library/dd743572(VS.85).aspx作业:提供打开、保存功能的记事本作业:自己动手写播放器http://so.rupeng.com/?keyword=C%E8%AF%AD%E8%A8%80+%E6%92%AD%E6%94%BE%E5%99%A8更多控件用法http://msdn.microsoft.com/en-us/library/bb773169(VS.85).aspxVC就是全部、VC不是唯一:C-Free、PellesC、DevC++、CodeBlocks。C-Free使用演示(Vista、Win7上资源编辑器可能有问题)。学完第七节就可以开始从第一版11节开始继续学习了、第12节也是旧版的,不用看。第1版1至10节中还有一些在第二版中没有讲的东西,有兴趣的可以去粗略的过一遍,当然不学第一版也能继续向后学。板书:这节课是自己动手写QQ、自己动手写飞鸽传书的基础,以后想从事网络开发、信息系统开发、游戏开发、嵌入式系统开发等的同学必须学习。演示一个简单的和网易Email服务器对话的过程。1、网络基本概念讲解QQ的基本原理讲解浏览器上网的基本原理服务器:Server。提供服务的计算机。客户端:Client。和服务器端交互的一个设备。IP地址:计算机在网络中的地址。相当于每个家庭的电话。211.97.1.2别名、域名:www.RuPeng.com。域名就相当于你家的地址。问114,你家的电话(告诉地址)DNS:网络中的114。DomainNameSystem。端口:Port。不同的程序连接服务器时候用的插座。(程序和服务器通信的时候的一个开得的一个口子)Socket(套接字):导线、网络连接。2、WinSock、WinSocket。Socket:平台无关的。Socket标准。所有操作系统都实现了这个标准。Send、recv。。。标准的。一通百通!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!WinSock:添加了一些Windows独有的函数。而且不用这些函数的话Socket程序还跑不起来。羞臊微软!!!WinSock编程:平台无关,一通百通。WSA(WindowsSocketAPI)Sz1.tencent.comSz2.tencent.com3、LastError调用WindowsAPI的时候,每步执行完毕都会把执行结果放到LastError中去,所以应该在函数执行完毕立即去取。DeleteFile(f1)DeleteFile(f2)GetLastError()LastError只能容纳一个错误码DeleteFile(f1)GetLastError()DeleteFile(f2)GetLastError()错误码。FormatMessage:把错误码转换为错误消息。Windows错误处理GetLastErrorvoidShowError(){TCHAR*lpMsgBFormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|//自动分配消息缓冲区FORMAT_MESSAGE_FROM_SYSTEM,//从系统获取信息NULL,GetLastError(),//获取错误信息标识MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),//使用系统缺省语言(LPTSTR)lpMsgBuf,//消息缓冲区0,NULL);MessageBox(NULL,lpMsgBuf,,MB_ICONERROR);}复制代码在.h中声明函数,在.c中实现!!!都会有哪些错误?4、模板代码:(1)、添加winsock2.h(2)、连接库“wsock32”。怎么知道添加它呢?(3)、模板代码WSADATAwsaD//初始化Socket库WSAStartup(MAKEWORD(2,0),wsaData);//创建一根电线SOCKETsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);SOCKADDR_INsa.sin_family=AF_INET;//设置电线连接服务器端的端口sa.sin_port=htons(IPPORT_SMTP);//123.125.50.135是pingsmtp.163.com出来的,后面会讲使用gethostbyname来直接从//主机名得到ip地址sa.sin_addr.S_un.S_addr=inet_addr(123.125.50.135);//为什么不用设置客户端的端口,难道不需要客户端的端口吗?if(connect(sock,(SOCKADDR*)sa,sizeof(sa))==SOCKET_ERROR){ShowError();}//做事情。把大象放冰箱总共分几步closesocket(sock);WSACleanup();复制代码QQ服务器的端口8888。需要指定客户端的端口是9999.端口有一个特点:排他性!端口已经被别的程序占用,不能再用这个端口。开两个QQ。99。如果端口可以被多个程序使用的话,QQ聊天服务器发过来的消息被多个QQ收到。很荒谬!排他性!如果在程序里写死了客户端用的端口。。。所以才需要Socket替客户端动态分配一个端口。所以不需要在程序中显示指定客户端的端口号!客户端向服务器端发消息:send服务器端想客户端发消息,客户端这边应该接收,recv。(receive)SMTP服务器,你连上来以后服务器端主动向你发一条消息recv(sock,buffer,256,0);第一个是使用的socket,“导线”,套接字接收数据的缓冲区的指针接收数据的缓冲区的大小0send(sock,cQuit,lstrlen(cQuit),0);第一个是使用的socket,“导线”,套接字接收数据的缓冲区的指针接收数据的缓冲区的大小0(4)一上来人家就主动和你唠嗑:charbuffer[256];ZeroMemory(buffer,sizeof(buffer)/sizeof(char));//接收问候语recv(sock,buffer,256,0);MessageBox(hwnd,buffer,,0);(5)朋友再见//注意不能忘了末尾的回车TCHARcQuit[]=QUIT\n;send(sock,cQuit,lstrlen(cQuit),0);ZeroMemory(buffer,sizeof(buffer)/sizeof(char));//接收GoodByerecv(sock,buffer,256,0);MessageBox(hwnd,buffer,,0);板书:第一次亲身体验一通百通的威力!一、为什么现在要转换到VC6了?(1)、亲身体验一通百通的威力。(2)、C-Free做入门级的学习工具比较合适,所以在《C语言也能干大事》一开始我们选择它做入门工具。但是C-Free在工程化的大程序方面能力欠佳,而《C语言也能干大事》后面将是大量的实战项目,比如自己动手写QQ、自己动手写银行系统、自己动手写VC等,所以要转用VC。(3)用c-Free的目的是让同学们知道不是C/C++就是VC,VC=编辑器+编译器;C-Free=编译器+可替换的编译器。C-Free与VC。(4)用VC开发出来的工程比较好和同学们交流,比较好做为课程设计、毕业设计的作业直接发给老师。别害怕。只用10分钟就能让你从C-Free过渡到VC,这就是一通百通的魅力。跟我来吧。为什么不同VC更高的版本?VS更高版本和VC6比起来几乎没什么差别,特别是对于咱们《C语言也能干大事》这门课约等于一模一样,而且高版本体积要大很多,要占2G多,装了很多用不着的东西,而VC6只有200多MB。二、VC开发环境的搭建1、VC的下载如果已经安装好VC的就不用再重新安装了。如果没有安装的同学可以下载如鹏网专门为大家定制的“如鹏网版VC6”,去掉了一些已经作废的组件,丝毫不影响使用,尺寸只有103MB。下载地址:http://down1.rupeng.com/download/software/RuPengvc6_chs.rar注意如果使用Vista的同学请关闭Vista的UAC这个废物。2、MessageBox归来Win32Application→简单的Win32程序。三、对话框图形化环境搭建1、从Win32Application向导生成对话框程序自己配置太麻烦了,每次建一个程序就需要建一遍对话框、MainProc、添加LoadLibrary等等。2、配置如鹏网为同学们定制的Win32DialogBasedApplication向导已经下载“如鹏网版VC6”的同学从安装包的Tools目录下就可以找到Win32DlgBasedAppWizard.zip没有下载“如鹏网版VC6”的同学从下面的地址单独下载:http://down1.rupeng.com/download/software/Win32DlgBasedAppWizard.zip只有200多K大小。配置方法:将DlgBaseAppWizard.pdb和DlgBaseAppWizard.awx拷贝到VC6的安装目录的Common\MSDev98\Template目录下即可,一般VC6都安装到了C盘,所以一般只要拷贝到C:\ProgramFiles\MicrosoftVisualStudio\Common\MSDev98\Template即可。然后重启VC6,在VC6的向导页面中就可以看到“Win32DialogBasedApplication”的向导选项了。Win32DialogBasedApplication并没有做什么神奇的工作,只不过是帮大家快速搭建一个对话框工程而已,没有什么自己的特性,大家手动也能完成,这个工程拿到没有“Win32DialogBasedApplication”的VC中也能运行和开发。注:“Win32DialogBasedApplication”就是在“自己动手写开发工具”,希望大家早日从用工具的人变成造工具的人。人类进化的一大标志就是学会制造工具!哈哈!3、Win32DialogBasedApplication帮大家做了什么添加了一个对话框、添加了模板代码、添加了对IP地址控件、日历控件等高级高级控件的显示支持代码。4、争取大家自己从头不用Win32DialogBasedApplication建一个对话框工程。五、配置VC6,使之更好用1、修改代码自动完成的快捷键,因为默认的Ctrl+Space和输入法切换冲突工具栏上点击右键,选择“自定义”(customize);在对话框中切换到“键盘”(keyboard),“类别”选择“编辑”,在命令中找到“CompleteWord”(列表中快速查找的技巧,在几乎任何软件中都通用,在列表中快速敲入单词),然后焦点设置到“按下新快捷键”上,按快捷键“Alt+/”(也可以是其他的自己习惯的,只要是不和其他的冲突就可以),主要是按快捷键,不是敲入字符“Alt+/”,学了后面的课程你就会知道这是一个HotKey控件,而不是TextBox。然后注意不要忘了点击【分配】。要学会使用快捷键,我看很多同学写程序太费劲了,经常用鼠标点来点去,慢的像一头牛,CtrlC、CtrlV什么的起码不应米苁怯檬蟊辏?1频某绦蛟焙苌儆檬蟊辍?/font2、关闭工程的“设置”→“浏览信息”→“创建浏览信息文件”(BrowsingInfo)Project→Setting→BrowseInfo→buildBrowseInfoFile因为它有可能造成VC死锁3、如果VC还是有偶尔死锁,那么请杀掉MSDev进程,然后重启VC。移植几个程序:计算器;音乐图片贺卡;设置程序图标;Socket网络开发2这节课是对上节课内容的复习和实战,并且融合了C语言中指针、函数、类型转换、结构体等知识。一、复习:复述QQ的基本原理;在一个典型的网络程序中分为哪两端?IP地址、域名、DNS、端口是做什么用的?演示一个简单的和网易Email服务器对话的过程。Socket是Windows特有的吗?什么是WinSock?WinSock和Socket标准的区别和联系。Windows中函数的错误信息是通过什么来报告的?创建客户端到服务器端的Socket连接的时候需要指定服务器端的端口吗?为什么?需要指定客户端的端口吗?为什么?客户端不用显式指定端口,但并不是说不需要端口,而是这个端口是由操作系统分配的。有一个端口能同时被多个程序占用吗?发送、接收数据各用什么函数?二、开发网络定时器1、看看Windows的网络授时功能(客户端)2、网络授时原理客户端连接到授时服务器上,授时服务器会马上将当前时间发送给客户端,原理很简单。网络授时分为好几种协议,比如返回的是日期字符串,有的返回的是自日至今的秒数。“2:13:58”、扩展阅读:http://zhidao.baidu.com/question/.html2、国家授时中心提供的网络授时返回的是自日至今的秒数。3、先移植第一节课的代码可供选择的授时服务器(不止这些):www.time.ac.cn国家授时中心Clock.sgi.comSGITick.mit.edu麻省理工学院Time.nist.govNISTCompile:编译Link:连接编译是单一的文件编译成.o、.obj文件,然后Link是.obj连接成.exeLink库!!!!一通百通的力量!!!!!!!!!!!!!!C-Free、VC没有任何差别!!!!!!!!!!!!小技巧:在命令提示符下不能CtrlC、CtrlV,但是选中后点右键就是复制、粘贴4、授时服务器是37端口IPPORT_TIMESERVER。返回的是什么?unsignedlongulTrecv(sock,(char*)ulTime,sizeof(unsignedlong),0);深刻理解这段代码的含义ulTime=ntohl(ulTime);从网络字节顺序转换为主机字节顺序。这个是重点,很多公司面试的时候都会问这个,以后工作中也会遇到。什么是网络字节顺序、什么是主机字节顺序。不同的CPU中处理整数的方式不一样,有的是低位在前、有的是高位在前。计算机组成原理、数字电路。。。网络字节顺序则是统一标准。如果直接接收的话就会造成接受者接收的数据正好是相反的。扩展阅读:http://hi.baidu.com/cdmember_daihw/blog/item/adffebab6457e6.html中国是东8区。猜的:时间服务器返回的是格林尼治时间。Windows中时间用SYSTEMTIME结构体表示时间,怎么将ulTime转换为SYSTEMTIME?网上找到下面的代码:#defineHIGHTIME968708//Jan1,1900FILETIME.highTime#defineLOWTIME////Jan1,1900FILETIME.lowtimeSYSTEMTIMEUINT64uiCurTime,uiBaseTime,uiRuiBaseTime=((UINT64)HIGHTIME32)+LOWTIME;uiCurTime=(UINT64)dwTime*(UINT64);uiResult=uiBaseTime+uiCurTFileTimeToSystemTime((LPFILETIME)uiResult,st);把它封装成函数,怎么设计接口?深刻理解指针以及Windows中LP的惯例。把时间打印出来,怎么打印??????怎么时间不对设置系统时间//SetSystemTime(st);&&&&作业:定时的进行网络对视。SetTimer函数,1分钟对时一次。时钟。Over!板书:网络编程由于比较难,留给同学们一段时间去学习,数据库开发讲若干节以后再回头来讲自己动手写邮件发送器(网络编程的应用)和网络编程的服务器端开发。这个知识点要达到的目的:能够使用常用的SQL语句,能够使用ODBC操作数据库,熟悉结果集、SQL注入漏洞、范式等一通百通的东西,为以后有必要的情况下用ADO、ADO.Net、JDBC学一通百通的东西。课程参考教材:杨中科的《程序员的SQL金典》这门课和《数据库原理》的关系,这门课是对《数据库原理》的应用,通过这门课将能够学会数据库原理的实际应用,不再云里雾里。即使没学过《数据库原理》也没关系,这门课并不假定大家学过《数据库原理》,相当于预习效果。企业里数据库开发是很大的一部分,不会什么也要会数据库开发。开发环境的搭建:(1)如鹏版绿色MYSQL的下载:http://down1.rupeng.com/download/software/RuPengGreenMYSQL.rar(2)ODBC连接MYSQL的驱动MYODBC下载:http://down1.rupeng.com/download/software/MYODBC.rar(3)管理工具SQLyog下载:http://down1.rupeng.com/download/software/SQLyog.rar依次安装三个软件。如鹏版绿色MYSQL的使用,使用SQLyog连接数据库。注意:如果初始化MYSQL以后移动了MYSQL的文件夹,那么需要重新运行“运行前先初始化.exe”。1、执行“启动MySQL.bat”2、运行SQLyog。如鹏版MYSQL,用户名密码都是root。什么是数据库,数据库能做什么?可以记录到文件中,比如:姓名年龄工号职位Kider20001超版CALF21002版主劣势:1、必须对文件操作非常熟悉2、比如对算法非常熟悉;一旦算法不好的话很容易造成性能问题。3、并发操作。广义的来讲,能够存储数据的地方都可以叫数据库。DBMS(DataBaseManagementSystem,数据库管理系统),由DBMS来负责管理数据,使用者只要“描述”要进行什么操作就可以了,DBMS相当于仓库管理员,只要向仓库管理员发出命令就可以,他怎么做我们不用关心,只要告诉他WhatToDo(要做什么),不关心HowToDo(怎么做)。DBMS和数据库的关系。大家都很懒,所以很多时候说数据库其实指的是DBMS。行业内的潜规则。不同的仓库管理员有自己的不同的优势。不同品牌的DBMS也有自己的不同的特点。MYSQL、MSSQLServer、DB2、Oracle、Access。。。OS/2SybaseSQLServer、MicrosoftSQLServerSybase和MS的恩恩怨怨。主流数据库(DBMS)有哪些?SQLSQLServerMSSQLServer。最常见的错误。行业内的潜规则。和仓库管理员打交道的方式:1、跑过去和他说;2、打电话;3、通过电脑传递信息(自动化的方式);操作数据库的两种方式:管理工具和程序代码。什么是Catalog(分类)(数据库、表空间)表(Table)把仓库分成不同的区域。不同的区域放不同类型的物品。将一个数据库(Catalog)分成不同的表,每个表放不同的数据。公司机密信息数据库:发票信息;合同信息;公司帐号;。。。。建不同的表。列(Column)已经将生肉放到单独的生肉区域里,每块肉都有不同的特性,取肉部位、重量。。。。为每块肉都贴一个标签,规定每一列的格式,重量应该是数字。生产日期应该是日期类型。数据类型(DataType),Int、Char、double一个道理。数据库,表、列、数据类型、记录。SQLYog中左边是数据库。Int:整数;varchar:字符串(String),Var(可变的),Char(字符);Boolean、char、date怎么使用Varchar,要指定长度,就像申明charbuff=newchar[200]使用工具创建数据库表,插入一条记录。表的命名规则、字段命名规则。常见数据类型说明。下节课内容:SQL语句、数据的增删改查。课下参考《程序员的SQL金典》进行深一步的学习和预习。板书:网络编程由于比较难,留给同学们一段时间去学习,数据库开发讲若干节以后再回头来讲自己动手写邮件发送器(网络编程的应用)和网络编程的服务器端开发。这个知识点要达到的目的:能够使用常用的SQL语句,能够使用ODBC操作数据库,熟悉结果集、SQL注入漏洞、范式等一通百通的东西,为以后有必要的情况下用ADO、ADO.Net、JDBC学一通百通的东西。课程参考教材:杨中科的《程序员的SQL金典》这门课和《数据库原理》的关系,这门课是对《数据库原理》的应用,通过这门课将能够学会数据库原理的实际应用,不再云里雾里。即使没学过《数据库原理》也没关系,这门课并不假定大家学过《数据库原理》,相当于预习效果。企业里数据库开发是很大的一部分,不会什么也要会数据库开发。开发环境的搭建:(1)如鹏版绿色MYSQL的下载:http://down1.rupeng.com/download/software/RuPengGreenMYSQL.rar(2)ODBC连接MYSQL的驱动MYODBC下载:http://down1.rupeng.com/download/software/MYODBC.rar(3)管理工具SQLyog下载:http://down1.rupeng.com/download/software/SQLyog.rar依次安装三个软件。如鹏版绿色MYSQL的使用,使用SQLyog连接数据库。注意:如果初始化MYSQL以后移动了MYSQL的文件夹,那么需要重新运行“运行前先初始化.exe”。1、执行“启动MySQL.bat”2、运行SQLyog。如鹏版MYSQL,用户名密码都是root。什么是数据库,数据库能做什么?可以记录到文件中,比如:姓名年龄工号职位Kider20001超版CALF21002版主劣势:1、必须对文件操作非常熟悉2、比如对算法非常熟悉;一旦算法不好的话很容易造成性能问题。3、并发操作。广义的来讲,能够存储数据的地方都可以叫数据库。DBMS(DataBaseManagementSystem,数据库管理系统),由DBMS来负责管理数据,使用者只要“描述”要进行什么操作就可以了,DBMS相当于仓库管理员,只要向仓库管理员发出命令就可以,他怎么做我们不用关心,只要告诉他WhatToDo(要做什么),不关心HowToDo(怎么做)。DBMS和数据库的关系。大家都很懒,所以很多时候说数据库其实指的是DBMS。行业内的潜规则。不同的仓库管理员有自己的不同的优势。不同品牌的DBMS也有自己的不同的特点。MYSQL、MSSQLServer、DB2、Oracle、Access。。。OS/2SybaseSQLServer、MicrosoftSQLServerSybase和MS的恩恩怨怨。主流数据库(DBMS)有哪些?SQLSQLServerMSSQLServer。最常见的错误。行业内的潜规则。和仓库管理员打交道的方式:1、跑过去和他说;2、打电话;3、通过电脑传递信息(自动化的方式);操作数据库的两种方式:管理工具和程序代码。什么是Catalog(分类)(数据库、表空间)表(Table)把仓库分成不同的区域。不同的区域放不同类型的物品。将一个数据库(Catalog)分成不同的表,每个表放不同的数据。公司机密信息数据库:发票信息;合同信息;公司帐号;。。。。建不同的表。列(Column)已经将生肉放到单独的生肉区域里,每块肉都有不同的特性,取肉部位、重量。。。。为每块肉都贴一个标签,规定每一列的格式,重量应该是数字。生产日期应该是日期类型。数据类型(DataType),Int、Char、double一个道理。数据库,表、列、数据类型、记录。SQLYog中左边是数据库。Int:整数;varchar:字符串(String),Var(可变的),Char(字符);Boolean、char、date怎么使用Varchar,要指定长度,就像申明charbuff=newchar[200]使用工具创建数据库表,插入一条记录。表的命名规则、字段命名规则。常见数据类型说明。下节课内容:SQL语句、数据的增删改查。课下参考《程序员的SQL金典》进行深一步的学习和预习。板书:本课程的参考教材:杨中科的《程序员的SQL金典》第三章什么是SQL语句。SQL语句是和DBMS“交谈”专用的语句,和C、Java等的代码不一样,SQL语句你需要你告诉DBMSWhatToDo就可以,不需要告诉它HowToDo。本课程的命名规范:所有表以T_开头,字段(列、Column、Field)以F开头,这样可以很容易的看清哪个是表、哪个是字段。而且不容易和关键字冲突。增删改查:Insert、Delete、Update、Select。SQL语句是大小写不敏感的1、简单的Insert语句。向数据库中插入数据。Into后的列名和values一一对应,字符串用单引号InsertIntoT_Person(FName,FAge)values(Jim,25)InsertintoT_Person(FName)values(lily)2、怎么样查看表中数据Select*fromT_PersonSelect*from表名3、简化的Insert语句格式,不推荐InsertintoT_Personvalues(poly,33)4、数据的更新UpdateUpdateT_PersonSetFAge=305、多字段更新6、带Where语句的UpdateupdateT_PersonSetFAge=50whereFName=TomORFName=Jim7、数据的删除DeleteFromT_Person是删除T_Person表中的数据,并不是删除T_Person整个表结构。表还在,数据没了,人去楼空。8、带Where语句的删除deletefromT_PersonwhereFName=JimdeletefromT_PersonwhereFAge30下节课内容:数据的检索。课下参考《程序员的SQL金典》进行深一步的学习和预习。板书:《C语言也能干大事》第十六节数据库开发3本课程的参考教材:杨中科的《程序员的SQL金典》第四章1、SELECT基本用法a)检索所有列、检索指定列b)按条件过滤。通配符、Betweenandselect*fromT_EmployeewhereFSalary4000andFSalary8000select*fromT_EmployeewhereFSalaryBETWEEN4000And8000c)数据汇总selectSUM(FSalary),AVG(FSalary),MAX(FSalary),MIN(FSalary)fromT_EmployeeselectSUM(FSalary),AVG(FSalary),MAX(FSalary),MIN(FSalary)fromT_EmployeewhereFSalary8000selectCOUNT(*)fromT_EmployeewhereFSalary5000。满足条件的数据个数d)排序Ascending:ASC,升序Descending:Des,降序select*fromT_EmployeeorderbyFSalarydesc2、C语言中访问数据库a)ODBC简介。ODBC是微软提供的访问数据库的一种标准接口,通过ODBC可以连接MSSQLServer、MYSQL、DB2、Oracle、Access等各种数据库,通过统一的函数进行访问,也就是访问各种数据库都可以使用统一的函数。屏蔽了连接不同数据库的差异性。b)除了ODBC之外还有ADO、ADO.net等,Java中有JDBC等。都有连接、结果集、游标、事务、参数化SQL等概念,一通百通。c)没安装MYODBC(MYSQL的ODBC驱动)的首先安装MYODBC。http://down1.rupeng.com/download/software/MYODBC.rard)sql.h、sqlext.h、sqltypes.he)添加连接库“odbc32.libodbccp32.lib”。如果使用的是rupeng的DialogBased向导则已经自动添加。如果使用其他向导或者C-Free、PellesC等开发工具,则需要手动添加f)看模板代码。不用关心每个函数,用的时候copy以后改一改就可以,理解只要流程、主要概念即可,不要深究。有兴趣的可以研究CHECKDBSTMTERROR宏的实现。g)访问数据库可能遇到的错误:连接错误、执行错误。h)连接数据库、执行SQL、断开连接。连接字符串。数据库错误处理。SQLHDBChdbc:代表一个数据库连接句柄。和Socket里边的Socket连接类似,要访问数据库,先要连接到数据库。SQLHDBC:SQL、H句柄、DB(DataBase)、C(Connection)SQLHSTMThstmt:代表一个SQL语句。STMT(Statement,语句)SQLRETURN:执行结果。ODBC中字符串用SQLCHAR,SQLCHAR其实就是char的别名。SQLCHARConnStrIn[MAXBUFLEN]和charConnStrIn[MAXBUFLEN]一样。ConnStrIn:连接字符串,你要连接到的数据库的驱动、ip地址、用户名密码、数据库名(Catalog)等等都在连接字符串里描述。DRIVER:使用的驱动名;SERVER:ip地址;UID:用户名(UserID);PWD(Password):密码。DataBase:数据库名,Catalog。SQLDriverConnect:创建到数据库的连接,使用ConnStrIn连接。result表示执行结果。如果失败了SQL_ERROR==result。ShowDBConnError(hwnd,hdbc);来显示“连接错误”。result=SQLPrepare(hstmt,(SQLCHAR*)insertintoT_Person(FAge,FName)values(20,kider),SQL_NTS)。创建SQL语句的句柄。result=SQLExecute(hstmt);:执行SQL语句。SQLFreeStmt(hstmt,SQL_CLOSE);:释放SQL语句SQLDisconnect(hdbc);:断开数据库连接。课下参考《程序员的SQL金典》进行深一步的学习和预习。模板代码:购买此贴后可以得到整个工程的源代码:#includestdafx.h#includewindows.h#includewindowsx.h#includesql.h#includesqlext.h#includesqltypes.h#includeresource.h#includeMainDlg.h#defineLOGIN_TIMEOUT30#defineMAXBUFLEN255#defineCHECKDBSTMTERROR(hwnd,result,hstmt)if(SQL_ERROR==result){ShowDBStmtError(hwnd,hstmt);}BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam){switch(uMsg){HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);}returnFALSE;}BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam){returnTRUE;}voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){switch(id){caseIDC_OK:DBTest(hwnd);default:}}voidMain_OnClose(HWNDhwnd){EndDialog(hwnd,0);}voidShowDBError(HWNDhwnd,SQLSMALLINTtype,SQLHANDLEsqlHandle){charpStatus[10],pMsg[101];SQLSMALLINTSQLcharerror[200]={0};SQLINTEGERSQLlongerg2=SQLGetDiagRec(type,sqlHandle,1,(SQLCHAR*)pStatus,SQLerr,(SQLCHAR*)pMsg,100,SQLmsglen);wsprintf(error,%s(%d)\n,pMsg,(int)SQLerr);MessageBox(hwnd,error,TEXT(数据库执行错误),MB_ICONERROR|MB_OK);}voidShowDBConnError(HWNDhwnd,SQLHDBChdbc){ShowDBError(hwnd,SQL_HANDLE_DBC,hdbc);}voidShowDBStmtError(HWNDhwnd,SQLHSTMThstmt){ShowDBError(hwnd,SQL_HANDLE_STMT,hstmt);}voidDBTest(HWNDhwnd){SQLHENVhenv=NULL;SQLHDBChdbc=NULL;SQLHSTMThstmt=NULL;SQLRETURNSQLCHARConnStrIn[MAXBUFLEN]=DRIVER={MySQLODBC5.1Driver};SERVER=127.0.0.1;UID=PWD=DATABASE=CharSet=;SQLCHARConnStrOut[MAXBUFLEN];//分配环境句柄result=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,henv);//设置管理环境属性result=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);//分配连接句柄result=SQLAllocHandle(SQL_HANDLE_DBC,henv,hdbc);//设置连接属性result=SQLSetConnectAttr(hdbc,SQL_LOGIN_TIMEOUT,(void*)LOGIN_TIMEOUT,0);//连接数据库result=SQLDriverConnect(hdbc,NULL,ConnStrIn,SQL_NTS,ConnStrOut,MAXBUFLEN,(SQLSMALLINT*)0,SQL_DRIVER_NOPROMPT);if(SQL_ERROR==result){ShowDBConnError(hwnd,hdbc);}//初始化语句句柄result=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,hstmt);//SQL_NTStellingthefunctionthepreviousparameterisNull-TerminatedString,//pleasealculatethestringlengthformeresult=SQLPrepare(hstmt,(SQLCHAR*)insertintoT_Person(FAge,FName)values(20,kider),SQL_NTS);CHECKDBSTMTERROR(hwnd,result,hstmt);result=SQLExecute(hstmt);CHECKDBSTMTERROR(hwnd,result,hstmt);SQLFreeStmt(hstmt,SQL_CLOSE);SQLDisconnect(hdbc);SQLFreeHandle(SQL_HANDLE_DBC,hdbc);SQLFreeHandle(SQL_HANDLE_ENV,henv);MessageBox(hwnd,TEXT(执行成功),TEXT(标题),MB_OK);}板书:1、处理数据库查询序号从1开始,不是0SQLINTEGERcbsatid=SQL_NTS;while(SQLFetch(hstmt)!=SQL_NO_DATA_FOUND){SQLCHARname[20];SQLGetData(hstmt,1,SQL_C_CHAR,name,20,cbsatid);}SQLINTEGERcbsatid=SQL_NTS;while(SQLFetch(hstmt)!=SQL_NO_DATA_FOUND){SQLINTEGERi;SQLGetData(hstmt,2,SQL_C_LONG,i,sizeof(SQLINTEGER),cbsatid);}乱码问题解决方式,连接字符串使用GBK,修改数据库默认编码为gbk4、保存HDBC到全局变量中,长连接、短连接。比如Java、C#中访问数据库复杂多少。一通百通。要掌握调试的技巧,分析问题可能出错的原因和出错的地方,然后调试分析。一定不能和书上不一致,就懵了5、自己动手写用户管理系统:新增密码字段、新建用户,检验登录;SQLINTEGERcbsatid=SQL_NTS;//需要一行一行的读取,这种方式就叫做通过游标读取,无论是在JDBC、ADO/ADO.net。。。结果集//调用SQLFetch一次就向下读取一行,直到返回值为SQL_NO_DATA_FOUND的时候表示读到了最后//是不是和C语言文件访问中EOF有点像。while(SQLFetch(hstmt)!=SQL_NO_DATA_FOUND){TCHARname[20];//字符数组,SQLCHAR其实就是char的一个别名,所以和charname[20]一样。//调用SQLGetData来取列(Column)的内容//第一个参数就是代表SQL语句的hstmt、第二是要读取的列的序号(从1开始)//第三个是列的类型(SQL_C_CHAR字符串,在SQLExt.h中所有以SQL_C_开头的都是可选值)//第四个参数就是要接收的值的指针!!!//第五个是指针指向的缓冲区的大小//第六个不用管,那么调就行SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(SQLCHAR),cbsatid);MessageBox(hwnd,name,TEXT(),MB_OK);}while(SQLFetch(hstmt)!=SQL_NO_DATA_FOUND){SQLINTEGERi;//字符数组,SQLCHAR其实就是char的一个别名,所以和charname[20]一样。//调用SQLGetData来取列(Column)的内容//第一个参数就是代表SQL语句的hstmt、第二是要读取的列的序号(从1开始)//第三个是列的类型(SQL_C_CHAR字符串,在SQLExt.h中所有以SQL_C_开头的都是可选值)//第四个参数就是要接收的值的指针!!!//第五个是指针指向的缓冲区的大小//第六个不用管,那么调就行SQLGetData(hstmt,2,SQL_C_LONG,i,sizeof(i),cbsatid);TCHARname[20];SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(TCHAR),cbsatid);TCHARs[20];wsprintf(s,TEXT(%s年龄是:%d),name,i);MessageBox(hwnd,s,TEXT(),MB_OK);}result=SQLPrepare(hstmt,(SQLCHAR*)selectFUserName,FPasswordfromT_User,SQL_NTS);CHECKDBSTMTERROR(hwnd,result,hstmt);result=SQLExecute(hstmt);CHECKDBSTMTERROR(hwnd,result,hstmt);SQLINTEGERcbsatid=SQL_NTS;TCHARinputUserName[20];GetDlgItemText(hwnd,IDC_EDITUSERNAME,inputUserName,sizeof(inputUserName)/sizeof(TCHAR));TCHARinputPassword[20];GetDlgItemText(hwnd,IDC_EDITPASSWORD,inputPassword,sizeof(inputPassword)/sizeof(TCHAR));BOOLfound=FALSE;while(SQLFetch(hstmt)!=SQL_NO_DATA_FOUND){TCHARuserName[20];SQLGetData(hstmt,1,SQL_C_CHAR,userName,sizeof(userName)/sizeof(TCHAR),cbsatid);TCHARpassword[20];SQLGetData(hstmt,2,SQL_C_CHAR,password,sizeof(password)/sizeof(TCHAR),cbsatid);if(0==lstrcmp(inputUserName,userName)){if(0==lstrcmp(inputPassword,password)){MessageBox(hwnd,TEXT(输入正确,登陆成功!),TEXT(提示),MB_OK);found=TRUE;}}}if(FALSE==found){MessageBox(hwnd,TEXT(输入错误),TEXT(报错),MB_OK|MB_ICONERROR);}缺点是???数据量大了以后运行速度很慢。比如说咱们如鹏100万会员。Wsprintf课下作业:(1)细化报错信息:当用户名不存在的时候提示“用户名不存在”,当用户名存在而密码错误的时候报告“密码错误”。(2)保存用户的时候,如果用户已经存在则更新已有的用户信息;否则新增用户信息。(3)删除指定用户名的用户;(4)有能力的同学研究ListView控件的使用,列出当前数据库中的所有用户信息,选择某个用户可以删除、可以更新。下节课内容:作业点评:ListView控件的使用与用户管理系统。SQL注入漏洞及参数化SQL板书:1、程序中打开新对话框,其实有代码可参考,WinMain。DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,Main_Proc);只要复制一份MainDlg.cpp和MainDlg.h改一下就行了DialogBox(hInstance,MAKEINTRESOURCE(IDD_MYDLG),NULL,Dlg1_Proc);怎么传递参数?使用DialogBoxParam函数,对比差别。传入int;传入字符串;传入结构体。传出。怎样判断按下的按钮?通过返回值配合怎么样在对话框关闭的时候把参数回传回去?SetWindowLong设置的东西是和窗口的实例绑在一起的。什么是窗口实例?一个窗口打开两个、一个窗口打开两次(隐藏/打开、销毁/打开)。SetWindowLong(hwnd,GWL_USERDATA,(LPARAM)param);1、在资源中插入新的对话框,并且调整控件2、HINSTANCEhInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);DialogBox(hInstance,MAKEINTRESOURCE(IDD_LOGINDIALOG),NULL,Main_Proc);3、每个对话框都有自己的一套MainDlg.cpp类似的代码,Main_Proc、Main_OnInitDialog等等}

我要回帖

更多关于 数据库创建表的代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信