Monthly Archives: 十二月 2005

我不后悔

只是仿制了一份fllash片头动画,很快又是夜深了。刚准备睡觉,打开了收音机,传出来一首歌,我知道没有听过,不过曲调我非常喜欢,悠扬的曲子带点淡淡的忧愁。凭着一句歌词“我不后悔爱过”通过百度搜到了这首“我不后悔”。

 歌曲:我不后悔   
 歌手:林志颖 专辑:去走走 

说好了不回头不想承诺
缘份尽了你别过头
如果还有什么值得我逗留
我想是你爱过我
只是路无尽头都是路过
什么感受我能带走
眼泪可以不流心碎不能救
看我能否得自由当我松开你的手
一些风沙哽住眼眸
爱你最后一幕却模糊带过
不让疼痛有路追究
我不后悔我曾爱过
只是天涯从此寂寞
远去的渡口彼岸的灯火
人在河流只许漂泊
我不后悔被你爱过
只是不能爱到最后
短暂的幸福拥有就足够
只要舍得就会快乐会快乐

正如前两天在 zuola 的日志上看到一句话:“你选择了你不愿意的选择,但那也是你的选择”。
所以对于任何已经做过或将要做的事,即使曾经有过后悔,但现在和以后我不后悔。

完全CSS导航菜单的制作

完全CSS导航菜单的制作
完全CSS导航菜单的制作
CSS二级导航菜单效果:
导航菜单代码如下:

随笔

好久也没写过自己的东西了,只是在网上找到一些自认为能自己会有用的资料全贴上来了。
又快元旦了,也就是说只有十多天我就要回家看看父母和弟弟了,一转眼又是两年过去了。这两年只有与我妈妈经常通通电话,以前很好的朋友或亲戚都几乎没联系过了,这次回家真有点害怕,他们肯定会说我的了。
回家前公司还有点任务是必需要完成的,任务量不多也还不少,因为事情做起来还真是有点费时间。实在不行就晚上拿回来做也是要完成的。私人的事就明年来了再说了。好在公司对我还算照顾,让我提前半个月左右回去。
本想去合肥看看的,可是以前中医学院的同学都已经毕业,留在合肥的不多,而且也没联系过了,几个哥们也都考砑离开了合肥。有时很后悔当初没好好学习而私自退学,不过好好想想人生的道路不是只有一条,每个人有每个人的活法,只要能珍惜现在就会有美好的未来。正如一句话:”即使你选择了你不想选择的,那也是你的选择!”
回到家一定与中学的同学好好联系一下,最好能组织个同学聚会,这年头个个都忙,想聚一次真的不容易。
还有亲戚也是要跑一下的,我本不喜欢走亲戚的,不过活在这人世间人情世故还是不可或缺的。
最近又感到比较孤独,不知为什么。照理说现在应该不这样啊。朋友也不少,有时感觉我的朋友好多,到处都有。能常在一起的不多,但总还有几个。也经常一起出去玩。朋友可以消除孤独和寂寞,可以消除烦恼,所以我喜欢朋友,对朋友会以我最真诚的心去对待。但对异性朋友关系不能发展的太好,否则很容易引起更大的寂寞和孤独。
刚来广州的一段时间那真是很孤独,当时我很感谢我的朋友兼同学诗云。因为那时从武汉过来广州的就我们两个人,刚过来人生地不熟,我们互相支持互相鼓励,所以我很感谢这位朋友。但他当年就回家过年了,之后就没来了,也就没再见过面了。偶偶能联系上。
在广州三年也认识了不少朋友,有校友,也有同事,还有忘年之交,都得到过这些朋友不少的帮助,在交往过程中互相了解,我感谢这些朋友,感谢上天让我能拥有这些朋友。

注册成系统服务的方法–参考用于黑洞

几天下了个鸽子来研究下注册成系统服务的方法(我不用鸽子),发现它是用rundll32导入一个inf来实现的,这个应该是加了注册表锁(禁用reg脚本,禁用regedit)都有效的吧?
例子如下:
增加一个服务:
[Version]
Signature=”$WINDOWS NT$”
[DefaultInstall.Services]
AddService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=Windows Internet Service
Description=提供对 Internet 信息服务管理的支持。
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=%11%inetsvr.exe
保存为inetsvr.inf,然后:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:pathinetsvr.inf
这个例子增加一个名为inetsvr的服务(是不是很像系统自带的服务,呵呵)。
几点说明:
1,最后四项分别是
服务类型:0x10为独立进程服务,0x20为共享进程服务(比如svchost);
启动类型:0 系统引导时加载,1 OS初始化时加载,2 由SCM(服务控制管理器)自动启动,3 手动启动,4 禁用。
(注意,0和1只能用于驱动程序)
错误控制:0 忽略,1 继续并警告,2 切换到LastKnownGood的设置,3 蓝屏。
服务程序位置:%11%表示system32目录,%10%表示系统目录(WINNT或Windows),%12%为驱动目录system32drivers。其他取值参见DDK。你也可以不用变量,直接使用全路径。
这四项是必须要有的。
2,除例子中的六个项目,还有LoadOrderGroup、Dependencies等。不常用所以不介绍了。
3,inetsvr后面有两个逗号,因为中间省略了一个不常用的参数flags。
删除一个服务:
[Version]
Signature=”$WINDOWS NT$”
[DefaultInstall.Services]
DelService=inetsvr
很简单,不是吗?
当然,你也可以通过导入注册表达到目的。但inf自有其优势。
1,导出一个系统自带服务的注册表项,你会发现其执行路径是这样的:
“ImagePath”=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,
74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,
00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00
可读性太差。其实它就是%SystemRoot%system32 lntsvr.exe,但数据类型是REG_EXPAND_SZ。当手动导入注册表以增加服务时,这样定义ImagePath显然很不方便。而使用inf文件就完全没有这个问题,ServiceBinary(即ImagePath)自动成为REG_EXPAND_SZ。
2,最关键的是,和用SC等工具一样,inf文件的效果是即时起效的,而导入reg后必须重启才有效。
3,inf文件会自动为服务的注册表项添加一个Security子键,使它看起来更像系统自带的服务。
另外,AddService和DelService以及AddReg、DelReg可以同时且重复使用。即可以同时增加和删除多个服务和注册表项。
我就是这样手工把黑洞注册成服务了,呵呵。
安静的补充:
不错…
我是用把黑洞感染进别的服务文件以达到以服务方式启动的….
特点是隐蔽性好!~..还有点自我保护功能呵呵..就算他删了.重新启动又会再生成
由于是感染进去的所以不会影响原文件:)

三千年来振奋过中国人的100句口号

  一、古代中国(从先秦到1840):
  春秋战国时期:公元前770年-公元前221年
  1:天行健,君子以自强不息。———《易经》
  2:发奋忘食,乐以忘优,不知老之将至。———《论语》
  3:三军可夺帅也,匹夫不可夺志也。———《论语》
  4:修身、齐家、治国、平天下。———《大学》
  5:富贵不能淫,贫贱不能移,威武不能屈。———《孟子》
  6:生于忧患,死于安乐。———《孟子》
  7:吾生也有涯,而知也无涯。———《庄子》
  8:路漫漫其修远兮,吾将上下而求索。———屈原《离骚》
  9:亦余心之所善兮,虽九死其犹未悔。———屈原《离骚》
  10:不鸣则已,一鸣惊人。——《史记。滑稽列传》
  秦汉时期:公元前221年-公元220年
  11:燕雀安知鸿鹄之志?———《史记。陈涉世家》
  12:一屋不扫何以扫天下?———《后汉书。陈蕃传》
  13:有志者,事竟成。———《后汉书。耿弇传》
  14:精诚所至,金石为开。———《后汉书。广陵思王荆传》
  15:少壮不努力,老大徒伤悲。———《汉乐府。长歌行》
  国魏晋南北朝:公元220年-公元581年
  16:老骥伏枥,志在千里;烈士暮年,壮心不已。———曹操《龟虽寿》
  17:捐躯赴国难,视死忽如归。———曹植《白马篇》
  18:鞠躬尽瘁,死而后已。———诸葛亮《后出师表》
  19:宁为玉碎,不为瓦全。———《北齐书。元景安传》
  隋唐宋:公元581年-公元1271年
  20:天生我材必有用。———李白《将进酒》
  21:天变不足畏,祖宗不足法,人言不足恤。———王安石
  北宋神宗时期,王安石力主变法,反对因循保守,提出这一著名的“三不足”论断。
  22:生当作人杰,死亦为鬼雄。———李清照《夏日绝句》
  23:位卑未敢忘忧国。———陆游《病起书怀》
  元明清:公元1271年-公元1840年
  24:人生自古谁无死,留取丹心照汗青。———文天祥《过零丁洋》
  25:风声雨声读书声声声入耳,家事国事天下事事事关心。———顾宪成
  26:明日复明日,明日何其多?我生待明日,万事成蹉跎。———《明日歌》
  27:天下兴亡,匹夫有责。———顾炎武
  28:千磨万击还坚劲,任尔东西南北风。———郑板桥《竹石》
  29:海纳百川,有容乃大;壁立千仞,无欲则刚。———郑板桥《对联》
  二、近现代中国(1840-1949):
  30:师夷长技以制夷
  鸦片战争失败后,以魏源为代表的先进知识分子强调学习西方科学技术,反击外来侵略,这句话成为近代中国探索国家出路的先声。
  31:习兵战不如习商战
  19世纪60年代起,早期维新派郑观应等人提出,在硝烟弥漫的战场外,还有另外一种战争,即“商战”,中国的工商业者自此以“富国”理想的担当者步入历史。
  32:变法自强
  甲午战争后,亡国灭种危机空前加剧。洋务派和维新派中很多知识分子逐渐意识到西方资本主义东渐中国的趋势,于是提出该口号。
  33:中学为体,西学为用
  中学为体,即坚持形而上的中国孔孟之道;西学为用,就是采纳形而下的西方科技之器。这句口号为晚清社会传播西方近代文明,推进洋务改革做出很大贡献。
  34:振兴中华
  孙中山先生1894年在美国檀香山建立“兴中会”时提出。
  35:扶清灭洋
  1898年10月,赵三多等人领导山东冠县人民举行反教会斗争之时,其所用旗帜即标“扶清灭洋”,这反映出当时中国人民反对帝国主义、挽救民族危亡的强烈愿望。
  36:驱除鞑虏,恢复中华,建立民国,平均地权
  1905年7月,中国同盟会通过以孙中山提出的“驱除鞑虏,恢复中华,建立民国,平均地权”为政治纲领。1906年孙中山首次将其概括为:民族、民权、民生三大主义。
  37:打倒帝国主义
  1922年五一节,中国劳动组合书记部召开第一次劳动大会,大会接受了共产党提出的“打倒帝国主义”的口号,此口号成为中国近代史上最具影响力的口号之一。
  38:勿忘国耻
  1915年5月,袁世凯承认了卖国的“二十一条”。全国各地商民、学生及海外华侨纷纷集会,宣传反日救亡,号召“抵制日货,勿忘国耻”。
  39:拥护共和万岁
  来自1915年护国运动期间,昆明人民张贴的一条旨在反对复辟,拥护共和的标语。
  40:实业救国
  产生于洋务运动时期,盛行于辛亥革命和五四运动前后,是中国近代史上主张以兴办实业拯救中国的社会政治思想。
  41:要拥护德先生和赛先生
  1919年,陈独秀在《新青年》杂志上撰文提出,“要拥护德先生又要拥护赛先生,便不得不反对国粹和旧文学”。而被称为德先生和赛先生的即是近代中国“民主”与“科学”两大时代主题。
  42:提倡新文学,打倒旧文学
  新文化运动开始后,《新青年》杂志提出提倡白话文,打倒文言文;提倡新文学,打倒旧文学的口号。陈独秀发表《文学革命论》一文,号召将“封建文学”彻底打倒,提倡“写实文学”等。
  43:打倒孔家店
  五四运动前夕,吴虞在《新青年》杂志上连续发表《吃人与礼教》等文章,喊出“打倒孔家店”的口号,猛烈抨击了封建礼教和旧文化。
  44:劳工神圣
  1918年11月16日,蔡元培作了《劳工神圣》的演说,鲜明提出要“认识劳工的价值”,并喊出了“劳工神圣”的口号。
  45:内除国贼,外抗强权
  1919年5月4日,北京青年学生在天安门集合举行示威游行,高呼“外争国权,内惩国贼”、“废除二十一条”、“拒绝在和约上签字”等口号。
  46:与劳工阶级打成一片
  1919年初,李大钊发出了“知识阶级与劳工阶级打成一片”的号召,五四以后,他进一步号召青年知识分子投身到劳动人民中去,通过“共同劳动”来改造中国和改造自己。
  47:为自由而战,为争人权而战
  京汉铁路总工会在1923年2月4日实行全路大罢工,提出了此口号。
  48:革命尚未成功,同志仍需努力
  1925年3月12日,孙中山先生与世长辞。他在遗嘱中说:“现在革命尚未成功,凡我同志,务须依照余所著《建国方略》、《建国大纲》、《三民主义》及《第一次全国代表大会宣言》,继续努力,以求贯彻。”
  49:枪杆子中出政权
  1927年8月7日,中央在汉口召开紧急会议,毛泽东在会上做了重要发言,指出党今后“须知政权是由枪杆子中取得的”,这是党对革命认识的重大进步。
  50:没有调查,就没有发言权
  1928年春,毛泽东提出这句响亮的口号,从思想上、工作方法上清除“左倾”机会主义的影响。
  51:星星之火,可以燎原
  1930年1月5日,毛泽东写信批评一些同志对时局估量的悲观思想。他引用一句老话:“星星之火,可以燎原”。由此,这句话就成了中国革命力量由弱到强,最终取得彻底胜利的代表性表述。
  52:停止内战,一致对外
  1935年8月1日,中国共产党发表《八一宣言》,号召各党派、各界同胞、各军队“停止内战,以便集中一切国力去为抗日救国的神圣事业而奋斗”。
  53:有钱的出钱,有力的出力
  中央在《八一宣言》中号召全民族团结抗战“有钱的出钱,有力的出力”。
  54:知识分子必须与工农群众相结合
  1939年,毛泽东发表了“五四运动”二十周年纪念文章,指出:“知识分子如果不和工农民众相结合,则将一事无成。”后被概括为“知识分子必须与工农群众相结合”的行动口号。
  55:独立自主,自力更生
  在抗日战争时期建立的国共合作抗日统一战线中,我党多次强调自力更生的原则,后来这句口号成为中国革命和建设的基本立足点。
  56:自己动手,丰衣足食
  1939年2月2日,。中央召开生产动员大会,毛泽东发出了“自己动手,丰衣足食,自力更生,艰苦奋斗,克服困难”的号召。
  57:为人民服务
  1939年9月8日,毛泽东在为追悼张思德同志而召集的会议上作了《为人民服务》的演讲,号召以张思德为榜样,坚持人民的利益高于一切,坚持为人民服务。
  58:坚持抗战到底———反对中途妥协
  1940年,在抗战两周年纪念对时局的宣言中,。中央提出“坚持抗战到底———反对中途妥协”等三大口号。
  59:没有共产党,就没有新中国
  1943年8月25日,《解放日报》发表题为《没有共产党,就没有中国》的社论,后来这个口号被视作对新民主主义革命真理性认识的高度概括,被用做歌曲的名称,唱遍全国,一直至今。
  60:下定决心,不怕牺牲,排除万难,去争取胜利
  1945年6月11日,毛泽东在“七大”所做的闭幕词中提出此口号。
  61:集中优势兵力,各个歼灭敌人
  1946年,全面内战开始,国民党气焰嚣张,人民解放军军事力量对比处于弱势。毛泽东同志就战争打法作了重要指示:集中优势兵力,各个歼灭敌人。
  62:一切反动派都是纸老虎
  1946年8月,毛泽东在会见美国记者安娜。路易斯。斯特朗时说:“一切反动派都是纸老虎。看起来,反动派的样子是可怕的,但是实际上并没有什么了不起的力量。”
  63:打倒蒋介石,解放全中国
  1947年,人民解放军实现了由战略防御到战略进攻的伟大转折,10月10日,发表了《中国人民解放军宣言》,响亮地提出了“打倒蒋介石,解放全中国”的战略口号。
  64:将革命进行到底
  1949年三大战役结束后,毛泽东在为新华社所写的新年献词中发出了“将革命进行到底”的伟大号召。
  三、新中国1949-2004
  65:中国人民站起来了
  1949年9月21日,在政治协商会议第一届全体会议上,毛泽东发表了《中国人民站起来了》的开幕词,从此,这句话成为表达中华民族获得新生的自豪自信的话语。
  66:中国人民大团结万岁
  这是毛泽东1949年9月30日为中国人民政治协商会议起草的宣言标题。此口号在解放初期成为流行的口号之一。后来演变成“全国各民族人民大团结万岁!”
  67:抗美援朝、保家卫国
  1950年朝鲜战争爆发,党中央提出了这条口号,组织中国人民志愿军开赴朝鲜战场,与朝鲜人民军并肩作战。
  68:发展体育运动、增强人民体质
  1952年6月10日,毛泽东同志写下这句题词,为新中国体育事业指明了方向。
  69:总路线是照耀我们各项工作的灯塔
  1953年12月,毛泽东在审定和修改中宣部关于学习、宣传过渡时期总路线的提纲时写道,“这条总路线是照耀我们各项工作的灯塔”,从此这句话风行一时。
  70:向科学进军
  1956年1月,在全国知识分子问题会议上。毛泽东、周恩来等领导人提出了此口号,提出了分步骤、分阶段缩小与世界发达国家先进科学技术水平的差距的思路。
  71:百花齐放、百家争鸣
  1957年2月,由毛泽东在最高国务会议第十一次会议上正式提出。
  72:向雷锋同志学习
  1962年8月15日雷锋因公殉职。1963年初,他的优秀事迹被公开报道。3月5日,《人民日报》发表了毛泽东的题词“向雷锋同志学习”,从此影响几代人。
  73:工业学大庆
  1963年底大庆油田开发成功。1964年2月5日,。中央发出了“工业学大庆”的号召。
  74:有条件要上,没有条件创造条件也要上
  1963年,“铁人”王进喜跳下泥浆池搅拌水泥的形象成为那个时代的光辉经典,他的这句口号也传遍全国。
  75:农业学大寨
  1964年2月10日,《人民日报》刊登了报道,介绍大寨发展农业的先进事迹,后在毛泽东主席“农业学大寨”的号召下,全国形成了“农业学大寨”的高潮。
  76:不管白猫黑猫,会捉老鼠就是好猫
  1962年7月2日,在。中央书记处召开的农业问题工作会议上,邓小平引述这句话来说明,选取恢复农业的方法,需要实事求是,不要千篇一律。此后广为流传。
  77:尊重知识,尊重人才
  1977年,邓小平指出:一定要在党内造成一种空气:尊重知识,尊重人才。从此这句话成为对新时期党的知识分子政策表述的代表性口号。
  78:实践是检验真理的唯一标准
  1978年5月11日《光明日报》发表文章《实践是检验真理的唯一标准》,理论上根本否定了“两个凡是”。在全党全国引起了强烈反响,一场关于真理标准问题的大讨论迅速展开。
  79:解放思想,实事求是,团结一致向前看
  1978年12月13日,邓小平在中央工作会议闭幕会上发表了以此句话为标题的讲话,把广大干部、群众从个人崇拜和教条主义中解脱出来,推动了改革开放和现代化建设。
  80:时间就是金钱、效率就是生命
  1980年,在改革开放口号的号召下,深圳蛇口工业区在建设过程中明确提出这句口号,并沿用至今。
  81:改革开放
  1980年8月18日,邓小平发表《党和国家领导制度的改革》的讲话。1979年7月,党中央、国务院设立四个经济特区。经过多年的实践“改革开放是强国之路”成为人们的共识。
  82:保证国家的、留足集体的、剩下都是自己的
  上世纪80年代初,中央在农业改革中提出此口号,使农民获得生产和分配的自主权,把农民的责、权、利紧密结合起来,受到农民的普遍欢迎。
  83:面向现代化,面向世界,面向未来
  这句话是1983年10月1日,邓小平为北京景山学校的题词,它为新时期我国教育体制的改革和发展指明了正确的方向。
  84:时间就是金钱、效率就是生命
  1980年,深圳蛇口工业区在建设过程中提出这句口号。
  85:只生一个好
  1980年,我国正式开始倡导计划生育国策,“只生一个好”成为指导性口号。
  86:五讲四美三热爱
  1981年2月25日,全国总工会等9个单位在《关于开展文明礼貌活动的倡议》中提出开展“五讲四美”活动。即讲文明、讲礼貌、讲卫生、讲秩序、讲道德;心灵美、语言美、行为美、环境美。后加入热爱祖国、热爱社会主义、热爱中国共产党。
  87:学习张海迪,做有理想、有道德、有文化、有纪律的共产主义新人
  1983年3月7日,团中央号召青年学习张海迪身残志不残,艰苦奋斗的精神。邓小平挥毫题词:“学习张海迪,做有理想、有道德、有文化、守纪律的共产主义新人!”
  88:让一部分人先富来
  邓小平1986年8月在天津视察过程中提出:“我的一贯主张是,让一部分人、一部分地区先富起来,大原则是共同富裕。”
  89:贫穷不是社会主义
  1987年4月26日,邓小平在接见外宾时指出:“贫穷不是社会主义。我们坚持社会主义,要建设对资本主义具有优越性的社会主义,首先必须摆脱贫穷。”
  90:两手抓,两手都要硬
  上个世纪80年代,邓小平敏锐地发现改革开放过程中出现的偏差,他在不同场合反复强调:要一手抓物质文明,一手抓精神文明,做到两手抓、两手都要硬。
  91:坚持四项基本原则,反对资产阶级自由化
  八十年代中期,自由化趋势有所抬头。1986年12月30日,邓小平指出,要旗帜鲜明地坚持四项基本原则,反对资产阶级自由化。
  92:稳定压倒一切
  1989年2月26日,邓小平同志面对复杂的国际形势,明确指出:“没有稳定的环境,什么都搞不成,已经取得的成果也会失掉。”1990年12月24日,他强调:“我不止一次讲过,稳定压倒一切。”
  93:发展才是硬道理
  1992年1月29日,南行途中的邓小平视察时指出:“我们的国家一定要发展,不发展就会受人欺负,发展才是硬道理。”
  94:科学技术是第一生产力
  1992年春,邓小平在视察南方的谈话中说:“经济发展得快一点,必须依靠科技和教育。我说科学技术是第一生产力。”
  95:与国际接轨
  上世纪90年代后期,中国人的资讯、观念,以及生活方式都与国际潮流形成迅速互动,“与国际接轨”成为最流行的口号。
  96:人民币不贬值
  1997年7月,亚洲金融危机开始爆发,我国遭遇出口下降和货币贬值的巨大压力。中国政府提出这项庄严承诺,为全球金融市场的稳定做出巨大贡献。
  97:誓与大堤共存亡
  1998年,我国发生特大洪涝灾害,这句话成为全国人民万众一心,确保大江大河大湖干堤和重要城市及交通干线安全的响亮口号和自觉行动。
  98:三个代表
  “只要我们党始终成为中国先进社会生产力的发展要求、中国先进文化的前进方向、中国最广大人民的根本利益的忠实代表,我们党就能永远立于不败之地。”它是中国共产党的立党之本、执政之基、力量之源。
  99:新北京、新奥运
  2000年2月1日,北京奥申委正式确定申办口号“新北京,新奥运”。2001年7月13日,北京赢得第28界奥运会主办权。
  100:万众一心、众志成城、抗击非典

ASP对文件进行处理及判断文件地址是否有效

对文件进行处理
这个部分是介绍怎样进行文件处理的:拷贝,移动以及删除文件;以及怎样检测一个文件是否存在和接收一个文件的有关属性。
 
拷贝、移动以及删除文件
有不止一种方法来对文件进行拷贝、移动以及删除工作。你可以利用FileSystemObject对象的方法或者File对象的方法,其中FileSystemObject对象的方法更具有些变通性,因为你会不局限于一个单独的文件上。
 
下面是FileSystemObject对象对文件操作的一些方法:
■CopyFile source, destination,[Overwrite]。这个方法将文件进行复制,你可以使用 source参数统配符来在一个时刻进行多个文件的复制。OverWrite参数将在目的文件已经存在的情况下进行覆盖操作。
■MoveFile source, destination.这个方法对文件进行移动操作,同样你可以使用统配 符来移动多个文件,不过如果目的文件已经存在,则会报错而不允许覆盖。
■DeleteFile FileSpecifier。这个方法删除指定文件,同样还是可以利用统配符来进 行多文件的删除。如果没有符合统配符的文件,将会报错。
 
在你使用这些方法之前,首先当然还是创建一个FileSystemObject对象的事例。下面就是一个完整的使用示例:
 
<% ‘创建一个FileSystemObject的事例 Set MyFileObject=Server.CreateObject(“Scripting.FileSystemObject”) ‘创建一个要进行操作的文件 Set MyFile=MyFileObject.CreateTextFile(“c:\test.txt”) MyFile.WriteLine(“Hello”) MyFile.Close ‘复制文件操作 MyFileObject.CopyFile “c:\test.txt” “c:\test2.txt” ‘移动文件操作 MyFileObject.MoveFile “c:\test.txt” “c:\test3.txt” ‘删除这些文件 MyFileObject.DeleteFile “c:\test.txt” MyFileObject.DeleteFile “c:\test3.txt” %>
 
除了使用FileSystemObject对象的方法来进行这种操作以外,你还可以使用FILE对象。下面是File对象相关操作的同等方法:
■Copy newcopy,[Overwrite]。这种方法给当前文件创建一个拷贝,当可选的 OverWrite参数为TRUE时,如果存在同名的目的文件,则进行覆盖。
■Move newcopy.这个方法用来移动当前文件,同时当前文件跟随到新的名称。
■Delete。删除当前文件。
 
在你使用这些方法之前,你必须创建File对象的一个事例,这样的事例创建是在FileSystemObject对象中使用GetFile()方法来完成的,下面这个脚本就是利用File对象进行各种操作的一个示例:
 
<% ‘创建一个FileSystemObject对象的事例 Set MyFileObject=Server.CreateObject(“Scripting.FileSystemObject”) ‘创建一个要进行操作的文件 Set MyFile=MyFileObject.CreateTextFile(“c:\test.txt”) MyFile.WriteLine(“Hello”) MyFile.Close ‘创建一个File对象的事例 Set afile=MyFileObject.GetFile(“c:\test.txt”) ‘复制文件 Afile.copy “c:\test2.txt” ‘移动文件 Afile.Move “c:\test3.txt” ‘删除文件 afile.Delete %>
 
检测文件是否存在
如果需要了解一个特定的文件是否存在,你需要FileSystemObject对象的FileExists()方法,只需要传递其物理地址就可以从返回值是True和False来判断其是否存在,下面就是这样一个例子:
 

文件是否存在示例

<% MySelf=Request.ServerVariables(“PATH_TRANSLATED”) ‘创建一个FileSystemObject对象事例 Set MyFileObject=Server.CreateObject(“Scripting.FileSystemObject”) IF MyFileObject.FileExists(“MySelf”) Response.write(“存在这个文件”) Else Response.write(“不存在这个文件”) END IF %>


 
这个脚本就是检查是否存在一个指定的文件,在本例中,显然是存在的,因为MySelf就是当前这个文件(这里面使用了ServerVariables变量PATH_TRANSLATED来获取当前文件的物理地址),当前这个文件无论如何肯定是存在的,因此返回值肯定是TRUE,那么显示为“存在这个文件”。
 
接受文件属性
当处理文件时,有些属性是需要了解的,下面是File对象的属性列表:
■Attributes.这个属性类似于Dos命令的Attrib,显示当前文件的系统属性。例如Read-Only,Hidden,System等等
■DateCreated.这个属性返回文件创建的时间和日期。
■DateLastAccessed.这个属性返回该文件上一次被使用的日期和时间
■DateLastModified.这个属性返回该文件上一次被修改的日期和时间
■Drive. 这个属性返回值为该文件所在的驱动器
■Name.这个属性返回该文件文件名
■ParentFolder.这个属性返回值为该文件所处的文件夹
■Path.返回该文件的全路径
■Size.返回该文件的字节数
■Type.返回该文件类型,例如Text文本,Asp文件,或者网络资源(HTML)
 
在使用这些属性之前,依然首先需要创建一个File对象的事例。下一个例子就是显示c:\test.txt的各项属性。
 

迈至科网络ASP教程之文件属性示例

<% ‘创建一个FileSystemObject对象的事例 Set MyFileObject=Server.CreateObject(“Scripting.FileSystemObject”) ‘创建一个File对象的事例 Set Myfile=MyFileObject.GetFile(“c:\test.txt”) %>

名称:<%=Myfile.Name %>

路径:<%=Myfile.Path %>

驱动器:<%=Myfile.Drive %>

大小:<%=Myfile.size %>

类型:<%=Myfile.type %>

属性:<%=Myfile.Attributes %>

创建日期:<%=Myfile.DateCreated %>

上次进入日期:<%=Myfile.LastAccessed %>

上次修改日期:<%=Myfile.LassModified %>


 
那么显示结果如图19.2所示。
图19.2 文件属性
 
 
 
 
 
Attributes属性需要解释,它的返回值是对应于下表的数字:
Attribute

Normal
0Read-Only
1
Hidden
2
System
4
Volume
8
Directory
16
Archive
32
Alias
64
Compressed
128
那么,由于这里面属性为Archive和Hidden,所以结合起来就是2(Hidden)+32(Archieve)=34,从数学上可以理解,每一个整数对应这样的2的幂次的累加和肯定是唯一的,这些属性还可以进行设置,例如,使c:\test.txt变成具有Archieve,Read-Only两种属性 ,那么用下面这个脚本
 
<% ‘创建一个FileSystemObject对象的事例 Set MyFileObject=Server.CreateObject(“Scripting.FileSystemObject”) ‘创建一个File对象的事例 Set Myfile=MyFileObject.GetFile(“c:\test.txt”) ‘进行属性设置 MyFile.attributes=31 %>
 
_____________________________________________________________
<% Response.Write("

“)
On Error Resume Next
Dim thisurl,thistext
thisurl=Request(“thisurl”) ‘定义文件地址(非Html格式文档)!
if thisurl=”” then
Response.Write(“请先输入文件地址!“)
Response.End
End if
Function objxmlhttp(xmlurl)
On Error Resume Next
Set objxml = CreateObject(“Microsoft.XMLHTTP”)
objxml.Open “get”,xmlurl,false
objxml.setrequestheader “content-type”,”application/x-www-form-urlencoded”
objxml.send
objxmlhttp = objxml.responsebody
if Err then
Err.Clear
Response.Write(“建立连接失败,文件不存在或网络有问题!;错误原因:”&Err.Description&”!“)
Response.End
End if
End Function
Function bytes2BSTR(vIn)
strReturn = “”
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then strReturn = strReturn & Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn,i+1,1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) i = i + 1 End If Next bytes2BSTR = strReturn End Function thisurl2=Split(thisurl,",") For Each ii In thisurl2 thistext=bytes2BSTR(objxmlhttp(ii)) if InStr(thistext,"“)<>0 then
Response.Write(““& ii &” ×
“)
Else
Response.Write(““& ii &”
“)
End if
Next
if Err then
Err.Clear
Response.Write(“碰到意外!;错误原因:”&Err.Description&”!“)
Response.End
End if
%>

SQL学习笔记

SQL学习笔记(十)
创建视图和索引
※视图常常被称为虚表。在视图被创建以后,你可以对视图采用如下命令:select,insert,
update,delete。
※索引是与磁盘上数据的存储方式不同的另外一种组织数据的方法。
◎使用视图
※视图并不占用数据库或表的物理空间。
※创建视图的语法如下:
CREATE VIEW [(col1,col2…)]
AS SELECT FROM ;
※视图可以是多级的,也就是可以用视图来创建视图。但这会加大维护工作的复杂性。
1。列的重命名
注意:
当在视图中使用SQL的计算功能时,SQL会要求你给出一个虚字段的名字,这是可以理解,因为象
COUNT(*)或AVG(PAYMENT)是不能作为列名的。
2。SQL对视图的处理过程
※运行SELECT语句–>查找表–>未找到–>查找视图。
3。在SELECT语句中的使用约束
在视图的SELECT语句中:
※不能使用UNION操作。
※不能使用ORDER BY子句,但在视图中,使用GROUP BY子句可以有ORDER BY子句相同的功能。
4。在视图中修改数据
在视图创建以后,就可以用Insert,Update,Delete语句来更新,插入,删除视图中的数据。
5。在视图中修改数据的几个问题
※对于多表视图,不能使用DELETE语句。
※除非底层表的所有非空列都已经在视图中出现,否则,你不能使用Insert语句。有这个限制的原
因是SQL不知道该将什么数据插入到NOT NULL限制列中(没有在视图中出现的)。
※如果对一个归并的表格插入或更新记录,那么所有被更新的记录必须属于同一个物理表。
※如果你在创建视图时使用了DISTINCT语句,那么你就不能插入或更新这个视图中的记录。
※你不能更新视图中的虚拟列(它是用计算字段得到的)。
6。通用应用程序的视图
下面有几个视图需要完成的任务:
※提供了用户安全功能。
※可以进行单位换算。
※创建一个新的虚拟表格。
※简单的结构化复合查询。
–>视图与安全性
–>在单位换算中使用视图
–>在视图中使用简单的结构化复合查询
7。删除视图的语句
DROP VIEW view_name;
注意:该命令会使所有与DROP掉的视图相关联的视图不能正常运行。一些数据库系统甚至会将所有
与DROP掉的视图相关联的视图也删除掉。
◎使用索引
在SQL中使用索引有以下几个原因:
※在使用UNIQUE关键字时强制性地保证数据的完整性。
※可以容易地使用索引字段或其他字段进行排序。
※提高查询的执行速度。
1。什么是索引
创建索引的语法:
CREATE INDEX index_name
ON table_name(col1[,col2…]);
注意:在不同的数据库系统中,创建索引的语法差别很大。
删除索引的语法:
DROP INDEX index_name;
备注:当表被删除时,所有与表相关的索引也将被删除。
2。使用索引的技巧
※对于小表来说,使用索引对于性能不会有任何提高。
※当你的索引中有极多不同的数据和空值时,索引会使性能有极大的提高。
※当查询返回的数据很少时,索引可以优化你的查询(比较好的情况是少于全部数据的25%)。如
果要返回的数据很多时,索引会加大系统开销。
※索引会提高数据的返回速度,但是它使数据的更新速度变慢。如果要进行大量的更新操作,请先
删除索引,在执行完更新操作后,再恢复索引。
※索引会占用你的数据库空间,在设计数据库的可用空间时要考虑到。
※如果对字段的索引已经对两个表进行了归并操作,这一技术可以极大地提高归并的速度。
※大多数数据库系统不允许对视图创建索引。
※不要对经常需要更新或修改的字段创建索引,更新索引的开销会降低你所期望获得的性能。
※不要将索引和表存储在同一个驱动器上,分开存储会去掉访问的冲突,从而使结果返回的更快。
3。对更多的字段进行索引
这也叫复合索引。
4。在创建索引时使用UNIQUE关键字
复合索引通常使用UNIQUE关键字来防止有相同数据的多个记录多次出现。
在创建索引时,可以使用DESC关键字。
5。索引与归并
在归并查询中,对表中唯一属性的字段或用以归并操作的字段创建索引,可以大大比高归并的效率

6。群集(簇)的使用
当使用群集索引时,数据的表中的物理排列方式将会被修改。使用群集索引通常比传统的不使用群
集的索引速度要快。
许多数据库系统(如Sybase的SQL Server)只允许一个表有一个群集索引。
用于创建群集索引的字段常常是主关键字。
※用Sybase的Transact-SQL创建群集索引的例子:
CREATE UNIQUE CLUSTERED INDEX id_index ON book(id);
※在Oracle中,群集具有与众不同的概念。
群集是SQL的第三方特性。
—第十天完—
创建和操作表
※数据定义语句
CREATE DATABASE,DROP DATABASE,CREATE TABLE,ALTER TABLE,DROP TABLE
※数据处理语句
SELECT,INSERT,UPDATE,DELETE
◎CREATE DATABASE语句
CREATE DATABASE database_name;
注意:
※少数不常用的数据库管理系统不斥之数据库创建命令。
※create database命令在不同的解释器中语法的差别时很大的。
1。设计数据库
影响数据库设计的几个因素:
※安全问题
※磁盘的可用空间
※数据检索及响应的速度
※数据更新的速度
※多表归并返回数据的速度
※RDBMS对临时表的支持
在你进行代码和数据库结构设计时,将你的数据结构与你当时的意图进行详细的记录是非常重要的
,在数据库设计行业中,它被称为数据字典。
2。建立数据字典
数据字典是数据库设计人员非常重要的文档资料,它有一下功能:
※数据库的设计意图,谁将会使用它。
※数据库的自身资料。
※任何数据库安装或反安装的SQL源代码记录,包括导入导出数据库的文档资料记录。
※对每一个表的详细描述,以及它的最终目的是什么。
※每一个表的内部结构的资料。
※对于每一个过程的源代码和触发机制。
※说明数据库是否有唯一值及非空值的约束,并说明这些约束是关系型数据库管理系统强加的,还
是数据库编制人员设定的,以及约束在源代码中的作用范围。
注:大多数关系型数据库管理系统中都提供了生成数据字典的工具包,或有说明来告诉你如何安装

3。建立关键字段
主关键字:保证表中的每一条记录都是唯一的。
外关键字:在本关系中不唯一标示记录,但在其他关系中可用作对匹配字段连接的一种关键字。
◎CREATE TABLE语句
语法:
CREATE TABLE table_name
(field1 datatype [NOT NULL]
,field2 datatype [NOT NULL]…);
1。表名
在Personal Oracle中,表名:
※不能超过30个字符长。
※不区分大小写。
※开头第一个字符必须为字母,其余字符还可以有下划线,#,$,@。
※同一工程中,表名不能重复。
※表名不能是Oracle保留字。
2。空值属性
空字符串”在向数据库中插入数据时,可以代表NULL值。
3。唯一属性
4。表的存储与尺寸的调整
大多数的关系型数据库管理系统都设定了表的默认到小和存储单位。
5。用一个已经存在的表建表
该方法多用于对一个表进行临时修改的时候。
在Oracle中,它的语法如下:
CREATE TABLE new_table(field1,field2,field3)
AS (SELECT field4,field5,field6 FROM old_table );
◎ALTER TABLE语句
ALTER TABLE table_name

备注:在Oracle与MS SQL Server中还支持以下语句:
ALTER TABLE table_name DROP COLUMN col_name;
※在MS SQL Server的Transac-SQL中不支持以下操作:
ALTER TABLE table_name MODIFY col_name datatype;
※将一列由NULL改为NOT NULL时,该列中必须没有存储NULL值。
◎DROP TABLE语句
DROP TABLE table_name;
备注:在Oracle的SQL*PLUS中,CREATE TABLE,ALTER TABLE与DROP TABLE语句是自动提交的。
提示:在执行DROP TABLE操作时,最好在表名前指明它所属的数据库,以免删错表,造成不可挽回
的损失。
◎DROP DATABASE语句
语法:
DROP DATABASE database_name;
注意:单文件的数据库系统如Access,不支持这个命令。Access的数据库包含在一个单一的文件中
。要删除数据库,只要简单地从系统中删除这个文件就可以了。
—第九天完—
操作数据
※insert,update,delete
※基于pc机的数据库系统:Access,dBase,Foxpro
◎插入语句
两种语法:
1。INSERT INTO table_name (col1,col2…) VALUES(value1,value2…);
注意事项:
※要插入的数值与它所对应的字段必须具有相同的数据类型。
※数据的长度必须小于字段允许的长度。
※如果INSERT语句中没有给出列名,将按照数据库中列名的排列顺序。
注意:数字和空值(NULL)不需要引号,而字符串和日期型需要引号。
2。INSERT INTO table_name (col1.col2…)
SELECT col1,col2… FROM table_name WHERE search_condition;
它将一个SELECT语句的结果插入到一个表中。多用于将一个表中数据负值到另一个表中。
注意事项:
※SELECT语句不能从被插入的数据表中选择行。
※INSERT INTO的列数必须与SELECT返回的列数相等。
※INSERT INTO与SELECT语句中,对应的列的数据类型必须相同。
※几乎每种商用数据库逗有它们自己的数据存储格式。
◎UPDATE语句
改变已存在记录的内容。
语法:
UPDATE table_name SET col1=value1[,col2=value2…]
WHERE search_condition;
※如果省略了WHERE子句,所有的记录都将被更新。
※一些数据库管理系统对标准的UPDATE语句进行了扩展。
注意:当在更新语句中使用计算值时,可能会产生两个问题:截断和溢出。
◎DELETE语句
语法:
DELETE FROM table_name WHERE condition;
注意事项:
※与INSERT和UPDATE语句一样,删除一个表中的记录可能会导致与其他表的引用完整性问题。
◎从外部数据源中导入和导出数据
※SQL作为一种语言,并不提供从外部数据源中导入和导出数据的方法。
※几乎所有的数据库系统都可以导入或导出ASCII码的文本文件,尽管SQL没有这个功能。
带导入导出工具的数据库系统:
Microsoft Access,Microsoft SQL Server,Sybase SQL Server,(Personal)Oracle 7。
1。Microsoft Access
以文本文件的形式导入和导出数据。
2。Microsoft & Sybase SQL Server
SQL Server提供的数据导入导出工具叫BCP。
3。Personal Oracle 7
SQL*Loader工具。它使用一个控制文件(扩展名为.CTL),它告诉SQL*Loader数据文件的位置。
—第八天完—
子查询-内嵌的SQL语句
※在子查询中可以使用EXIST,ANY,ALL关键字。
※当对子查询使用“=”,“<”,“>”时,子查询返回的记录不能多于一条。
提示:Oracle中同时支持“!=”,“<>”两种不等于操作符。但它不支持“!>”,“!<”操作符。 ◎在子查询中使用汇总函数 ※SUM,AVG,COUNT,MIN和MAX等汇总函数返回单一的数值。 ◎子查询的嵌套 ※子查询中也可以使用GROUP BY和HAVING语句。 ※对返回多行结果的查询可以使用IN关键字。 ◎相关子查询 ※相关子查询与归并(联合)查许非常相似。可以使用GROUP BY和HAVING子句。 注意: 当在相关子查询中使用GROUP BY和HAVING子句时,在HAVING子句中的列必须在SELECT或GROUP BY子 句中存在,否则你将收到一条非法引用的错误消息。因为这时与子查询相对应的是每一组,而不是 每一行。对于组,你无法进行比较操作。 ◎EXIST,ANY,ALL的使用 ※如果子查询返回的内容不为空,EXIST返回true,否则返回false。 ※可以用EXIST来检查查询是否有输出。 ※使用ANY或SOME和“=”,“>”,“<”结合起来用于子查询时,子查询可以返回多个值。 ※“=ANY”的意义和“IN”相同。 ※SOME关键字的含义及用法和ANY相同。 ※使用ALL关键字时,子查询中的所有结果均满足条件时,才为true。 ---第七天完--- 表的联合(归并) ◎交叉联合(笛卡儿叉积,笛卡儿联合) 例如:SELECT * FROM table1,table2; 关于表的别名,在下例中 SELECT a.name,a.age,b.title FROM author a,book b; a是表author的别名,b是表book的别名。 ◎等值联合 举例:SELECT a.name,a.age,b.title FROM author a,book b WHERE a.isdn=b.isdn; ◎不等值联合 与等值联合相反。 ◎外部联合与内部联合 ◎表的自我联合(自我归并) 语法:SELECT * FROM table1,table1; 主要用于检查一个表中不能有重复的值的字段(如主键)是否存入了重复的值。 例如: SELECT e.id,e.name,e2.id,d2.name FROM employee e,employee e2 WHERE e.id=e2.id and e.name<>e2.name;
注意:对于一次能联合的表的个数,有的解释器做出了限制,如25个,有的没有限制。
联合的表越多,系统的响应就越慢。
—第六天完—
SQL中的子句
SELECT语句的通用语法表达式:
SELECT [DISTINCT|ALL]
{*|{[schema.]{table|view|snapshot}.*|expr} [[AS] c_alias]
[,{[schema.]{table|view|snapshot}.*|expr} [[AS] c_alias]…}
FROM [schema.]{table|view|snapshot} [@dblink] [t_alias]
{,[schema.]{table|view|snapshot} [@dblink] [t_alias]…}
[WHERE condition]
[GROUP BY expr[,expr]…
[HAVING condition]]
[{UNION|UNION ALL|INTERSECT|MINUS} SELECT command]
[ORDER BY {expr|position} [ASC|DESC]
[,{expr|position} [ASC|DESC]]…];
注意:可以用“AS”来指定查询的列的别名,可以省略。但是在ACCESS中不可以省略。
◎STARTING WITH子句
附加于WHERE子句上,作用与LIKE (exp%)相似。
注意:Oracle不支持该子句。
在没有ORDER BY子句时,查询的结果默认按照记录被插入的先后顺序排序。
在ORDER BY子句中可以使用汇总函数。
用于排序的字段并不一定要出现在SELECT子句中。
◎HAVING子句
该子句中可以使用汇总函数,可以使用SELECT子句中为出现的列进行汇总。允许使用逻辑表达式。
注意:在ACCESS中,HAVING子句中使用了非汇总函数将导致错误。
操作符IN也可以使用在HAVING子句中。
◎GROUP BY子句
注意:在任何情况下进行分组,SELECT语句中出现的字段只能时在GROUP BY中出现过的才可以。
—第五天完—
函数-对数据的进一步处理
汇总函数,日期与时间函数,,数学函数,字符函数,转换函数,其他函数。
◎汇总函数
※COUNT
返回满足WHERE条件子句中记录的个数。
※SUM
返回某一列的所有的数值的和。只能处理数字。
※AVG
返回某一列的平均值。只能处理数字。
※MAX
返回某一列中的最大值。可以处理字符与数字。
※MIN
返回某一列中的最小值。可以处理字符与汉字。
※VARIANCE
求方差。不是ANS 92标准中定义的,但它却是统计领域中至关重要的数值。只能处理数字。
※STDDEV
返回某一列数值的标准差。只能处理数字。
注意:汇总函数不能用在WHERE子句中。
◎日期和时间函数
※ADD_MONTHS
将给定的日期增加给定的月数。对Oracle中的Date类型有效。
语法:
SELECT ADD_MONTHS(enddata,3) FROM project;
※LARST_DAY
返回指定月份的最后一天。
※MONTHS_BETWEEN
计算给定的两个日期之间有多少的月。结果可以为正,也可能为负,可能为整数,也可能为小数。
※NEW_TIME
如果你想把时间调整到你所在的时区,可以使用NEW_TIME。
时区及其简写
大西洋标准时间:AST或ADT
阿拉斯加_夏威夷时间:HST或HDT
英国夏令时:BST或BDT
美国山区时间:MST或MDT
美国中央时区:CST或CDT
新大陆标准时间:NST
美国东部时间:EST或EDT
太平洋标准时间:PST或PDT
格林威治标准时间:GMT
Yukou标准时间:YST或YDT
※NEXT_DAY
返回与指定日期在同一星期或之后一星期内的,你所要求的星期天数的确切日期。
※SYSDATE
返回系统的日期和时间。
◎数学函数
※ABS
返回给定数字的绝对值。
※CEIL和FLOOR
CEIL返回与给定参数相等或比给定参数大的最小整数。
FLOOR返回与给定参数相等或比给定参数小的最大整数。
※COS,COSH,SIN,SINH,TAN,TANH
COS,SIN,TAN可以返回给定参数的三角函数值,默认的参数认定为弧度值。
※EXP
返回以给定参数为指数,以e为底的幂值。
※LN和LOG
LN返回给定参数的自然对数。
LOG需要两个参数,第一个为指数,第二个为底数。
※MOD
取模。
※POWER
返回某一个数对另一个数的幂。
需要两个参数,第一个为底数,第二个为指数。
※SIGN
若参数为负数,返回-1,若参数为整数,返回1,若参数为0,返回0。
可用于WHERE子句。
※SQRT
对参数开平方。参数必须为正。
◎字符函数
※CHR
返回与给定数值参数相等的字符。(类似与将数字转换为字符。)
※CONCAT
与“||”相同,连接两个字符串。
※INITCAP
将参数的第一个字母变为大写,其余变为小写。
※LOWER
将参数全部转为小写字母。
※UPPER
将参数全部转为大写字母。
※LPAD和RPAD
LPAD表示左扩充,RPAD表示右扩充。
最少需要两个参数,最多三个参数。
第一个参数是要处理的字符串。第二个是要扩充到的宽度。第三个是表示加宽部分用什么字符来填
补。默认为空格。
※LTRIM和RTRIM
最少一个参数,最多两个参数。
第一个参数是要处理的字符串。第二个参数是要去除的字符。一般为空格(默认也是空格)。
※REPLACE
要三个参数。
第一个参数是要替换的字符串。第二个是要搜索的内容。第三个是要替换成的字符串。
注意:如果第三个参数省略或为NULL,则只执行搜索,但不替换任何内容。
※SUBSTR
三个参数。将目标字符串的一部分输出。
第一个参数是目标字符串。第二个是起始位置。第三个是要输出的字符串的长度。
注意:如果第一个参数为-n,则从字符串尾部向头部数n,然后开始截取。如果没有第三个参数,
默认到尾部。
※TRANSLATE
三个参数。依次为源字符串,目标字符串,目的字符串。
在目标字符串与源字符串中都出现的单个字符,会被替换成对应的目的字符串的字符。
注意:这个函数是大小写敏感的。
※INSTR
寻找一个字符串中满足特定内容的字符串的位置。
需要四个参数。依次为目标字符串,要匹配的内容,指定开始搜索的起点,指出第几个满足条件的
将被返回。
默认第三个参数和第四个为1,如果第三个参数为负,那么将会从后向前搜索。
※LENGTH
返回指定字符串的长度。
◎转换函数
※TO_CHAR
该函数的最初功能是将一个数字转换为字符型。
不同的解释器可能会用它来转换其他的数据类型,例如日期转换为字符型,或者右更多的参数。
※TO_NUMBER
将一个字符型数字转换成数值型。
◎其他函数
※GREATEST与LEAST
返回几个表达式中最大与最小的。参数可以多个。可以处理字符串和数值型。
※USER
无参数,不带括号。
返回当前使用数据库的用户的用户名。
—第四天完—
表达式,条件语句与运算
◎表达式
包含各种类型的数据,如数字,字符以及逻辑运算符等。
例如:
SELECT name,address,phone FROM addressbook;
上例中,name,address,phone,addressbook都是表达式。
◎条件语句
是逻辑表达式的一个实例。
例如:
WHERE name=’LINCOLN’;
其中,name是变量,=是逻辑运算符,’LINCOLN’是常量。
◎运算
可分为六组,数值型,比较型,字符型,逻辑型,备注型以及混合型。
1。数值型运算
加,减,乘,除,取模
※对于小数数据不能应用取模运算。
※可以用括号来改变运算顺序。
※SQL允许你创建一个虚拟列或对已有的列进行组合和修改后产生的派生列。
※可以在查询时设定列显示的名称,称为别名。一些SQL解释器中使用如下语法:别名
=列名
※在Oracle的SQL*PLUS中,不支持%(取模)运算符,而用MOD函数。
2。比较运算
※将两个表达式进行比较,并返回以下三个数值中的一个:True,False,Unknow。
※在数据库领域内,NULL的意义就是,在一个字段中没有数据。这与为0或为空不是同
一个概念。
※如果对为NULL的字段进行比较,结果就返回Unknow。可以用IS NULL操作来测试NULL
的存在。
※PC机采用ASCII编码,大写字母的编码小于小写字母的编码。
※通配符:%,_(下划线)
※连接符(||):连接两个字符串。
注意:有的SQL解释器支持用加号(+)连接字符串,有的不支持,如Oracle中。
3。逻辑运算
※用于SQL的WHERE子句中,将两个或更多的条件结合起来。
※AND,OR,NOT
※要检测一个字段不为NULL,可以使用操作符IS NOT NULL。
4。集合运算(SET)
※SQL时基于集合理论的。
※UNION与UNION ALL
UNION将返回两个查询结果的并集,并去处其中重复的部分。
UNION ALL作用同UNION,但它保留重复的部分。
语法:
SELECT * FROM table1
UNION
SELECT * FROM table2
※INTERSECT
返回两个查询中共有的行。
※MINUS
返回存在于第一个查询结果中,但不在第二个查询结果中的行。
※IN和BETWEEN(从属运算)
例如:
SELECT * FROM friends WHERE state IN (‘CA’,’CO’,’LA’);
注:IN语句中也可以对数字。
SELECT * FROM friends WHERE wholesale BETWEEN 0.25 AND 0.75;
注:BETWEEN操作包含边界值。
—第三天完—
查询-SELECT语句的使用
◎SQL语句是不区分大小写的,但是数据库中的数据却是大小写敏感的。
◎空格:并不影响SQL语句,例如
SELECT name, startterm, endterm FROM presidents WHERE name=’LINCOLN’;
上面这个SQL语句是完全可以执行的。
◎分号:
当SQL语句中出现分号时,就意味着本条语句已经结束。
◎在Oracle中,*表示有事件产生。
◎SELECT子句中的*表示要返回数据库表中的所有列,并按照库中的原有顺序排列。
◎(在Oracle中)查询结果的显示,数字型采用右对齐,字符型采用左对齐。
◎DISTINCT:紧跟在SELECT之后,表示查找不重复的记录。
◎ALL:与DISTINCT相反,表示查找所有记录。(它是默认值,通常可以省略。)
—第二天完—
前言:这个笔记是我在学习sql的时候记下的。我看的书是《SQL 21天自学通》的电子
版,之前我向朋友们推荐过这本书,这里再次向大家推荐一下,这本书对于学习SQL来
说,确实是一个很不错的选择。
这本书一共分成21天,相当于21章,我的笔记也就分成21部分,每章对应一部分。
笔记中除了从书中摘录的重点内容以外,还有少量的我个人在实践中的结论,一并写出
来,希望对各位朋友有帮助。
虽然这本书的名字是《SQL 21天自学通》,其实整个学习过程不用21天。我现在看了3
天,已经看到第九天的内容了。
下面是笔记的内容:
SQL简介
◎全称为Structured Query Language(结构化查询语言),简称sequel。
◎主要用于RDBMS(关系型数据库管理系统)
过程型SQL—PL/SQL(Oracle)
—Transact-SQL(MS SQL Server)
关系型数据库的诞生—《A Relational Model of Data for Large Shared Data
Banks》论文
◎目前流行的SQL开发工具(注:该书写于2001年,所以这里“目前”也是指2001年)
Microsoft Access
Personal Oracle7 SQL*PLUS
Microsoft Query(Microsoft公司的Visual C++和Visual Basic开发工具包中所附带的
一个非常有用的查询工具。它可以应用于基于ODBC标准下的数据库,该查询工具在将查
询语句提交给数据库之前会将其保留在驱动器上。)
◎开放型数据库连接(ODBC)
Application
(Call ODBC functions)
|
Driver Manager
(Loads ODBC driver)
|
ODBC Driver
(Processes ODBC calls,submits SQL request,returns results)
|
Data Source
(Underlying DBMS)
ODBC不专门针对任何一种数据库系统。
◎SQL在编辑中的应用
结果是以数据包的形式返回的。
◎支持SQL的关系型数据库系统
MS Access,Oracle,Sybase,Informix,MS SQL Server
—第一天完—
《SQL 21天自学通》,电子版的在itpub的MS SQL Server区的精华帖子里有下载,不过此贴较长,怕要多翻一会了。
这本书是学习SQL的入门好书,我现在正在学SQL,看的就是这本书,现在看到了168页,全书共568页。
这本书讲的很细致,全面。对于SQL的每个关键字都做了详细的说明,并给出了实际应用的例子。
尤其重要的是它对于一些常用数据库系统在SQL上的扩展,以及与SQL标准的差别做了说明,很有实用价值。
个人觉得此书很适合初学者,特向各位初学SQL的朋友推荐。

ASP中使用ServerVariables集合详解

当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合。这个集合包含了两种值的结合体,一种是随同页面请求从客户端发送到服务器的HTTP报头中的值,另外一种是由服务器在接收到请求时本身所提供的值。
  “自引用”页面
  在ServerVariables集合中返回的值包含Web服务器的详细信息和当前页面的路径信息。在任何地方创建一个页面都可使用这些信息。例如创建一个“自引用”页面,此页面能够再次调用自身完成另一项任务,我们可以用以下代码:
<FORM ACTION=”<% = Request.ServerVariables(“PATH_INFO”) %>” METHOD=”POST”>
  同样的效果可以用HTTP的“SCRIPT_NAME”值获得:
<FORM ACTION=”<% = Request.ServerVariables(“SCRIPT_NAME”) %>” METHOD=”POST”>
  使用<A>元素打开一个不同页,可以使用:

<%
strFullPath = Request.ServerVariables(“PATH_INFO”)
‘Strip off the file name
strPathOnly = Left(strFullPath, InStrRev(strFullPath, “/”))
strNextPage = strPathOnly & “pages/next_page.asp”
%>

<A HREF=”<% = strNextPage %>”>Next Page</A>

  即使原始页面的名称或位置发生变化,这些实例都能正常工作,因为使用了当前页面的路径信息(当然,第二个例子在分离的目标页的名称发生变化时运行会失败)。
  换句话说,如果为搜索引擎的子会话自动建立URL,可以收集ServerVariable的一些值:
strFullURL = http:// & Request.ServerVariables(“LOCAL_ADDR”) _
& “:” & Request.ServerVariables(“SERVER_PORT”) _
& Request.ServerVariables(“PATH_INFO”)
  这将创建一个完整的URL包括端口号(这种情况下,不是标准值80)。例如,结果可能是:
http://194.74.60.254:1768/thispath/thispage.asp
  检测浏览器的版本
  ServerVariables集合中,另外一个有用的值是用户浏览器的用户代理字符串。在“Detecting the Browser Type”页面(browsertype.asp),使用ServerVariables集合中的“HTTP_USER_AGENT”值来获得用户代理字符串,一些脚本用来解析该信息并寻找生产厂家名称和浏览器版本。
<%
strUA = Request.ServerVariables(“HTTP_USER_AGENT”)
Response.Write “The User Agent string is <B>” & strUA & “</B>

If InStr(strUA, “MSIE”) Then
Response.Write “To upgrade your browser go to “_
& “<A HREF=” & Chr(34) & http://www.microsoft.com/ie/”_
& Chr(34) & “>http://www.microsoft.com/ie/<A>

intVersion = Cint(Mid(strUA, InStr(strUA, “MSIE”) + 5, 1))
If intVersion >=4 Then
Response.Write “You can use Microsoft Dynamic HTML”
End If
Else
If InStr(strUA, “Mozilla”) Then
If InStr(strUA, “compatible;”) = 0 Then
Response.Write “Your browser is probably Navigator. You can “_
& “download the latest version of Navigator from “_
& “<A HREF=” & Chr(34) & http://home.netscape.com/”_
& “download/”& Chr(34) & “>http://home.netscape.com”_
& “/download/</A>

intVersion = Cint(Mid(strUA, InStr(strUA, “/”) +1, 1))
If intVersion >= 4 Then
Response.Write “You can probably use Netscape Dynamic HTML”
End If
Else
strVersion = Mid(strUA, InStr(strUA, “compatible;”) + 12)
strProduct = Left(strVersion, InStr(strVersion, “ “))
Response.Write “Your browser is Navigator-compatible. You can”_
& “search for the manufacturer using a search engine, such as”_
& “<A HREF=” & Chr(34) _
& “http://www.altavista.digital.com/cgi-bin/query?q=”_
& strProduct _
& Chr(34) & “>http://www.altavista.com/</A>

End If
End If
End If
%>
  对IE 5.0和Navigator 4.61的搜索结果分别不同,对于其他厂家的浏览器,可以得到一个链接在Alta Vista Web站点自动开始搜索厂家的名称。
  注意,Netscape在用户代理字符串中不提供厂家的名称,因而无法绝对保证一个浏览器一定是Navigator。
  检测浏览器的语言
  ServerVariables集合中另外一个有用的值是“HTTP_ACCEPT_LANGUAGE”,它包含了一个当浏览器安装时指定的,或硬编码进用户的地区版本的语言代码。语言代码的例子有en-us(英国、美国)、de-at(德国、澳大利亚)和es-pe(西班牙、秘鲁)。
  语言代码可以是一般的且省略方言标识:例如,在我们的站点Wrox者,大批浏览者都是将en(英语)作为语言代码。
  因此,可以检测语言代码并自动装载一个合适的特定地区或指定语言版本的页面。
StrLocale = Lcase(Left(Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”),2))
Select Case strLocale
 Case “en”: Response.Redirect “http://uk_site.co.uk/”
 Case “de”: Response.Redirect “http://de_site.co.de/”
 Case “fr”: Response.Redirect “http://fr_site.co.fr/”
 ‘… etc
 Case Else: Response.Redirect “http://us_sitel.com/”
End Select
  或者根据特定的方言,重定向页面:
strLocale = Lcase(Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”))
Select Case strLocale
 Case “en-gb”: Response.Redirect “http://uk_site.co.uk/”
 Case “en-us”: Response.Redirect “http://us_site.com/”
 Case “es-pe”: Response.Redirect “http://es_site2.co.pe/”
 ‘…
 Case Else: Response.Redirect “http://us_site1.com/”
End Select
  其他有用的ServerVariables集合的值
  可以访问和使用ServerVariables集合中的任何一成员,控制ASP页面响应一个请求的方式。可以检查一个浏览者访问站点时使用的是否是缺省端口80或还是另一个。在这个例子里,寻找通过端口443的访问——这个端口提供的是安全套接字层(Secure Socket Layer,SSI)访问(和其他的协议),且将它们重定向到一个相应的页面。
If Request.ServerVariables(“SERVER_PORT”) = “443”) Then
Response.Redirect “/securesite/default.asp” ‘Secure user
Else
Response.Redirect “/normalsite/default.asp” ‘Non-secure user
End If
  假如要求浏览者注册且由服务器验证(而不是允许他们在Web服务器的IUSER帐号下匿名访问,这个问题将在后面章节中详细讨论),可以查询用户名称,来判定正在与我们打交道的用户是谁,是否装载页面给该用户。例如,下面的这个代码将只向名为Administrator的用户显示管理链接。

<A HREF=”dispcnfg.asp”>Change Display Configuration</A>
<A HREF=”dispcolr.asp”>Change Display Colors</A>
<A HREF=”keyboard.asp”>Change Keyboard Configuration</A>
<%
If Request.ServerVariables(“AUTH_USER”) _
= Ucase(Request.ServerVariables(“SERVER_NAME”)) & “\Administrator” Then
%>
<A HREF=”allusers.asp”>Administer All Users</A>
<A HREF=”usrlogon.asp”>Administer Logon Information</A>
<%
End If
%>

  注意ASP不填写ServerVariables集合直到你访问其中的一个成员。首次访问该集合的一个成员将使IIS得到它的全部,应只在需要时才使用ServerVariables集合。
  其他Request和Response技巧
  现在,来看一下几个使用Request和Response对象的有用技巧,包括:
  · 连接、缓冲和页面重定向的管理。
  · HTTP报头、缓存与“到期”页面的操作。
  · 利用客户证书。
  · 创建定制的日志文件消息。
  1. 连接、缓冲和页面重定向的管理
  ASP的一个很有用的特点就是使用户能够从一个ASP网页转向到另一个网页(ASP或HTML),或另一个源文件(例如一个ZIP文件或文本文件)。这对用户来说是透明的,实际上是浏览器做这个工作。当使用Response.Redirect方法来载入一个新的网页时,实际上是发送回一个特殊的HTTP报头到客户。此报头为:
  HTTP/1.1 302 Object Moved
  Location /newpath/newpage.asp
  浏览器读到此报头信息,并按Location值的指示载入页面。这在功能上与在Web页中使用客户端HTML<META>标记相同,例如:
<META HTTP-EQUIV=”REFRESH” CONTENT=”0;URL=/newpath/newpage.asp”>
  这带来的一个问题是,服务器与用户之间的代理服务器可能会提供它自己的包含与新页面的链接的消息,而不是直接载入新页面。而且浏览器根据厂商和版本可能做同样的工作。这就去除了假定的透明,而且对用户来说一直收到的是错误信息,则对你的站点的访问变得比较麻烦。
  在发送诸如文本或HTML等任何页面内容后,我们就不能再使用Redirect方法。然而,一个看起来能够限制“代理服务器影响”的方法是,先确定没有输出(包括HTTP报头)被发送到客户。在ASP 2.0中,必须打开缓冲,然后使用Clear方法来清空缓冲区:
Response.Buffer = True
‘Some condition to select the appropriate page:
If Request.ServerVariables(“SERVER_PORT”) = 1856 Then
 StrNewPage = “/newpath/this_page.asp”
Else
 StrNewPage = “/newpath/the_other_page.asp”
End If
Response.Clear
Response.Redirect strNewPage
  在ASP 3.0中,缓冲缺省为打开,所以第一行可被忽略,但它是无害的,而且能确保我们的网页即使在ASP 2.0环境中也仍然能工作。
与其使用这种类型的HTTP报头重定向,不如使用ASP 3.0的一个新特性,它允许我们通过Server对象的Transfer方法转换为执行另一个网页,我们将在以后进一步研究这个问题。
  1) ASP页面缓冲区
  正如已看到过的,IIS 5.0中ASP 3.0页面缓冲是缺省打开的,在早期的版本中是缺省关闭的。微软告诉我们缓冲在IIS 5.0中提供了更有效的网页传送,这就是缓冲缺省状态被改变的原因。在大部分情况下,这对我们没有影响。但是,假如有一个非常大的网页,或一个用ASP或别的服务器端代码和组件花费一定时间创建的网页,当其各部分完成时,我们能够分批刷新它们到客户:

… Code to create first part of the page

Response.Flush

… Code to create next part of page

Response.Flush

  有时可能希望在页面结束之前的某些点上停止代码的执行,可以通过调用End方法去刷新所有的当前内容到客户并中止任何进一步的处理过程。

… Code to create first part of the page
If strUserName = “” Then Response.Clear

… Code to create a new version of this part of the page

  这里有两上演示缓冲和重定向的实例网页,可以从“Response Object”主页面(sow_response.asp)下载它们。第一个Response.Redirect例子网页命名为redirect.asp,它在缓冲的页面中定入一些内容,清除缓冲区,并重定向到另一个网页:
For intLoop = 1 To 1000000
 Response.Write “.”
Next
Response.Clear
Response.Redirect “show_redirect.asp”
Response.End
  目标页show_response.asp,做同样的工作,但重定向则是回到“Response Object”主页。因为这些网页都在缓冲区内,而且所有的输出在重定向之前必须清除,故在浏览器中没有可见的输出。然而,可以通过观察浏览器的状态看到发生的每一次重定向。如下图所示:
<img src=http://go2.163.com/~davelu/asp14.jpg>
  在“Response Object”主页中,点击“Response.Flush”链接将打开第二个示例网页usebuffer.asp,它简单地遍历一个字符串的每一个字符,以一定的延迟将它们刷新到客户,这虽是Web服务器和ASP极低效率的使用方式,但它演示了缓冲的工作方式。
<img src=http://go2.163.com/~davelu/asp15.jpg>
  下面是所要求的最小化的ASP代码,注意我们分别把每个字符刷新到浏览器,因为不这样的话它将被存放在缓冲区中,直至网页完成:
strText = “This text has been flushed to the browser using “ & _
“<B>Response.Flush</B>

For intChar =1 To Len(strText)
 For intWrite = 1 To 100000
 Next
 Response.Write Mid(strText,intChar,1)
 Response.Flush
Next
  2) Response.IsClientConnected属性
  IsClientConnected属性在ASP 2.0中已经存在了,但却有些不可靠。在其返回一个准确的结果之前必须发送一些输出到客户。这一问题在ASP 3.0中已被解决。现在这一属性可被自由使用。
  IsClientConnected是观察用户是否仍连到服务器和正在载入ASP创建的网页的有用方式。如果用户断开连接或停止下载,我们就不用再浪费服务器的资源创建网页,因为缓冲区内容将被IIS丢弃。所以,对那些需要大量时间计算或资源使用较多的网页来说,值得在每一阶段都检查浏览器是否已离线:

… Code to create first part of the page

If Response.IsClientConnected Then
Response.Flush
Else
Response.End
End If

… Code to create next part of page…

ACCESS中使用SQL语句

在上面的SELECT语句的WHERE中,我们使用了操作符号 > 来比较大小以及使用LIKE进行匹配。在WHERE语句中,可以使用的操作符有以下几类:
  1、比较操作符
  包含 =、<>、>、<、>=、<= 等若干类   2、逻辑操作符   包含以下若干类:   LIKE、IN、BETWEEN、UNIQUE、IS NULL、EXISTS、ALL和ANY   LIKE 操作符通过使用通配符将一个值同其它值比较,在VB的SQL查询中,可以使用的通配符是 * 和 ? 其中 * 代表任意的若干个字符,而 ? 代表一个字符,例如上面语句中的LIKE '*Beginner* 代表查找所有包含字符串Beginner的值。不过要注意的是使用 * 和 ? 作为通配符是VB的专利。真正的SQL语言的通配符是 % 和 _ ,其中 % 代表任意多个字符,_ 代表一个字符例如VB中的Data Environment使用的就是 % 和 _ 作为查询通配符。另外Microsoft Jet Engine对于LIKE操作符还提供了其它一些的过滤选项,具体的内容可参见MSDN索引中的 Like Operator 条目。   IN 操作符用于比较某一个值是否等于几个值中的一个值,例如下面的语句:   "SELECT [Title],[Year Published] FROM [Titles] WHERE [Year Published] IN (1990,1991,1995)" 将从表Titles中选择所有在1990、1991、1995年出版的书籍纪录。   BETWEEN 操作符勇于在两个值之间搜索,例如 WHERE [Year Published] BETWEEN 1989 AND 1991 指定出版日期必须在1989年和1991年之间。   对于逻辑操作符,可以结合NOT操作符实现改变查询条件的方向。例如 WHERE [Year Published] NOT IN (1990,1991,1995)   3、连接符   WHERE中的连接符包括 AND 和 OR ,使用AND时,所有查询都必须是True时,条件才成立,而使用OR时,只要连接的一个查询为True,条件就成立。象上面的范例中,只有书名中包含 "Beginner" 同时又是在1990年以后出版的纪录才会被查询到。   在使用比较操作符时要注意,在VB操作数据库引擎时对于查找的字符串,要使用单引号或者双引号将字符串括起来,例如 WHERE [Name]='LiGang'。 而对于日期类型的数据,要使用#号将日期括起来,例如 WHERE [BirthDay] > #19980-10-01#
  而在使用通配符和LIKE操作符时,需要使用引号而不是#号,例如 WHERE [BirthDay] LIKE “1990-01-*”。引号告诉数据库引擎将日期当字符串处理,而#号告诉数据库引擎将日期当数字处理。对于WHERE语句所要使用的逻辑操作符,在下面的文章中还要提到。
  范例二:如何在数据表中加入统计等功能
  SQL当中提供了一定数量的统计以及计算功能,其中统计函数主要有如下一些:
COUNT 计算字段中的纪录数
SUM 计算字段中的所有值的和
MAX 获得字段中所有值中的最大值
MIN 获得字段中所有值中的最小值
AVG 计算字段中所有值的平均值
  计算符有 +、-、*、/ 4种。这些计算、统计函数的使用方法如下:
  functionname fieldname AS outfieldname
  其中functionname定义函数名、fieldname 定义要操作的字段、outfieldname定义保存输出结果字段名称,下面是范例程序,首先建立一个数据库,将数据库保存为 c:\db4.mdb。然后在数据库中加入一个名称为db1的表,表的结构如下:
字段名称 产品编号 成本 出厂价 销售数量
A00020 ¥89.95 ¥95.00 900
A00056 ¥54.00 ¥89.00 2400
A00021 ¥2,300.00 ¥2,896.00 600
A10916 ¥120.00 ¥209.00 1200
A00987 ¥907.00 ¥1,090.00 1000
其中产品编号为文本类型、成本和出厂价字段为货币类型、销售数量为长整形数据。保存表,在VB工程中加入DAO定义库,在Form1中加入一个ListBox控件,在Form1代码窗口中加入以下代码:
Private Sub Form_Load()
  Dim rsTemp As Recordset
  Dim dbTemp As Database
  Dim astr As String
  Set dbTemp = DBEngine(0).OpenDatabase(“c:\db4.mdb”, dbOpenSnapshot)
  astr = “SELECT db1.产品编号, ((db1.出厂价 – db1.成本)/db1.成本) AS dRate, ” & _
  ”(db1.出厂价 * db1.销售数量)AS eTotal FROM db1 ORDER BY db1.产品编号”
  Set rsTemp = dbTemp.OpenRecordset(astr)
  If rsTemp.RecordCount > 0 Then
    rsTemp.MoveFirst
    Do Until rsTemp.EOF
      List1.AddItem rsTemp![产品编号] & ” ” & rsTemp![dRate] & _
        ” ” & rsTemp![eTotal]
      rsTemp.MoveNext
    Loop
  End If
End Sub
  在上面的程序段中,通过计算字符操作表中以有字段,然后再将结果输出到输出字段中保存。
二、JOIN…ON…语句
  JOIN…ON… 语句是SQL查询中用于连接多个表的语句,该语句的语法为:
  FROM table1 [INNER|OUTER|LEFT|RIGHT] JOIN table2 ON table1.field1 compopr table2.field2
  其中tabel1指定要查询的表,tabel2指定连接到tabel1的表,field1, field2指定连接字段名称,
compopr指定关系比较符,它可以是大于、小于、等于、不等于等。
  范例三: 列出所有书籍以及它的作者
  在BIBLIO中,书籍的名称位于Titles表的Title字段中,而书籍的作者位于Authors表的Autoor字段中,而这两个表之间没有相关联的字段,我们这时需要联合数据库中的Title Author表,利用该表的Au_ID字段同Authors表中的Au_ID字段的关联以及ISBN字段同Titles表中的ISBN字段的关联,范例如下:
Private Sub Form_Load()
  Dim rsTemp As Recordset
  Dim dbTemp As Database
  Dim astr As String
  Set dbTemp = DBEngine(0).OpenDatabase(“e:\program files\microsoft visual studio\vb98\biblio.mdb”, dbOpenSnapshot)
  astr = “SELECT Authors.Author, Titles.Title FROM ” & _
  ”([Title Author] INNER JOIN Titles ON [Title Author].ISBN = Titles.ISBN)” & _
  ”INNER JOIN Authors ON [Title Author].Au_ID = Authors.Au_ID ” & _
  ”WHERE Titles.Title LIKE ‘*Beginner*'”
  Set rsTemp = dbTemp.OpenRecordset(astr)
  If rsTemp.RecordCount > 0 Then
    rsTemp.MoveFirst
    Do Until rsTemp.EOF
      List1.AddItem rsTemp![Title] & ” ” & rsTemp![Author]
      rsTemp.MoveNext
    Loop
  End If
End Sub
  在上面的范例中,我们使用两个INNER JION联合将Authors表中的Au_ID字段 和Titles表中的ISBN字段连接到Title Author表中,然后在Title Author表中查找Title字段中包含字符串“Beginner”的纪录并将Title字段和Author字段输出。
以下SQL语句在ACCESS XP的查询中测试通过
  建表:
  
Create Table Tab1 (
   ID Counter,
   Name string,
   Age integer,
   [Date] DateTime);
 
 技巧:
   自增字段用 Counter 声明.
   字段名为关键字的字段用方括号[]括起来,数字作为字段名也可行.
 
  建立索引:
   下面的语句在Tab1的Date列上建立可重复索引
  
Create Index iDate ON Tab1 ([Date]);
  
完成后ACCESS中字段Date索引属性显示为 – 有(有重复).
   下面的语句在Tab1的Name列上建立不可重复索引
 
  Create Unique Index iName ON Tab1 (Name);
   完成后ACCESS中字段Name索引属性显示为 – 有(无重复).
   下面的语句删除刚才建立的两个索引
  
Drop Index iDate ON Tab1;
   Drop Index iName ON Tab1;   
  
ACCESS与SQLSERVER中的UPDATE语句对比:
   SQLSERVER中更新多表的UPDATE语句:
  
UPDATE Tab1
   SET a.Name = b.Name
   FROM Tab1 a,Tab2 b
   WHERE a.ID = b.ID;
  
同样功能的SQL语句在ACCESS中应该是
   UPDATE Tab1 a,Tab2 b
   SET a.Name = b.Name
   WHERE a.ID = b.ID;
  
即:ACCESS中的UPDATE语句没有FROM子句,所有引用的表都列在UPDATE关键字后.
  上例中如果Tab2可以不是一个表,而是一个查询,例:
 
  UPDATE Tab1 a,(Select ID,Name From Tab2) b
   SET a.Name = b.Name
   WHERE a.ID = b.ID;  
  
访问多个不同的ACCESS数据库-在SQL中使用In子句:
 
  Select a.*,b.* From Tab1 a,Tab2 b In ‘db2.mdb’ Where a.ID=b.ID;
  
上面的SQL语句查询出当前数据库中Tab1和db2.mdb(当前文件夹中)中Tab2以ID为关联的所有记录.
  缺点-外部数据库不能带密码.   
  在ACCESS中访问其它ODBC数据源
  下例在ACCESS中查询SQLSERVER中的数据
 
  SELECT * FROM Tab1 IN [ODBC]
   [ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;]
  
外部数据源连接属性的完整参数是:
  
[ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=pass(word);]
  
其中的DRIVER=driver可以在注册表中的
  
HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INI
  
中找到  
  ACCESS支持子查询  
  ACCESS支持外连接,但不包括完整外部联接,如支持
   LEFT JOIN 或 RIGHT JOIN
  但不支持
  FULL OUTER JOIN 或 FULL JOIN  
  ACCESS中的日期查询
  注意:ACCESS中的日期时间分隔符是#而不是引号
 
  Select * From Tab1 Where [Date]>#2002-1-1#;
  
在DELPHI中我这样用
 
  SQL.Add(Format(
   ‘Select * From Tab1 Where [Date]>#%s#;’,
   [DateToStr(Date)]));  
  
ACCESS中的字符串可以用双引号分隔,但SQLSERVER不认,所以为了迁移方便和兼容,
  建议用单引号作为字符串分隔符.

ASP脚本变量、函数、过程和条件语句

在上一期中作者向诸位简要介绍了 ASP 脚本语言之一 VBScript 的一些基本常识,本期将继续给大家讲解 VBScript 的脚本编写方法,并通过展示 VBScript 在ASP 程序编写过程中的一系列实例使大家对 VBScript 有更进一层的理解。
   大家在学习了脚本语言 VBScript 的变量、常量和过程的基本概念后,本期将继续向各位介绍 VBScript 的函数和语法。
   函数和过程一样都是命名了的代码块,但它们却有很大的区别,过程完成程序任务,函数则返回值。我们可以这样理解,过程象一个完整的句子,而函数则象一个单词。举个例子,当你想获取某个数的平方根,你只要将该数传给 VBScript 的Sqr() 函数,此函数会立即返回该数的平方根。如:
   A=sqr(9)
  则 A=3。熟练掌握脚本语言的函数将给你编写 ASP 程序带来极大的方便,就以上一期结尾处作者布置给大家的课后练习来说,如果你对脚本语言的函数掌握不够全面,那么解决如此之小的一个问题将很有可能花费你相当大的精力。现在让我们来回顾一下这道课后练习。
   “作者正在用 ASP 制作一套基于 WEB 的 BBS 系统,希望能在其中添加一项特殊功能,即当任何用户登陆该 BBS 后都能够查阅近七天来所有新发布的信息。”
   如果你不熟悉 VBScrip,就不会知道 VBScrip 本身提供了一个用来取得日期之间的差或和的函数 DateSerial,它的语法如下:
   DateSerial(year, month, day)
 如果你要指定一个日期,例如:1998 年11 月10 日,那么 DateSerial 函数中每个参数的取值范围都应该是可接受的,即日的取值应在 1和31 之间,月的取值应在 1和12 之间。但是,也可以使用表示某日之前或之后的年、月、日数目的数值表达式为每个参数指定相对日期。以下样例中使用了数值表达式代替绝对日期。在这里,DateSerial 函数返回 1998 年11 月10 日之前二十年 (1990-20) 零两个月 (11-2) 又一天 (10-1) 的日期:即 1978 年9月9日。程序如下:
   Datep=DateSerial(1998-20, 11-2,10-1)
对于 year 参数,若取值范围是从 0到99,则被解释为 1900 到1999 年。对于此范围之外的 year 参数,则使用四位数字表示年份(例如 1800 年)。当任何一个参数的取值出可接受的范围时,则会适当地进位到下一个较大的时间单位。例如,如果指定了 35 天,则这个天数将被解释成一个月加上多出来的日数,多出来的日数取决于其年份和月份。但是如果参数值超出 -32,768 到32,767 的范围,或者由三个参数指定(无论是直接还是通过表达式指定)的日期超出了可以接受的日期范围,就会发生错误。
   当我们了解并掌握了函数 DateSerial 的使用方法后,再来看看作者布置的这道题目,一切就迎刃而解了。下面我将程序中的此部分代码公布如下:    itemp=DateSerial(Year(date), month(date), day(date)-7)
   itemp=DateValue(itemp)
   sql=”Select * from message Where message.creatime Between #”&date&”# And #”&itemp&”# ”
   在这里我们又接触到了一组函数 Year,month,day,它们是用来得到一个日期的年、月、日。date 是常数,表示今天日期,而函数 DateValue 则是将字符串变量转化为日期格式的变量。在本段程序的第三行,我们第一次接触到了标准的 SQL 查询语句,这句语句是什么意思呢?
   “Select”是标准的 SQL 数据库查询命令,通过 SELECT 语句我们可以在数据库中检索数据,并将查询结果提供给用户,此处的“*”表示查询该名为“message”的数据库中的所有记录,而“where”的作用是设定一个查询条件,是为了将数据库中符合条件的记录取出来,“message.creatime”是一个储存了数据库中记录创建日期的变量。将整句语句连起来理解就是:查询名为 message 的数据库中的所有记录,并将其中创建日期在今天和今天以前七日以内的所有记录存储在变量 sql 中。可能由于大家第一次接触 SQL 语句,一时间无法完全理解它的作用,不过不用担心在今后的章节中作者将专门用一期给大家介绍 SQL 的使用方法。
   通过上面的学习,大家应该已经能够理解函数在程序中的作用,当然我们不必去死背函数,但要做到熟练运用只有一条捷径 — 多实践。接下来让我们来看看 VBScript 的基本语法。
   了解编程语言的朋友一定知道在程序中控制程序流程的语句主要可以分为条件语句和循环语句,在 VBScript 中可使用以下条件语句:    If…Then…Else 语句
   Select Case 语句
   If…Then…Else 语句用于计算条件是否为 True 或 False,并且根据计算结果指定要运行的语句。通常,条件是使用比较运算符对值或变量进行比较的表达式,If…Then…Else 语句可以按照需要进行嵌套。
   让我们来创建两个范例文件:if1.asp 和 if2.asp
 
  将以下语句剪贴到记事簿中,并保存为 if1.asp( 注意:请将程序中“<”后的空格去掉 )   < html>
  < head>
  < TITLE>if1.asp< /TITLE>
  < /head>< body bgcolor="#FFFFFF">
  < form action="if2.asp" method=get>
  Your First Name< INPUT NAME="FirstName" MaxLength=20>< p>
  Your Last Name< INPUT NAME="LastName" MaxLength=20>< p>
  < INPUT TYPE=submit>< INPUT TYPE=reset>
  < /form>
  < /body>
  < /html>
  将以下语句剪贴到记事簿中,并保存为 if2.asp   < html>
  < head>
  < TITLE>ifrespond.asp< /TITLE>
  < /head>
  < % fname=request.querystring("Firstname")   lname=request.querystring("Lastname")   If fname="George" and lname="Washington" then %>
  Hi.You must be the first president!
  < % else %>
  Hi!Nice to Meet You
  < %end if %>
  < /body>
  < /html>
   asp1.asp 产生一个文本输入框,要求用户输入姓、名,如下图:
   asp2.asp 则是用 IF 语句判断用户输入的姓名是否为“George Washington”,并做出相应的反馈。在此我们遇到了一个 ASP 的内建对象 request,通过使用 request 对象可以访问任何用 HTTP 请求传递的信息,包括从 HTML 表格中用 POST 方法或 GET 方法传递的参数、cookie 和用户认证。而 QueryString 集合检索 HTTP 查询字符串中变量的值,HTTP 查询字符串由问号 (?) 后的值指定。如:
   http://localhost/if2.asp?Firstname=George&Lastname=Washington
   生成值为 “Firstname=George&Lastname=Washington” 的变量名字符串。关于 ASP 对象作者将在今后的几篇里重点讲述。
   If…Then…Else 语句的一种变形允许您从多个条件中选择,即添加 ElseIf 子句以扩充 If…Then…Else 语句的功能,使您可以控制基于多种可能的程序流程。
   我们将 asp2.asp 的程序部分扩充如下:  < %   fname=lcase(request.querystring("Firstname"))   lname=lcase(request.querystring("Lastname"))   If fname="george" and lname="washington" then %>
  Hi.You must be the first president!< p>
  < % elseIf fname="ronald" and lname="reagan" then %>
  Hi.You must be the actor president!< p>
  < % elseIf fname="jimmy" and lname="carter" then %>
  Hi.You must be the peanut farmer president!< p>
  < % elseIf fname="naoko" or fname="charles" then %>
  Hi.Your name reminds me of someone,but I am not sure who!< p>
  < % else %>
  Hi!Nice to Meet You
  < % end if %>
   可以添加任意多个 ElseIf 子句以提供多种选择。但使用多个 ElseIf 子句经常会使程序变得很累赘。在多个条件中进行选择的更好方法是使用 Select Case 语句。
   Select Case 结构提供了 If…Then…ElseIf 结构的一个变通形式,可以从多个语句块中选择执行其中的一个。Select Case 语句提供的功能与 If…Then…Else 语句类似,但是可以使代码更加简练易读。Select Case 结构在其开始处使用一个只计算一次的简单测试表达式。表达式的结果将与结构中每个 Case 的值比较。如果匹配,则执行与该 Case 关联的语句块,我们同样可以用 Select Case 语句来写 asp2.asp 文件:
  < %   fname=lcase(request.querystring("Firstname"))   lname=lcase(request.querystring("Lastname"))   name=fname+lname   Select case name   case "georgewashington"   response.write "Hi.You must be the first president!< p>”
  case “ronaldreagan”
  response.write “Hi.You must be the actor president!< p>”
  case “jimmycarter”
  response.write “Hi.You must be the peanut farmer president!< p>”
  case “naokocharles”
  response.write “Hi.Your name reminds me of someone,but I am not sure who!< p>”
  case else
  response.write “Hi!Nice to Meet You”
  End Select %>
   请注意 Select Case 结构只计算开始处的一个表达式,并且只计算一次,而 If…Then…ElseIf 结构计算每个 ElseIf 语句的表达式,这些表达式可以各不相同。因此仅当每个 ElseIf 语句计算的表达式都相同时,才可以使用 Select Case 结构代替 If…Then…ElseIf 结构。Select Case 语句也是可以是嵌套的,每一层嵌套的 Select Case 语句必须有与之匹配的 End Select 语句。