请大家不要非觉得在炫耀什么的心态来看文章,那就扭曲了本文章的出发点,就算我骄傲了一下,又能怎么样,若人人像我这样骄傲一下,我们的软件开发水平说不定几年就彻底超越日本、印度了,美国可能还难超越一些,这是事实,不要总是看不惯人家骄傲,我不写,谁知道?鬼知道?允许每个人发文章是博客园给予我们的权利。
本文想提醒: 为什么我们的劳动不值钱?
程序该干啥的,就应该干啥,不要乱来。
架构系统,需要严谨的思想,不要眼高手低,在我们的日常工作里,需要体现出我们的水平。
劳动成果要好好维护、不断重构、不断改进。
需要有一定的能力、境界、高度,才能让某个项目、产品能有质的变化。
我们天天学技术,是为了把软件做得更好,不是为了学而学,需要把学来的,体现在实际项目上。
理想与现实往往有很多差距,其实很多不足就在我们的眼前,可能我们自己没发现。
我们做项目,写程序时,需要思路严谨思路严谨再严谨,否则很容易是在制造电子垃圾
最近客户反馈,门户网站有安全检查要求,必须要达到某些安全检查要求,而且是今天电话打过来2天就需要更新上线,任务也很紧急,这也是我们大客户之一的要求,没办法,只能硬着头皮就上。
我刚来公司没多久,对公司的很多项目也不熟悉,由于这个项目是VS2003开发环境下开发的项目,我把这个任务交给了我们新来的一个同事。
新来的同事也刚来公司1个月左右,也是对公司的项目不太熟悉,交接过来没多久,整个工程有上百个页面,起先是想升级到VS2008,他给我的答复是,由于这个项目工期紧张,无法再短时间内升级到VS2008上,可能会引起很多麻烦,这个提议我也能理解了,毕竟时间比较紧急。
客户检测出来的主要问题,还是有SQL注入攻击的漏洞,虽然有些环节上也进行了处理,但是总感觉处理得不是很圆满,总有些让人放心不下。
其他安全因素先不考试,我想SQL注入问题的本质,还是在数据库访问层,数据库访问层牢靠了,这个问题就相对好解决了。
通过分析数据库访问层,我差点儿晕倒了,简直是让人头大啊,可以明显看出这个项目前后有5个接手换手,同一个项目,有接近5种数据库访问方法,更郁闷的是,什么数据库访问方式都用上了。
A: 有微软的数据库访问层。(这个我想干得不错,毕竟是要相信这个是可以放心的)
B: 有OLEDb的数据库访问方法。
C: 有SQLDb的数据库访问方法。
D: 有静态的数据库访问方法,也有动态方法访问数据库的,奸奸杀杀、杀杀奸奸。
E: 有自己做的数据库连接池方法。
F: 处了一些必要的数据库访问方法外,其他一些辅助的功能函数也都写在数据库访问类里去了,那还分层干个屁啊?干脆不分层算了嘛,该干啥的,就应该干啥呀。
G: 完成相同功能的,不同名字的函数多如毛,不知道这个是否属于思路混乱类型的。
以上问题是通过分析源码发现的错误,那最关键是的,解决参数化的SQL语句执行功能,新来的同事参加工作才四年左右,功夫也不是非常过硬,胆子也不够大,所以他也看着代码不知道怎么弄才可以,找了几个同事帮忙,也没能搞定,因为其他同事也有其他同事要忙的事情,毕竟这个网站先不来钱,先忙乎能来钱的项目更要紧。
我就好奇,前后有5个以上的人维护过这个项目,怎么就没一个人把这个项目维护得还过得去呢?以前的技术总监,都在管啥呢?难道这些代码质量啥的,管都不管一下?也不指导一下?前后有那么多人,没一个人自觉的深入维护一下?
那还是我来折腾一下吧。
1:我的数据库访问层写得是相当的不错,可以考虑用我的组件,但是我的组件已经升级到2.0了,VS2008的开发环境下的,没办法用到VS2003下的1.0开发环境里去了,所以这个方法被放弃了,那只能是把我的好思想拿到这个项目里用。
2:微软的数据库访问方法先不动原则,信任这个是好的。
3:所有的程序修改为微软的数据库访问方法,工作量太大,受不了,上百个页面需要修正,不是1天就能修改好的。
4:那先解决参数化的SQL语句执行方法,新写了一个数据库访问的DbHelp类,就这样项目里,又多了一个垃圾出来了一样,变成6个人的痕迹了,呵呵。
5:这个DbHelp类里写上最有必要的几个数据库访问的函数,然后编译程序通过。
int ExecuteNonQuery(string commandText, DbParameter[] dbParameters);
int ExecuteNonQuery(string commandText);
object ExecuteScalar(string commandText);
object ExecuteScalar(string commandText, DbParameter[] dbParameters);
DataTable Fill(string commandText);
DataTable Fill(string commandText, DbParameter[] dbParameters);
DataReader ExecuteReader(string commandText, DbParameter[] dbParameters);
DataReader ExecuteReader(string commandText);
写好这几个方法,应该足够用了,数据库访问层写那么多方法刚啥,有病啊。
6:接下来,一个个干掉其他4个人写的函数,每干掉一个函数,编译一次项目,然后整体进行替换处理,花费了2个小时不到,替换删除了几千行以上的代码,终于把乱八七糟的数据库访问方法给全部清理干净了,心理舒服了很多。
7:再接着,把功能相同、命名不同的函数一个个清理干净、该删除的删除、该放到其他类里的放到其他类里,该干啥的,就放在干干啥的类里,该改名字的该名字。
8:再接着清理,命名不规范的变量名,整体进行替换,例如 strSQL, 看看就想吐,有的替换成 微软的commandText,有的替换成 sqlQuery 等,虽然 sqlQuery也未必是对的,但是总体上讲比恶心的 strSQL 强很多。
9:一个个页面里的参数化问题,我写了一个标准的例子程序,这个我实在是没精力修改了,我们新来的同事工作也很认真,就叫给他慢慢的把这上百个页面,一个个修正好,他足足修改了2天,才走了一圈,把参数化的错误都修正了。
10:在用了外壳,在 Global.asax 里的,SQL注入预防措施,尽量防止SQL注入,进行了双层的安全防护措施。
11:测试了几个小时,典型的页面都运行正常,再发布给客户,重构工作告一段落。
有些东西,需要有魄力、需要有突破能力,需要有全盘把握能力,才能折腾,否则,花费1个月才能修改好,那就不叫水平了,就用1-2天就可以重构多年的历史遗留问题,那才叫水平,动手能力。
有些问题,改改的现在就改,还没到癌症晚期时就应该看看病,现在不调整,以后这个新员工辞职了,又来一个,又走一个,越改越乱,越维护越乱,那公司这么多前前后后也投入了不少钱,这次来个有力度的修改,以后接手的人,看着代码也清爽,上手也容易,理解也容易,一个项目有4-5种数据库访问方法,人家到底要用哪个呀?不是头晕啊?给将来要接手的人,铺个路吧,让他接手后,不要再觉得很恶心,写得很乱。
只有天天仔细维护、改进的架构,才有长久的生命力,该改的错误要及时修正,一天比一天稳健,劳动成果才能有效的积累下来的,3年都不维护了,那整个系统也就废掉了,成了电子垃圾,公司的投入,这么多人,前前后后的维护辛勤劳动就这样人间蒸发了,成了电子垃圾了,为什么我们的劳动不值钱?老外的劳动就值钱?因为我们不懂得积累,劳动成果在严重浪费,管理不善也是更大的问题所在。
思路严谨的人,才能把重构公司一个网站的详细步骤分解得先后顺序里得清楚,每个步骤的先手顺序、难度、关联、影响范围等等,分解成N个小功能节点,里程碑,有条有理的进行工作分解安排好。
posted on 2010-04-23 11:31 不仅仅是通用权限设计 阅读(2439) 评论(69) 编辑 收藏
评论
1859834#2楼[楼主] 回复 引用 查看
@阳光沙滩海岸线那是你看来,是这样的,为什么非要觉得是炫耀呢?就算我炫耀了,又能怎么样?难道我没有炫耀的权利吗?
#3楼 回复 引用 查看
再接着清理,命名不规范的变量名,整体进行替换,例如 strSQL, 看看就想吐--------------想问一下怎样命名才规范?有无这方面的资料?因我是一个业余爱好者,没有这方面的经验,想学习一下,谢谢指教!#4楼[楼主] 回复 引用 查看
微软的例子代码多看,我想微软的例子代码里,很少有strSQL吧,我几乎没看到过,微软怎么命名函数名,我们就怎么命名,微软怎么命名参数,我们就怎么命名参数就是最好的命名规范。#5楼 回复 引用 查看
老吉 是越来越活跃了.... 唉..怎么说呢....#6楼 回复 引用 查看
strSQL这个都到了想吐的程度了呀,呵呵
#7楼 回复 引用 查看
LZ,请教下sqlQuery 比strSQL哪方面好呢?#8楼 回复 引用 查看
@吉日嘎拉 不仅权限设计你得承认还有多数人,跟进不了您的写作发帖思想,不乏有部分肯定认为你的组件又卖不出去了。
#9楼 回复 引用 查看
支持吉日大哥. 能把自己的想法拿出来和大家分享, 并接受抛砖, 值得尊重!#10楼 回复 引用 查看
我靠,开始将技术了啊,好#11楼[楼主] 回复 引用 查看
string strSQL, 猪都知道,这个SQL是字符型的,那何必前面加个多余的str呢?那按这个逻辑int类型的,前面加啥?
bool 类型的前面加啥?
DbParameter 类型的,前面加啥?
为什么 str 加了,其他就不加?开发环境里超级方便就能知道是当前变量是否string类型的,何必加个多余的str让人看着别扭呢,这不是有病吗?
sqlQuery 比他强就强在 少了个str,
微软为什么不用 strCommandText?
我们天天在微软的类库基础上写代码,那也学学人家的好,非要来个中国特色的垃圾出来呢,好的不学,坏的学的快、传播得也快。
我不是说我写得有多少好,有错就承认,有错就马上改,就这么简单的思路,别人说得对,我就采纳,别人说的错,我就争论。
#12楼 回复 引用 查看
楼下保持队形 ┏━━━━━━━┓ 错点博客失足者┏┓ ┏┫ |||┣┓ ┏┓
┣┫ ┗┫━━ ┃ ━━┣┛ ┣┫
┏┳┫┣┳┓ ┃ ━━━━━ ┃ ┏┳┫┣┳┓
┃老子手贱┃ ┗━━━┳━━━┛ ┃误入此处┃
┗━━━━┻━━━━▇▇▇━━━━┻━━━━┛
#13楼[楼主] 回复 引用 查看
@¥小舟总比没人知道曾经来过人间好很多啊,有很多人知道你的存在,就是很不容易了,思想拿出来交流,才能知道是对的还是错的,不交流,不沟通怎么进步啊?
#14楼[楼主] 回复 引用 查看
@贺爱平一直是讲技术的,只是你没能跟上思路,哈哈,气你一下下。
#15楼 回复 引用 查看
@贺爱平精神还是好的。这点值得表扬。
#16楼 回复 引用 查看
跳槽了?#17楼 回复 引用 查看
感谢吉日嘎啦,总是能将我们日常干的事情写的如此的雄壮!
看着颇有一种气吞山河如虎的壮烈感!!!
#18楼 回复 引用 查看
一点技术含量都没有,做人还是低调点#19楼 回复 引用 查看
习惯就好了
#20楼 回复 引用 查看
看你文章就像看你的头像 实际些吧#21楼[楼主] 回复 引用 查看
@xiao_p日常生活里,才能体现我们的技术能力,真正有价值的东西。
#22楼[楼主] 回复 引用 查看
@李杰那你还要我多少技术含量?什么叫有技术含量?给你造出原子弹来,才算技术含量吗?你都有啥技术含量?
#23楼 回复 引用 查看
为什么不用企业库,有哪些部分你实现了,而企业库没有实现?#24楼 回复 引用 查看
@吉日嘎拉 不仅权限设计不想争论什么了。。
#25楼 回复 引用 查看
不错。#26楼 回复 引用 查看
命名这个例子太差了。CommandText和StrSql的差别是匈牙利法的问题。
之所以现在修饰法比匈牙利法越来越常用是因为数据类型在实际应用中是经常变化的。
比如UserID这样的字段,可能最开始的需求是int,但是将来根据需要变成string,也可能变成GUID,如果你一开始就叫做intUserID,当你需要改成string型的时候,你是把所有的地方都再改成strUserID呢,还是继续维持intUserID呢?前者会导致增加大量的测试点,后者会导致歧义。
另外是CommandText和SqlQuery的差别,CommandText用的是修饰法,类似TextWriter, IndexController这一类的风格。
归根结缔还是为了贴近现实生活的语言习惯,你是习惯说salary man呢还是man that earn his living by salary 呢?
#27楼 回复 引用 查看
嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉 嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉。。。哈哈哈
#28楼 回复 引用 查看
strSQL很正常,字符串,SQL用的。到时sqlQuery不伦不类。
微软CommandText 的text也是标明str
所以不用strCommandText 。
#29楼 回复 引用 查看
有时也不能怪维护程序的人.怪只能怪始作俑者.
一开始的架构都很丑.维护的人在时间 进度面前也只能硬着头皮修改了.
还是有个负责的开发经理能监督一下代码质量会好一些
往往关心项目的确是市场部分的人.他们只要效果.
#30楼 回复 引用 查看
strSQL我也是这样命名的,看样子要被楼主BS了
#31楼 回复 引用 查看
我用stmt或者cmdText#32楼 回复 引用 查看
吉日虎躯一震,俺们的小心肝就乱颤啊#33楼 回复 引用 查看
那你的sqlQuery 看着不更奇怪了,难道要告诉大家,它是一个查询的SQL语句吗?(这个纯属个人猜测)
还有,你修改源代码,一定会在开发环境中吗??
#34楼[楼主] 回复 引用 查看
那就写成 SQLString,看看也不会那么别扭了。strSQL很正常,字符串,SQL用的。
到时sqlQuery不伦不类。
微软CommandText 的text也是标明str
所以不用strCommandText 。
#35楼[楼主] 回复 引用 查看
你能争得过,我也服了你了,一个好好的文章,有什么错?又没骂你,又没惹你,你何必来打击我哪? 是不是太SB了一些。你有技术,你有水平,那你写写,给大家看看嘛,若真有水平,我也佩服你啊,就怕狗眼看人低的那帮人,拿又拿不出什么来,看啥都不顺眼的家伙。
@吉日嘎拉 不仅权限设计
不想争论什么了。。
#36楼[楼主] 回复 引用 查看
你也太坏了,坏透了,呵呵嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉 嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉嘎拉。。。
哈哈哈
#37楼 回复 引用 查看
关于命名,建议大家看看.NET设计规范,中文版马上就要出版了。#38楼 回复 引用 查看
整理个代码,有必要这么夸张嘛,还以为你做了什么惊天动地的大事。熟手两个小时就OK了,而且这看不出重构的意义,看你的行为倒是挺官僚的。
#39楼 回复 引用 查看
我也觉得strSQL好..strSQL.Format(.....)
strJS.Format(...)
cmdText
strUserName,iUserID,dbOrder等等
前缀标识变量类型,后面说明变量含义,通俗易懂有什么不好啊..特别是当函数里变量较多的时候阅读起来很轻松
#40楼[楼主] 回复 引用 查看
@小 雷上面的2个雷,的确都很雷啊,哈哈,我服了。
#41楼 回复 引用 查看
有人见过TextBox1~TextBox53...这类的命名法没..很操蛋的...维护这样的代码才TM痛苦..一个aspx对应的.cs文件4000行代码...什么东西都往里面丢,NND#42楼 回复 引用 查看
语义不通,错别字好多#43楼 回复 引用 查看
strSQL来源于VB6的编程习惯,可以理解如果使用 Vs2003以上开发的,还用这个,就说明没有跟上时代。
再说一次:老板并不懂你做得好还不好,而是需要你能糊弄过去即可。
我想多数的主管就是这样,再说了,我走人,关我什么事了;这是现实的问题。做得好的人或官,是需要时间来证明;但如果离开了位置,又能怎样。
这是一样矛盾,看每个人如何权衡。
#44楼 回复 引用 查看
这里成你发神经的地方了啊?你屁大点的事都放首页,你恶心不?真TM闹眼睛。#45楼 回复 引用 查看
再说一次:老板并不懂你做得好还不好,而是需要你能糊弄过去即可。
我想多数的主管就是这样,再说了,我走人,关我什么事了;这是现实的问题。做得好的人或官,是需要时间来证明;但如果离开了位置,又能怎样。
这是一样矛盾,看每个人如何权衡。
大多数人都有这个心理。现在大伙都忙赚钱,谁在意质量如何啊
#46楼 回复 引用 查看
不错,锐意进取,再接再厉,为到达XXX目标继续努力。#47楼 回复 引用 查看
搂住如果再补充一些防治注入的技术细节就更好了。#48楼 回复 引用 查看
刚刚才看到美国的空天飞机上天了,真他妈的牛B!真是没法与美国人比,...
#49楼 回复 引用 查看
命名这个例子太差了。
CommandText和StrSql的差别是匈牙利法的问题。
之所以现在修饰法比匈牙利法越来越常用是因为数据类型在实际应用中是经常变化的。
比如UserID这样的字段,可能最开始的需求是int,但是将来根据需要变成string,也可能变成GUID,如果你一开始就叫做intUserID,当你需要改成string型的时候,你是把所有的地方都再改成strUserID呢,还是继续维持intUserID呢?前者会导致增加大量的测试点,后者会导致歧义。
另外是CommandText和SqlQuery的差别,CommandText用的是修饰法,类似TextWriter, IndexController这一类的风格。
归根结缔还是为了贴近现实生活的语言习惯,你是习惯说salary man呢还是man that earn his living by salary 呢?
有理有据
#50楼[楼主] 回复 引用 查看
这个例子讲得太好了,服了,又学了一招了,谢谢szwe比如UserID这样的字段,可能最开始的需求是int,但是将来根据需要变成string,也可能变成GUID,如果你一开始就叫做intUserID,当你需要改成string型的时候,你是把所有的地方都再改成strUserID呢,还是继续维持intUserID呢?前者会导致增加大量的测试点,后者会导致歧义。
#51楼 回复 引用 查看
吉大牛,看你的很多文章,发现很多人都没有发现你的优点,我发现你有个很大的优点,有几篇文章中的图画的很漂亮。这里绝大多数都是技术狂,说白都是拿枪的士兵,在项目中充当打手的角色,通过对吉大牛的研究发现,吉大牛定位是项目经理,不是士兵的角色。这也难怪你吉某人的文章不受欢迎。千军易得,一将难求,当刘邦建朝,论功行赏,在外面打打杀杀的大将都认为自己的功劳比平日里替刘邦出谋划策的一些人的功劳大,而刘邦给平日里给自己出谋划策的人的赏赐高于那样大将,大将们都不服,认为自己都是昌生命危险,而那些都是凭自己的嘴巴做事,刘邦说了一句......
我建议如下:吉大牛你要是真的想在园里子牛的话,就当好将军的角色你说你有搞软件有近十年了,玩过项目经理,就讲下当客户给你一份文档,你是怎么开如需求分析,文档是怎么样编写,开发人员是怎么样组织,项目进度控制,项目风险控制,成本控制,等等。
把这些晒出来,你吉大牛不说很多人也能博得一部分人的认同吧,
理由很简单,想当将军的士兵还是有的,
不要在园子发些心灵鸡汤之类的文章,没有用的,这些文章只有人经历过才能体会到的。
#52楼 回复 引用 查看
那我到底该怎么写程序呀?我已经很严谨了!#53楼 回复 引用 查看
真为你那工作4年的同事担心...#54楼 回复 引用 查看
“加强网站安全、重构公司的门户网站项目(C# VS2003) ”其实这个标题是够吸引眼球的,但是看文章的最后,我觉得好象没有怎么看到实质性的东西。都是泛泛而谈,评论讨论起了命名的习惯和规范了。#55楼[楼主] 回复 引用 查看
@安布雷拉SQL 注入是,最严重的安全问题,这个防止了不是大的方向上的问题解决了吗? 如何彻底防止 SQL 注入,不就是本人写的吗? 分了2个部分。
#56楼 回复 引用 查看
博客园就是一大锅“心灵鸡汤”!
想提高智商的,就来个鸡脑袋;
想学得圆滑的,就来只鸡脖子;
总想当领导的,就来只鸡翅膀;
总担心掉队的,就来只鸡爪了;
总是想吹牛的,就来只鸡屁股;
如果您不求进取,那就来碗鸡汤...
哈哈!
#57楼 回复 引用 查看
博客园就是一大锅“心灵鸡汤”!
想提高智商的,就来个鸡脑袋;
想学得圆滑的,就来只鸡脖子;
总想当领导的,就来只鸡翅膀;
总担心掉队的,就来只鸡爪了;
总是想吹牛的,就来只鸡屁股;
如果您不求进取,那就来碗鸡汤...
哈哈!
我哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
笑完了,抽包红金龙
#58楼 回复 引用 查看
@俺是老杨你说的很对啊。我也认同你的观点……
#59楼 回复 引用 查看
┏━━━━━━━┓鄙视博主……………………(江苏代表队)┏┫ |||┣┓ ┏┓
┗┫━━ ┃ ━━┣┛ ┣┫
┃ ━━━━━ ┃ ┏┳┫┣┳┓
┗━━━┳━━━┛ ┃ ┃
┏━━▇▇▇━━━━━┻━━━━┛
┃ ▇▇▇
┃ ▇▇▇
┗ ┃Ψ┃
┃ ┃
┛ ┗ ………………后边跟上
#60楼 回复 引用 查看
名字短的失去风格了,不断刷新博客园,竟然没看到这篇文章,汗。#61楼 回复 引用 查看
DbParameter[] dbParameters性能远远比不过
OracleParameter[] dbParameters
SQLParameter[] dbParameters
......等的执行效率
......
#62楼 回复 引用 查看
肤浅#63楼 回复 引用 查看
呵呵,支持一下!#64楼 回复 引用 查看
这算什么我还见过 TextBox1......到TextBox21的呢
#65楼 回复 引用 查看
我一般直接写 string sql = "xxx";约定俗成的东西,没有必要搞得那么严肃,变量叫sql,再傻的人也知道这就是sql,它就是string类型,就是查询数据库的语句,难不成还是其它意思(当然还有一个意思,sql比sqlQuery短点,可以少写一些代码。)?我比较反对匈牙利命名法。
该长就长,该短就短;有些家伙写的,明明取到的值已经是一个文本了,还傻傻的再加一个ToString(),何苦呢,何必呢!
另外,大小写的问题顺便说说。如果是变量,一般遵守驼峰式命名的习惯,但把这玩意儿延伸到SQL语句中去,我觉得就有点得不偿失了。细想一下,SQL语句是如此常用的、需要大量书写的东西,非得在select/where/and以及每个字段首字母大写,除了好看一点之外,几乎一无是处,带来的副作用是工作量增加不少,而实际工作中,团队成员也不爱遵守,本意是好的,但效果就差了。一般来说,我只严格要求不得使用大写书写SQL语句,至于首字母是否大写,看个人习惯--我认为这个是小节;但在整体SQL格式方面,那是严格要求每字段占一行,绝对不允许挤在一起写,这不是小节,这个关系到代码清晰度、后期维护、编码严谨性的问题,无论如何严格要求都不为过。
#66楼 回复 引用 查看
呵呵,感觉内容确实有些写流水线的感觉,如果能系统化,深入化就更好。总结一下,楼主大致讲了三个问题:
1,安全问题,举SQL注入为例
2,规范化问题,据命名规则为例
3,复用问题,举函数的例子
只是各个方面都浅浅的谈了一下,作为工作日志可以,作为分享的技术文章有些粗糙
---------------------------------
个人观点,只为交流之用,莫口舌之争!
#67楼 回复 引用 查看
博客园的凤姐#68楼 回复 引用 查看
strSQL 明显MFC出身,哈哈#69楼 回复 引用 查看
推荐一个,至少有些东西是可取的!