<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
<channel>
<title>
<![CDATA[晓峰工作日志]]></title>
 <link>
http://jiangxixfwan.blogcn.com</link>
<description>
<![CDATA[想记什么就记什么，只要是不违法的事情。]]></description>
<managingEditor>
<![CDATA[jiangxixfwan]]></managingEditor>
<dc:creator>
<![CDATA[jiangxixfwan]]></dc:creator>
<blogcn_uid>
jiangxixfwan</blogcn_uid>
<blogcn_hits>
5681</blogcn_hits>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[SQL中的系统变量]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,19407448.shtml</link>
<description>
<![CDATA[<BR><BR>全局变量是系统预定义的，返回一些系统信息，全局变量以两个at(@)开头。下面是我统计了一些较为常用的变量。 <BR><BR>@@CONNECTIONS <BR>返回自上次启动以来连接或试图连接的次数。 <BR><BR>@@CURSOR_ROWS <BR>返回连接上最后打开的游标中当前存在的合格行的数量。 <BR><BR>@@DATEFIRST <BR>返回每周第一天的数字 <BR><BR>@@ERROR <BR>返回最后执行的SQL 语句的错误代码。 <BR><BR>@@FETCH_STATUS <BR>返回被 FETCH 语句执行的最后游标的状态，而不是任何当前被连接打开的游标的状态。 <BR><BR>@@IDENTITY <BR>返回最后插入的标识值 <BR><BR>@@LANGID <BR>返回当前所使用语言的本地语言标识符(ID)。 <BR><BR>@@LANGUAGE <BR>返回当前使用的语言名。 <BR><BR>@@LOCK_TIMEOUT <BR>返回当前会话的当前锁超时设置，单位为毫秒。 <BR><BR>@@PROCID <BR>返回当前过程的存储过程标识符 (ID) 。 <BR><BR>@@ROWCOUNT <BR>返回受上一语句影响的行数。 <BR><BR>@@SERVERNAME <BR>返回运行 的本地服务器名称。 <BR><BR>@@SPID <BR>返回当前用户进程的服务器进程标识符 (ID)。 <BR><BR>@@TRANCOUNT <BR>返回当前连接的活动事务数。 <BR><BR>@@VERSION <BR>返回当前安装的日期、版本和处理器类型。]]></description>
<pubDate>
2008-09-06 10:10:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,19407448.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,19407448.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[一个卖烧饼的故事]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,12418247.shtml</link>
<description>
<![CDATA[<DIV id=articleBarButton>&nbsp;</DIV>
<DIV id=articleContentArea>
<DIV id=tagsArea _extended="true"></DIV>
<DIV class=middleSize id=articleContent>
<DIV>&nbsp;<TT>有一个故事，来看看能不能解答你的疑问。<BR>假设一个市场，有两个人在卖烧饼，有且只有两个人，姑且称他们为烧饼甲、烧饼乙。<BR>假设他们的烧饼价格没有物价局监管。<BR>假设他们每个烧饼卖一元钱就可以保本（包括他们的劳动力价值）.<BR>假设他们的烧饼数量一样多。<BR>——经济模型都这样，假设需要很多。<BR>再假设他们生意很不好，一个买烧饼的人都没有。这样他们很无聊地站了半天。<BR>甲说好无聊。<BR>乙说好无聊。<BR>看故事的你们说：好无聊。<BR>这个时候的市场叫做很不活跃！<BR>为了让大家不无聊，甲对乙说：要不我们玩个游戏？乙赞成.<BR>于是，故事开始了。。。。。。<BR><BR>甲花一元钱买乙一个烧饼，乙也花一元钱买甲一个烧饼，现金交付。<BR>甲再花两元钱买乙一个烧饼，乙也花两元钱买甲一个烧饼，现金交付。<BR>甲再花三元钱买乙一个烧饼，乙也花三元钱买甲一个烧饼，现金交付。<BR>。。。。。。<BR>于是在整个市场的人看来（包括看故事的你）烧饼的价格飞涨，不一会儿就<BR>涨到了每个烧饼60元。但只要甲和乙手上的烧饼数一样，那么谁都没有赚<BR>钱，谁也没有亏钱，但是他们重估以后的资产“增值”了！甲乙拥有高出过<BR>去很多倍的“财富”，他们身价提高了很多，“市值”增加了很多。<BR>这个时候有路人丙，一个小时前路过的时候知道烧饼是一元一个，现在发现<BR>是60元一个，他很惊讶。<BR>一个小时以后，路人丙发现烧饼已经是100元一个，他更惊讶了。<BR>又一个小时以后，路人丙发现烧饼已经是120元一个了，他毫不犹豫地买了<BR>一个，因为他是个投资兼投机家，他确信烧饼价格还会涨，价格上还有上升<BR>空间，并且有人给出了超过200元的“目标价”（在股票市场，他叫股民，<BR>给出目标价的人叫研究员）。<BR>在烧饼甲、烧饼乙“赚钱”的示范效应下，甚至路人丙赚钱的示范效应下，<BR>接下来的买烧饼的路人越来越多，参与买卖的人也越来越多，烧饼价格节节<BR>攀升，所有的人都非常高兴，因为很奇怪：所有人都没有亏钱。。。。。。<BR>这个时候，你可以想见，甲和乙谁手上的烧饼少，即谁的资产少，谁就真正<BR>的赚钱了。参与购买的人，谁手上没烧饼了，谁就真正赚钱了！而且卖了的<BR>人都很后悔——因为烧饼价格还在飞快地涨。。。。。。<BR>那谁亏了钱呢？<BR>答案是：谁也没有亏钱，因为很多出高价购买烧饼的人手上持有大家公认的<BR>优质等值资产——烧饼！而烧饼显然比现金好！现金存银行能有多少一点利<BR>息啊？哪比得上价格飞涨的烧饼啊？甚至大家一致认为市场烧饼供不应求，<BR>可不可以买烧饼期货啊？于是出现了认购权证。。。。。。<BR>　&nbsp; 有人问了：买烧饼永远不会亏钱吗？看样子是的。但这个世界就那么奇<BR>怪，突然市场上来了一个叫李子的，李子曰：有亏钱的时候！那哪一天大家<BR>会亏钱呢？<BR>假设一：市场上来了个物价部门，他认为烧饼的定价应该是每个一元。（监<BR>管）<BR>假设二：市场出现了很多做烧饼的，而且价格就是每个一元。（同样题材）<BR>假设三：市场出现了很多可供玩这种游戏的商品。（发行）<BR>假设四：大家突然发现这不过是个烧饼！（价值发现）<BR>假设五：没有人再愿意玩互相买卖的游戏了！（真相大白）<BR>如果有一天，任何一个假设出现了，那么这一天，有烧饼的人就亏钱了！那<BR>谁赚了钱？就是最少占有资产——烧饼的人！<BR>这个卖烧饼的故事非常简单，人人都觉得高价买烧饼的人是傻瓜，但我们再<BR>回首看看我们所在的证券市场的人们吧。这个市场的有些所谓的资产重估、<BR>资产注入何尝不是这样？在ROE高企，资产有高溢价下的资产注入，和卖<BR>烧饼的原理其实一样，谁最少地占有资产，谁就是赚钱的人，谁就是获得高<BR>收益的人！<BR>所以作为一个投资人，要理性地看待资产重估和资产注入，忽悠别人不要忽<BR>悠自己，尤其不要忽悠自己的钱！<BR>在高ROE下的资产注入，尤其是券商借壳上市、增发购买大股东的资产、<BR>增发类的房地产等等资产注入，一定要把眼睛擦亮再擦亮，慎重再慎重！<BR>因为，你很可能成为一个持有高价烧饼的路人！<BR><BR></TT></DIV></DIV></DIV>]]></description>
<pubDate>
2007-12-07 08:26:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,12418247.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,12418247.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[留住剩菜营养大有学问]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,12275175.shtml</link>
<description>
<![CDATA[<H1>留住剩菜营养大有学问(图)</H1>
<DIV class=from_info>http://bj.sina.com.cn 2007年11月29日10:00&nbsp; <FONT color=#a20010>羊城地铁报</FONT></DIV><!--正文内容开始--><!-- google_ad_section_start -->
<DIV class=artibody id=artibody>
<P align=center><IMG style="MARGIN-BOTTOM: 5px" src="http://image2.sina.com.cn/bj/danone/art/2007-11-29/U2285P52T40D34049F1289DT20071129100054.jpg" border=1><BR><FONT class=title12>留住剩菜营养大有学问</FONT></P>
<P>　　现在，很多人在出去餐馆吃饭后，剩菜打包的习惯越来越流行，可是大家有没有想到，食品打包回去后如何更好的利用它的营养价值呢？</P>
<P>　<STRONG>　打包的学问</STRONG></P>
<P>　　1、打包的食物需凉透后再放入冰箱</P>
<P>　　这是因为热食物突然进入低温环境当中，食物中心容易发生质变，而且食物带入的热气会引起水蒸气的凝结，促使霉菌的生长，从而导致整个<SPAN class=yqlink> 
<FORM class=yqin action=http://www.iask.com/n method=post><INPUT type=hidden value=%B1%F9%CF%E4 name=k></FORM><A class=akey title=冰箱 onclick="activateYQinl(this);return false;" href="http://www.iask.com/n?k=%B1%F9%CF%E4" target=_blank><FONT color=#000099>冰箱</FONT></A></SPAN>内食物的霉变。</P>
<P>　　2、打包食物必须回锅</P>
<P>　　冰箱中存放的食物取出后必须回锅。这是因为冰箱的温度只能抑制细菌繁殖，不能彻底杀灭它们。如果您在食用前没有加热的话，食用之后就会造成不适，例如痢疾或者腹泻。</P>
<P>　　3、剩菜保存时间不宜过长</P>
<P>　　剩菜的存放时间以不隔餐为宜，早上剩的菜中午吃，中午剩的菜晚上吃，最好能在5~6个小时内吃掉它。因为在一般情况下，通过100摄氏度的高温加热，几分钟内是可以杀灭某些细菌<SPAN class=yqlink> 
<FORM class=yqin action=http://www.iask.com/n method=post><INPUT type=hidden value=%B2%A1%B6%BE name=k></FORM><A class=akey title=病毒 onclick="activateYQinl(this);return false;" href="http://www.iask.com/n?k=%B2%A1%B6%BE" target=_blank><FONT color=#000099>病毒</FONT></A></SPAN>和寄生虫的。但是，如果食物存放的时间过长，食物中的细菌就会释放出化学性毒素，对这些毒素加热就无能为力了。</P>
<P>　　4、素菜不宜打包</P>
<P>　　因为在素菜制作的过程当中，一般用盐比较少，做好的素菜在温度比较高的情况下放的时间一长，菜里面的细菌就会大量繁殖，硝酸盐在细菌的作用下会被还原成亚硝酸盐。亚硝酸盐在自然界极易与胺合成亚硝胺，亚硝胺是强致癌物。如果我们长期食用剩的蔬菜，对我们的健康是不利的，就像长期食用腌的<SPAN class=yqlink> 
<FORM class=yqin action=http://www.iask.com/n method=post><INPUT type=hidden value=%CF%CC%B2%CB name=k></FORM><A class=akey title=咸菜 onclick="activateYQinl(this);return false;" href="http://www.iask.com/n?k=%CF%CC%B2%CB" target=_blank><FONT color=#000099>咸菜</FONT></A></SPAN>之类的食品患胃癌的几率就比较高。</P>
<P>　　<STRONG>剩菜加热时需要注意的问题</STRONG></P>
<P>　　鱼类：加热四五分钟就好</P>
<P>　　鱼类加工的菜中的细菌很容易繁殖，上面的大肠杆菌在20摄氏度左右的温度里每8分钟就能够繁殖两倍，在五六个小时之内一个细菌就会变成一亿个。如此的数量足以让您的肠胃感到不舒服。</P>
<P>　　所以，打包的鱼类一定要加热四五分钟。但过长时间加热，鱼中所含的全价蛋白、鱼脂和丰富的维生素等有益于人体神经系统的营养素就会失去营养价值。</P>
<P>　　肉类：加热时请加点醋</P>
<P>　　肉类和动物类的食品打包回去后再次加热，最好是加上一些醋。因为这类食品都含有比较丰富的矿物质，这些矿物质加热后，都会随着水分一同溢出。那么，在加热的时候加上一些醋，这些物质遇上了醋酸就会合成为醋酸钙，不仅提高了它的营养，同时还有利于我们身体的吸收和利用。</P>
<P>　　海鲜类：加热时应加点佐料</P>
<P>　　贝类，海鲜类的食品在加热时最好另外加一些酒，葱，姜等佐料，这样不仅可以提鲜，而且还具有一定的杀菌作用，可以杀灭潜伏其中的副溶血性弧菌，防止引起肠胃的不适，特别是姜，在中医里具有杀菌和解毒(特别是鱼虾蟹之毒)的功效。</P>
<P>　　淀粉类：请在4小时内吃完</P>
<P>　　打包回来富含淀粉类的一些食品，最好在4小时内吃完，因为它们容易被葡萄球菌寄生。而这类细菌的毒素在高温加热之下也不会被分解，解决不了变质的问题。</P></DIV><!-- google_ad_section_end --><!--正文内容结束--><!--关于内容的操作开始--><!--发表评论开始-->]]></description>
<pubDate>
2007-11-30 11:52:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,12275175.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,12275175.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[習慣]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,11481916.shtml</link>
<description>
<![CDATA[<FONT color=#ffcc00>&nbsp;&nbsp;&nbsp; 1、当一个人生活枯燥的时候，　　　他忘了用心体会是一种习惯。<BR><BR>　　2、当一个人觉得人生乏味的时候，　他忘了培养幽默是一种习惯。<BR><BR>　　3、当一个人体力日差的时候，　　　他忘了运动建身是一种习惯。<BR><BR>　　4、当一个人工作疲惫的时候，　　　他忘了认真休息是一种习惯。<BR><BR>　　5、当一个人孤傲狂放的时候，　　　他忘了感恩惜福是一种习惯。<BR><BR>　　6、当一个人志得意满的时候，　　　他忘了谦冲为怀是一种习惯。<BR><BR>　　7、当一个人钱不够用的时候，　　　他忘了投资理财是一种习惯。<BR><BR>　　8、当一个人觉得工作低迷的时候，　他忘了激励自己是一种习惯。<BR><BR>　　9、当一个人怀疑自己的时候，　　　他忘了建立自信是一种习惯。</FONT>
<P><FONT color=#ffcc00>　　10、当一个人忽略家人的时候，　　　他忘了爱与关怀是一种习惯。<BR><BR>　　11、当一个人浑噩度日的时候，　　　他忘了阅读好书是一种习惯。<BR><BR>　　12、当一个人忙于工作的时候，　　　他忘了安排休闲是一种习惯。<BR><BR>　　13、当一个人目中无人的时候，　　　他忘了不断学习是一种习惯。<BR><BR>　　14、当一个人服务不佳的时候，　　　他忘了让顾客满意是一种习惯。<BR><BR>　　15、当一个人慌张失措的时候，　　　他忘了万全准备是一种习惯。<BR><BR>　　16、当一个人推诿责任的时候，　　　他忘了勇于承担是一种习惯。<BR><BR>　　17、当一个人肠枯思竭的时候，　　　他忘了转型思考是一种习惯。<BR><BR>　　18、当一个人沮丧失意的时候，　　　他忘了检讨改进是一种习惯。<BR><BR>　　19、当一个人畏惧调职的时候，　　　他忘了提升自己是一种习惯。<BR><BR>　　20、当一个人沟通障碍的时候，　　　他忘了真诚倾听是一种习惯。<BR><BR>　　21、当一个人业绩消退的时候，　　　他忘了积极行动是一种习惯。</FONT></P>]]></description>
<pubDate>
2007-10-26 08:31:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,11481916.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,11481916.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[说话的温度]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,10954172.shtml</link>
<description>
<![CDATA[<DIV><SPAN style="FONT-SIZE: 14pt">小心说话,而且要"说好话".话说出之前先思考一&nbsp;&nbsp; 下,把握好"温度",不要莽莽撞撞地脱口而出.</SPAN></DIV>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 急事,慢慢地说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 大事,清楚地说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 小事,幽默地说；</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 没有把握的事,谨慎地说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 没有发生的事,不要胡说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 做不到的事,别乱说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 伤害人的事,不能说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 讨厌的事,对事不对人地说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 开心的事,看出场合说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 伤心的事,不要见人就说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 别人的事,小心地说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 自己的事,听自己的心怎么说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 现在的事,做了再说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 未来的事,未来再说;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 如果,对我有不满意的地方,请一定要对我说!</SPAN></P>]]></description>
<pubDate>
2007-10-03 21:38:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,10954172.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,10954172.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[刘彦斌投资基金的五点建议]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,10439010.shtml</link>
<description>
<![CDATA[<DIV class=tim><STRONG>第一,要坚持长期投资<BR></STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp; 红利转投和定期定投都是很好的投资方法.<BR><STRONG><BR>第二,要进行分散投资<BR><BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;投资人应该购买三到五只基金,而且这些基金应该分别属于不同的基金管理公司.<BR><BR><STRONG>第三,要选择有品牌的基金管理公司,而不是选择基金经理<BR><BR></STRONG>&nbsp;基金管理公司应该有历史业绩可以考察;基金的业绩是<I>"</I>团队行为<I>"</I>的结果,而不是某个基金经理个人的行为结果.&nbsp;铁打的公司,流水的经理,不能因为换了经理就换基金吧.<BR><BR><STRONG>第四,慎重投资单只规模过大的基金<BR><BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;单只基金规模过大,会造成基金管理的难度提高,可能会对基金的业绩表现造成影响.<BR><BR><STRONG>第五,投资ETF是一种很好的方式<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ETF是指数型基金,又称为被动型基金,它是一揽子优质股票的组合,它基本上复制了大盘的走势.而从长期来看,大多数主动型基金的业绩都是跑不赢大盘的.<BR></DIV>]]></description>
<pubDate>
2007-09-12 16:31:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,10439010.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,10439010.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[千万不要生吃的10种常见食物]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,10131561.shtml</link>
<description>
<![CDATA[千万不要生吃的10种常见食物<BR><BR><BR>一忌生吃鲜黄花菜。鲜黄花菜含有秋水仙碱，进入人体形成氧化二秋水仙碱，极毒，食用3－20毫克就可致死。<BR><BR>二忌生吃荸荠。常吃生荸荠，其中的姜片虫就会进入人体并附在肠粘膜上，可造成肠道溃疡、腹泻或面部浮肿。<BR><BR>三忌生吃白糖。白糖中常有螨虫寄生，生吃白糖很容易得螨虫病。螨是一种全身长毛的小昆虫，肉眼看不见，螨在糖中繁殖很快。若螨虫进入胃肠道，就会引起腹痛、腹泻、形成溃疡。若进入肺内，会引起咯血、哮喘。若进入尿道，可引起尿路炎症。因此，白糖最好不要生吃，食用前应该进行加热处理（一般加热到70℃左右保持3分钟就可以了）。<BR><BR>四忌生吃蜂蜜。蜜蜂在酿制蜂蜜时，常常采集一些有毒的花粉，这些有毒的花粉酿进蜂蜜以后，人吃了生蜜就容易发生中毒。另外蜂蜜在收获、运输、保管的过程中，又很容易被细菌污染。因此，生蜂蜜不可食用。<BR><BR>五忌生吃新鲜木耳。新鲜木耳含叶林类光感物质，生吃新鲜木耳后，可引起日光性皮炎，严重者出现皮肤瘙痒、水肿和疼痛。<BR><BR>六忌生吃豆浆。豆浆味美可口，其营养价值并不比牛奶低。但饮用未煮沸的豆浆，可引起全身中毒。因为生豆浆中含有一些有害成分----抗胰蛋白酶、酚类化合物和皂素等。抗胰蛋白酶影响蛋白质的消化和吸收；酚类化合物可使豆浆产生苦味和腥味；皂素刺激消化道，引起呕吐、恶心、腹泻，从而破坏红细胞，产生毒素，以致引起全身中毒。<BR><BR>七忌生吃河鱼。肝吸虫卵在河塘的螺蛳体内发育成尾蚴，并寄生在鱼体内，若吃了生的河鱼，肝吸虫就会进入人体发育成虫，可使人体产生胆管炎，甚至发展成肝硬化。<BR><BR>八忌生吃螃蟹和龙虾。生螃蟹带有肺吸虫的囊蚴虫和副溶性弧菌，龙虾则是肺吸虫的中间寄主，生吃螃蟹和龙虾后，肺吸虫进入人体，会造成肺脏损伤，严重者会使肠道发炎或肠道水肿充血。<BR><BR>九忌吃生鸡蛋。蛋清所含的抗生物蛋白在肠道内与生物素结合后，会阻碍人体对生物素的吸收。生鸡蛋还常含有沙门氏菌，会使人呕吐、腹泻。<BR><BR>十忌生吃豆角。豆角包括扁豆、芸豆、菜豆、刀豆、四季豆等。吃豆角容易中毒，是因为豆角里面含有一种毒蛋白“凝集素”，这种物质在成熟的或较老的豆角中最多。豆角应该煮沸或用急火加热10分钟以上，这样“凝集素”就会被除掉。吃炒豆角或者用豆角做馅时，要充分加热，吃凉拌豆角也要煮10分钟]]></description>
<pubDate>
2007-09-02 20:53:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,10131561.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,10131561.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[通过SQL Server在服务器上存取文件 ]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,9287460.shtml</link>
<description>
<![CDATA[<P>&nbsp;&nbsp; <BR>&nbsp;原文网址: <A href="http://www.yourblog.org/Data/20061/411359.html">http://www.yourblog.org/Data/20061/411359.html</A><BR>&nbsp;<BR>&nbsp;日期：2006年1月15日 星期日 天气：晴朗 作者：ThornBird<BR>通过SQL Server在服务器上存取文件 <BR>发表：2006-1-15 15:26:05 出处：你的博客网(yourblog.org) </P>
<P>--------------------------------------------------------------------------------</P>
<P>&nbsp;&nbsp;&nbsp; 前些天改公司的程序，发现员工基本资料表中的照片字段竟是字符型，只保存照片的路径。我们的程序一般是用远程桌面访问，或是把程</P>
<P>序所在目录映射为本地盘并运行程序。这样一来，图片只能放在服务器上才能进行显示、打印，且如果采取映射本地盘的方式，每个客户端应</P>
<P>该都必须映射为相同的本地盘（或者把照片放在程序所在目录下，保存相对路径）。于是我把照片字段改成text类型，把文件存储到数据库中</P>
<P>，不过一个同事不同意我的做法，于是只好作罢。但后来我想到其实可以把照片“上传”到服务器上，需要使用时再“下载”到本地，然后数</P>
<P>据库中保存文件在服务器上的实际路径。通过查资料，我知道了可以用 sp_makewebtask 存储过程把查询结果保存到服务器上，遗憾的是它是</P>
<P>保存为网页的格式，而不能把文件照原样保存到服务器上。不过无所谓了，只要“下载”时再对文件结构进行分析就可以了，这样一来就可以</P>
<P>实现“上传”的功能了。至于“下载”，可以用 BULK INSERT 语句来实现。<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; 我的思路是这样的：把文件进行编码后保存到 SQL Server 的临时表中，然后执行 sp_makewebtask 存储过程保存文件；使用“上传”的</P>
<P>文件时则可以用 BULK INSERT 语句把文件存入临时表中，然后再通过查询得到文件的全部内容，然后进行分析和解码后进行保存。上面两个步</P>
<P>骤都需要有足够的权限。这就是我的 ServerFileAccess 类的基本思路，这个类主要有下面几个方法：</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetConnectString&nbsp; 设置连接字符串<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetConnectHandle&nbsp; 设置连接句柄<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connect&nbsp; 与 SQL Server 建立连接<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Disconnect&nbsp;&nbsp; 断掉连接<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UploadFile&nbsp;&nbsp; 把客户端的文件“上传”到服务器上<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetFileFromServer&nbsp;&nbsp; 获取服务器上的文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetUploadFileFromServer&nbsp;&nbsp; 获取之前“上传”到服务器上的文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DownloadFile&nbsp;&nbsp; “下载”服务器上的指定文件到本地<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DownloadUploadFile&nbsp; “下载”之前“上传”到服务器上的文件到本地</P>
<P>下面是 ServerFileAccess 类的代码及演示：<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; ServerFileAccess.prg<BR>&nbsp;<BR>DEFINE CLASS ServerFileAccess AS Custom</P>
<P>&nbsp;&nbsp;&nbsp; PROTECTED ConnectString<BR>&nbsp;&nbsp;&nbsp; PROTECTED ConnectHandle<BR>&nbsp;&nbsp;&nbsp; PROTECTED Connected<BR>&nbsp;&nbsp;&nbsp; PROTECTED FLAG_START<BR>&nbsp;&nbsp;&nbsp; PROTECTED FLAG_END<BR>&nbsp;&nbsp;&nbsp; PROTECTED ROWTERMINATOR<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE Init<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.ConnectString = ""<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.ConnectHandle = -1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.Connected = .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.FLAG_START = "&lt;&lt;START&gt;&gt;"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.FLAG_END = "&lt;&lt;END&gt;&gt;"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.ROWTERMINATOR = CHR(13)<BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE Destroy<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF THIS.Connected = .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.Disconnect()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE SetConnectString<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPARAMETERS cServer, cDatabase, cUserId, cPassword<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.ConnectString = "Driver=SQL Server;" + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Server=" + cServer + ";" + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Database=" + cDatabase + ";" + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Uid=" + cUserId + ";" + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Pwd=" + cPassword<BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE SetConnectHandle<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPARAMETERS nConnectHandle<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.ConnectHandle = nConnectHandle<BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE Connect<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIVATE nDispLogin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nDispLogin = SQLGETPROP(0, "DispLogin")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLSETPROP(0, "DispLogin", 3)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF THIS.ConnectHandle &gt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.ConnectHandle = SQLSTRINGCONNECT(THIS.ConnectString)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLSETPROP(0, "DispLogin", nDispLogin)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF THIS.ConnectHandle &gt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.Connected = .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN .F.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE Disconnect<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIVATE lReturnValue<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lReturnValue = .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.ConnectString = ""<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRY<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLDISCONNECT(THIS.ConnectHandle)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CATCH<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lReturnValue = .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDTRY<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.ConnectHandle = -1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connected = .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN lReturnValue<BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE UploadFile<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPARAMETERS cClientFile, cServerFile<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIVATE lReturnValue, nReturnValue, cTableName, cSQL, cDrop, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData, cRandKey<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lReturnValue = .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nReturnValue = -1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cTableName = "##" + SYS(2015)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cSQL = [CREATE TABLE ] + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cTableName + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ (RandKey char(8) NULL, FileData text NULL)]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cDrop = [DROP TABLE ] + cTableName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData = THIS.FLAG_START + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STRCONV(FILETOSTR(cClientFile), 15) + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.FLAG_END<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cRandKey = SYS(3)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLEXEC(THIS.ConnectHandle, cSQL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cSQL = [INSERT INTO ] + cTableName + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ (RandKey, FileData)] + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ VALUES] + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ (’] + cRandKey + [’, ’] + cFileData + [’)]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nReturnValue = SQLEXEC(THIS.ConnectHandle, cSQL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF nReturnValue &lt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLEXEC(THIS.ConnectHandle, cDrop)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN lReturnValue<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cSQL = [EXECUTE master..sp_makewebtask ] + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ["] + cServerFile + [", ] + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ["SELECT FileData FROM ] + cTableName + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ WHERE RandKey = ’] + cRandKey + [’"]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nReturnValue = SQLEXEC(THIS.ConnectHandle, cSQL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF nReturnValue &gt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lReturnValue = .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLEXEC(THIS.ConnectHandle, cDrop)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN lReturnValue<BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE GetFileFromServer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPARAMETERS cServerFile<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIVATE cFileData, nReturnValue, cTableName, cSQL, cDrop, ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cCurrentAlias, cAlias, i<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData = ""<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nReturnValue = -1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cTableName = "##" + SYS(2015)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cSQL = [CREATE TABLE ] + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cTableName + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ (FileData text NULL)]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cDrop = [DROP TABLE ] + cTableName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nReturnValue = SQLEXEC(THIS.ConnectHandle, cSQL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF nReturnValue &lt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN cFileData<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cSQL = [BULK INSERT ] + cTableName + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ FROM ’] + cServerFile + [’] + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ WITH (ROWTERMINATOR = ’] + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS.ROWTERMINATOR + [’)]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nReturnValue = SQLEXEC(THIS.ConnectHandle, cSQL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF nReturnValue &lt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLEXEC(THIS.ConnectHandle, cDrop)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN cFileData<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cCurrentAlias = ALIAS()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cAlias = SYS(2015)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cSQL = [SELECT FileData FROM ] + cTableName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nReturnValue = SQLEXEC(THIS.ConnectHandle, cSQL, cAlias)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLEXEC(THIS.ConnectHandle, cDrop)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF nReturnValue &lt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN cFileData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT (cAlias)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GO TOP<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCAN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData = cFileData + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IIF(ISNULL(FileData) = .T., "", ALLTRIM(FileData)) + ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IIF(RECNO() = RECCOUNT(), "", THIS.ROWTERMINATOR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDSCAN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USE IN (cAlias)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EMPTY(cCurrentAlias) = .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT (cCurrentAlias)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN cFileData<BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE GetUploadFileFromServer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPARAMETERS cServerFile<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIVATE cFileData, nStart, nLength<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData = ""<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData = THIS.GetFileFromServer(cServerFile)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EMPTY(cFileData) = .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN cFileData<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDIF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nStart = AT(THIS.FLAG_START, cFileData) + LEN(THIS.FLAG_START)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nLength = AT(THIS.FLAG_END, cFileData) - nStart<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData = SUBSTR(cFileData, nStart, nLength)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData = STRCONV(cFileData, 16)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN cFileData<BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE DownloadFile<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPARAMETERS cServerFile, cClientFile<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIVATE cFileData<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData = THIS.GetFileFromServer(cServerFile)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = STRTOFILE(cFileData, cClientFile)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN .T.<BR>&nbsp;&nbsp;&nbsp; ENDPROC<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; PROCEDURE DownloadUploadFile<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPARAMETERS cServerFile, cClientFile<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIVATE cFileData<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFileData = THIS.GetUploadFileFromServer(cServerFile)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = STRTOFILE(cFileData, cClientFile)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN .T.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; ENDPROC</P>
<P>ENDDEFINE</P>
<P>&nbsp;<BR>&nbsp;&nbsp;&nbsp; ServerFileAccess_Demo.prg<BR>&nbsp;<BR>SET PROCEDURE TO ServerFileAccess.prg<BR>oServerFileAccess = CREATEOBJECT("ServerFileAccess")<BR>oServerFileAccess.SetConnectString("127.0.0.1", "master", "sa", "123456")<BR>oServerFileAccess.Connect()</P>
<P>*-- 演示 UploadFile 方法<BR>cSource = GETFILE("", "上传文件(&amp;F):", "选择", 0, "请选择要上传到服务器上的文件")<BR>cTarget = ALLTRIM(INPUTBOX("保存路径(含文件名):", "请输入上传路径及目标文件名"))<BR>? oServerFileAccess.UploadFile(cSource, cTarget)</P>
<P>*-- 演示 DownloadUploadFile 方法<BR>cFileName = PUTFILE("保存文件(&amp;F)", "", JUSTEXT(cSource))<BR>? oServerFileAccess.DownloadUploadFile(cTarget, cFileName)</P>
<P>oServerFileAccess.Disconnect()</P>]]></description>
<pubDate>
2007-08-03 11:42:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,9287460.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,9287460.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[如何在 Visual FoxPro 中建立自訂HTML[ 說明 ]檢視器]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,8438972.shtml</link>
<description>
<![CDATA[<DIV>
<DIV><B><FONT size=2>如何在 Visual FoxPro 中， 建立自訂 HTML [ 說明 ] 檢視器</FONT></B></DIV>
<DIV><A href="http://support.microsoft.com/kb/191174/zh-tw#appliesto">檢視此文章適用的產品。</A>&nbsp;&nbsp;&nbsp;&nbsp; 出处：&nbsp;&nbsp; <A href="http://support.microsoft.com/kb/191174/zh-tw">http://support.microsoft.com/kb/191174/zh-tw</A></DIV>
<DIV>
<DIV></DIV></DIV>
<DIV>
<TABLE>
<TBODY>
<TR>
<TD>文章編號</TD>
<TD>:</TD>
<TD>191174</TD></TR>
<TR>
<TD>上次校閱</TD>
<TD>:</TD>
<TD>2004年6月29日</TD></TR>
<TR>
<TD>版次</TD>
<TD>:</TD>
<TD>1.1</TD></TR></TBODY></TABLE></DIV>
<DIV>
<DIV>
<DIV></DIV></DIV></DIV>
<DIV>
<DIV><FONT size=5><B>結論</B></FONT></DIV>
<DIV>本文告訴您如何使用 Visual FoxPro 來建立您自訂 HTML 說明檢視器。 <BR><BR>若要在 Visual FoxPro HTML 說明檢視器， 作為建立相當簡單的表單可能是以瞭解如何 HTML 協助配合 Microsoft WebBrowser 控制項， URL 語法運作。 </DIV>
<DIV><FONT size=5><B>其他相關資訊</B></FONT></DIV>
<DIV>HTML 說明檔會儲存為 . chm 檔中的壓縮 HTML 來源。 專為 Visual FoxPro， 此檔案稱為 FoxHelp.chm， 並包含所有的 HTML 原始檔和影像為 Visual FoxPro 說明主題。 因為 Visual FoxPro 說明是根據 HTML， 它像任何其他的 HTML 文件在 Internet Explorer 中檢視更。 下列程式碼使用 Visual FoxPro HyperLink baseclass 來啟動 Internet Explorer 並顯示主要 Visual FoxPro 說明主題： oMyHyperLink = NewObject("Hyperlink") cHelpPath = substr(Home(5), 1, Len(Home(5))-8) cVFPHelpTopicPath = "mk:@MSITStore:" + cHelpPath + ; "FOXHELP.CHM::/html/vfpstartpage.htm" oMyHyperLink.NavigateTo(cVFPHelpTopicPath) <FONT face="宋体, MS Song">下列範例程式碼建立表單， 其中包含 Microsoft WebBrowser 控制項， 並啟動它時它會自動巡覽至 Visual FoxPro 說明主題。 此表單並沒有提供任何超出這些說明主題內， 提供巡覽功能。 使用 WebBrowser 控制項的廣泛物件模型， 不過， 就可以提供這項功能。<BR><BR><B>範例程式碼 </B></FONT>PUBLIC oMyHelpViewer oMyHelpViewer = NewObject("myhtmlhelpviewer") oMyHelpViewer.Show DEFINE CLASS myhtmlhelpviewer AS form Top = 0 Left = 0 Height = 454 Width = 633 DoCreate = .T. BorderStyle = 2 Caption = "Custom HTML Help Viewer" MaxButton = .F. WindowState = 0 Name = "Form1" ADD OBJECT olecontrol1 AS olecontrol WITH ; Top = 10, ; Left = 16, ; Height = 433, ; Width = 601, ; Name = "Olecontrol1", ; OLEClass = "Shell.Explorer.2" PROCEDURE olecontrol1.Refresh NODEFAULT ENDPROC PROCEDURE olecontrol1.Init cHelpPath = SubSTR(Home(5), 1, Len(Home(5))-8) cVFPHelpTopicPath = "mk:@MSITStore:" + cHelpPath + ; "FOXHELP.CHM::/html/vfpstartpage.htm" This.Navigate(cVFPHelpTopicPath) ENDPROC ENDDEFINE <FONT face="宋体, MS Song">很重要， 以辨識， 雖然這個 HTML 說明檢視器讓您能檢視 HTML 說明主題， 它不會提供所有的功能和功能， 「 Microsoft HTML [ 說明 ] 檢視器 」 提供， 並有特定的 HTML 說明功能在所有檢視說明主題使用 WebBrowser 控制項時， 將無法運作。 </FONT></DIV></DIV>
<DIV>
<HR>
</DIV></DIV>]]></description>
<pubDate>
2007-07-09 22:29:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,8438972.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,8438972.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[“没事做的人”完整版]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,6679918.shtml</link>
<description>
<![CDATA[

<META content="MSHTML 6.00.2900.3059" name=GENERATOR>

<BODY leftMargin=3 topMargin=2>

<DIV><BR><STRONG>一些事沒人做， <BR>一些人沒事做。 <BR>沒事的人盯着做事的人， <BR>议论做事的人做的事， <BR>使做事的人做不成事、做不好事。 <BR><BR>于是, <BR>老板夸奖沒事的人， <BR>因为他看到事做不成。 <BR><BR>于是, <BR>老板训诫做事的人， <BR>因为他做不成事。 <BR><BR>一些沒事的人总是沒事做， <BR>一些做事的人总有做不完的事。 <BR>一些沒事的人滋事闹事， <BR>使做事的人不得不做更多的事。 <BR><BR>结果 <BR>好事变坏事， <BR>小事变大事， <BR>简单的事变复杂的事。 <BR><BR>然后公司开始出事， <BR>为了解決这些事， <BR>老板开始要求不做事的人做些事， <BR><BR>这些人才做一点点事， <BR>就到处说他做了全天下最难的事， <BR>也有人啥事也不做， <BR>只会光说这是一件不可能成功的事。 <BR><BR>最后做事的人还是不得不接下這些沒人做的事， <BR>公司得救了， <BR>不做事的人就说： <BR>那还不是开头做了许多事， <BR>公司再见了， <BR>他们也说： <BR>我早说那是不可能的事。 <BR><BR>最后全公司的人都不做事， <BR>反正不做事也不会出事， <BR>多做事反而会惹事。 <BR><BR>就这样大家一起看电视， <BR>看到最后全部都近视。 <BR></STRONG><BR><STRONG>阿拉伯谚语 : <BR>『你若不想做，会找到一個借口。 <BR>你若想做，会找到一個方法』 <BR></STRONG></DIV>]]></description>
<pubDate>
2007-06-19 14:56:03.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,6679918.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,6679918.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[取汉字的拼音首字]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,5580201.shtml</link>
<description>
<![CDATA[

<META content="MSHTML 6.00.2900.3059" name=GENERATOR>

<BODY leftMargin=3 topMargin=2>

<DIV>***************<BR>function&nbsp; PY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;取汉字的拼音首字<BR>para&nbsp; sr<BR>dime&nbsp; ChinaCode[26,2]<BR>**********</DIV>

<DIV>ChinaCode[1,1]=1601<BR>ChinaCode[1,2]=1636<BR>ChinaCode[2,1]=1637<BR>ChinaCode[2,2]=1832<BR>ChinaCode[3,1]=1833<BR>ChinaCode[3,2]=2077<BR>ChinaCode[4,1]=2078<BR>ChinaCode[4,2]=2273<BR>ChinaCode[5,1]=2274<BR>ChinaCode[5,2]=2301<BR>ChinaCode[6,1]=2302<BR>ChinaCode[6,2]=2432<BR>ChinaCode[7,1]=2433<BR>ChinaCode[7,2]=2593<BR>ChinaCode[8,1]=2594<BR>ChinaCode[8,2]=2786<BR>ChinaCode[9,1]=9999<BR>ChinaCode[9,2]=0000<BR>ChinaCode[10,1]=2787<BR>ChinaCode[10,2]=3105<BR>ChinaCode[11,1]=3106<BR>ChinaCode[11,2]=3211<BR>ChinaCode[12,1]=3212<BR>ChinaCode[12,2]=3471<BR>ChinaCode[13,1]=3472<BR>ChinaCode[13,2]=3634<BR>ChinaCode[14,1]=3635<BR>ChinaCode[14,2]=3722<BR>ChinaCode[15,1]=3723<BR>ChinaCode[15,2]=3729<BR>ChinaCode[16,1]=3730<BR>ChinaCode[16,2]=3105<BR>ChinaCode[17,1]=3858<BR>ChinaCode[17,2]=4026<BR>ChinaCode[18,1]=4027<BR>ChinaCode[18,2]=4085<BR>ChinaCode[19,1]=4086<BR>ChinaCode[19,2]=4389<BR>ChinaCode[20,1]=4390<BR>ChinaCode[20,2]=4557<BR>ChinaCode[21,1]=9999<BR>ChinaCode[21,2]=0000<BR>ChinaCode[22,1]=9999<BR>ChinaCode[22,2]=0000<BR>ChinaCode[23,1]=4558<BR>ChinaCode[23,2]=4683<BR>ChinaCode[24,1]=4684<BR>ChinaCode[24,2]=4924<BR>ChinaCode[25,1]=4925<BR>ChinaCode[25,2]=5248<BR>ChinaCode[26,1]=5249<BR>ChinaCode[26,2]=5589</DIV>

<DIV><BR>FResult = ''<BR>C1 = 1<BR>Len1 = Len(sr)<BR>do while C1&lt;=Len1<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; if (asc(subs(sr,c1,1))&gt;=160) and (asc(subs(sr,C1+1,1))&gt;=160) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ir = (asc(subs(sr,C1,1))-160)*100 + asc(subs(sr,C1+1,1))-160<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C2 = 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do while C2&lt;=26 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ir&gt;=ChinaCode[C2,1]) and (ir&lt;=ChinaCode[C2,2]) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FResult = FResult+chr(C2-1+asc('a'))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endif&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C2 = C2 + 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enddo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; endif<BR>&nbsp;&nbsp;&nbsp;&nbsp; C1 = C1 + 2<BR>&nbsp;enddo<BR>&nbsp;return upper(FResult)</DIV>]]></description>
<pubDate>
2007-06-12 20:55:29.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,5580201.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,5580201.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[ VFP+SQL SERVER数据库备份和恢复]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,5276804.shtml</link>
<description>
<![CDATA[数据库备份/恢复方案&nbsp;&nbsp;&nbsp; zjcxc（原作）&nbsp; <BR>&nbsp; <BR>关键字&nbsp;&nbsp;&nbsp;&nbsp; 备份,恢复,作业&nbsp;<BR>&nbsp; <BR>利用SQL语言,实现数据库的备份/恢复的功能<BR><BR>体现了SQL Server中的四个知识点：<BR><BR>1．&nbsp;&nbsp; 获取SQL Server服务器上的默认目录<BR><BR>2．&nbsp;&nbsp; 备份SQL语句的使用<BR><BR>3．&nbsp;&nbsp; 恢复SQL语句的使用，同时考虑了强制恢复时关闭其他用户进程的处理<BR><BR>4．&nbsp;&nbsp; 作业创建SQL语句的使用<BR><BR>&nbsp;<BR>/*1.--得到数据库的文件目录<BR><BR>@dbname 指定要取得目录的数据库名<BR>&nbsp;&nbsp; 如果指定的数据不存在,返回安装SQL时设置的默认数据目录<BR>&nbsp;&nbsp; 如果指定NULL,则返回默认的SQL备份目录名<BR>----*/<BR><BR>/*--调用示例<BR>select 数据库文件目录=dbo.f_getdbpath('tempdb')<BR>&nbsp; ,[默认SQL SERVER数据目录]=dbo.f_getdbpath('')<BR>&nbsp; ,[默认SQL SERVER备份目录]=dbo.f_getdbpath(null)<BR>--*/<BR>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_getdbpath]') and xtype in (N'FN', N'IF', N'TF'))<BR>drop function [dbo].[f_getdbpath]<BR>GO<BR><BR>create function f_getdbpath(@dbname sysname)<BR>returns nvarchar(260)<BR>as <BR>begin<BR>declare @re nvarchar(260)<BR>if @dbname is null or db_id(@dbname) is null<BR>&nbsp; select @re=rtrim(reverse(filename)) from master..sysdatabases where name='master'<BR>else<BR>&nbsp; select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname<BR><BR>if @dbname is null<BR>&nbsp; set @re=reverse(substring(@re,charindex('\',@re)+5,260))+'BACKUP\'<BR>else<BR>&nbsp; set @re=reverse(substring(@re,charindex('\',@re),260))<BR>return(@re)<BR>end<BR>go<BR><BR><BR>/*2.--备份数据库--*/<BR><BR>/*--调用示例<BR><BR>--备份当前数据库<BR>exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_db.bak'<BR><BR>--差异备份当前数据库<BR>exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_df.bak',@bktype='DF'<BR><BR>--备份当前数据库日志<BR>exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_log.bak',@bktype='LOG'<BR><BR>--*/<BR><BR>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_backupdb]') and OBJECTPROPERTY(id, N'IsProcedure') = <BR>1)<BR>drop procedure [dbo].[p_backupdb]<BR>GO<BR><BR>create proc p_backupdb<BR>@dbname sysname='',&nbsp;&nbsp; --要备份的数据库名称,不指定则备份当前数据库<BR>@bkpath nvarchar(260)='', --备份文件的存放目录,不指定则使用SQL默认的备份目录<BR>@bkfname nvarchar(260)='', --备份文件名,文件名中可以用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间<BR>@bktype nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份<BR>@appendfile bit=1&nbsp;&nbsp; --追加/覆盖备份文件<BR>as<BR>declare @sql varchar(8000)<BR>if isnull(@dbname,'')='' set @dbname=db_name()<BR>if isnull(@bkpath,'')='' set @bkpath=dbo.f_getdbpath(null)<BR>if isnull(@bkfname,'')='' set @bkfname='\DBNAME\_\DATE\_\TIME\.BAK'<BR>set @bkfname=replace(replace(replace(@bkfname,'\DBNAME\',@dbname)<BR>&nbsp; ,'\DATE\',convert(varchar,getdate(),112))<BR>&nbsp; ,'\TIME\',replace(convert(varchar,getdate(),108),':',''))<BR>set @sql='backup '+case @bktype when 'LOG' then 'log ' else 'database ' end +@dbname<BR>&nbsp; +' to disk='''+@bkpath+@bkfname<BR>&nbsp; +''' with '+case @bktype when 'DF' then 'DIFFERENTIAL,' else '' end<BR>&nbsp; +case @appendfile when 1 then 'NOINIT' else 'INIT' end<BR>print @sql<BR>exec(@sql)<BR>go<BR><BR><BR><BR>/*3.--恢复数据库--*/<BR><BR>/*--调用示例<BR>--完整恢复数据库<BR>exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db'<BR><BR>--差异备份恢复<BR>exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'<BR>exec p_backupdb @bkfile='c:\db_20031015_df.bak',@dbname='db',@retype='DF'<BR><BR>--日志备份恢复<BR>exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'<BR>exec p_backupdb @bkfile='c:\db_20031015_log.bak',@dbname='db',@retype='LOG'<BR><BR>--*/<BR><BR>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_RestoreDb]') and OBJECTPROPERTY(id, N'IsProcedure') = <BR>1)<BR>drop procedure [dbo].[p_RestoreDb]<BR>GO<BR><BR>create proc p_RestoreDb<BR>@bkfile nvarchar(1000),&nbsp; --定义要恢复的备份文件名<BR>@dbname sysname='',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --定义恢复后的数据库名,默认为备份的文件名<BR>@dbpath nvarchar(260)='', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录<BR>@retype nvarchar(10)='DB', --恢复类型:'DB'完事恢复数据库,'DBNOR' 为差异恢复,日志恢复进行完整恢复,'DF' 差异备份的恢复,'LOG' 日<BR>志恢复<BR>@filenumber int=1,&nbsp;&nbsp; --恢复的文件号<BR>@overexist bit=1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --是否覆盖已经存在的数据库,仅@retype为<BR>@killuser bit=1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --是否关闭用户使用进程,仅@overexist=1时有效<BR>as<BR>declare @sql varchar(8000)<BR><BR>--得到恢复后的数据库名<BR>if isnull(@dbname,'')=''<BR>select @sql=reverse(@bkfile)<BR>&nbsp; ,@sql=case when charindex('.',@sql)=0 then @sql<BR>&nbsp;&nbsp; else substring(@sql,charindex('.',@sql)+1,1000) end<BR>&nbsp; ,@sql=case when charindex('\',@sql)=0 then @sql<BR>&nbsp;&nbsp; else left(@sql,charindex('\',@sql)-1) end<BR>&nbsp; ,@dbname=reverse(@sql)<BR><BR>--得到恢复后的数据库存放目录<BR>if isnull(@dbpath,'')='' set @dbpath=dbo.f_getdbpath('')<BR><BR>--生成数据库恢复语句<BR>set @sql='restore '+case @retype when 'LOG' then 'log ' else 'database ' end+@dbname<BR>+' from disk='''+@bkfile+''''<BR>+' with file='+cast(@filenumber as varchar)<BR>+case when @overexist=1 and @retype in('DB','DBNOR') then ',replace' else '' end<BR>+case @retype when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end<BR>print @sql<BR>--添加移动逻辑文件的处理<BR>if @retype='DB' or @retype='DBNOR'<BR>begin<BR>--从备份文件中获取逻辑文件名<BR>declare @lfn nvarchar(128),@tp char(1),@i int<BR><BR>--创建临时表,保存获取的信息<BR>create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))<BR>--从备份文件中获取信息<BR>insert into #tb exec('restore filelistonly from disk='''+@bkfile+'''')<BR>declare #f cursor for select ln,tp from #tb<BR>open #f<BR>fetch next from #f into @lfn,@tp<BR>set @i=0<BR>while @@fetch_status=0<BR>begin<BR>&nbsp; select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@dbname+cast(@i as varchar)<BR>&nbsp;&nbsp; +case @tp when 'D' then '.mdf''' else '.ldf''' end<BR>&nbsp;&nbsp; ,@i=@i+1<BR>&nbsp; fetch next from #f into @lfn,@tp<BR>end<BR>close #f<BR>deallocate #f<BR>end<BR><BR>--关闭用户进程处理<BR>if @overexist=1 and @killuser=1<BR>begin<BR>declare @spid varchar(20)<BR>declare #spid cursor for<BR>&nbsp; select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)<BR>open #spid<BR>fetch next from #spid into @spid<BR>while @@fetch_status=0<BR>begin&nbsp; <BR>&nbsp; exec('kill '+@spid)<BR>&nbsp; fetch next from #spid into @spid<BR>end&nbsp; <BR>close #spid<BR>deallocate #spid<BR>end<BR><BR>--恢复数据库<BR>exec(@sql)<BR><BR>go<BR><BR>/*4.--创建作业--*/<BR><BR>/*--调用示例<BR><BR>--每月执行的作业<BR>exec p_createjob @jobname='mm',@sql='select * from syscolumns',@freqtype='month'<BR><BR>--每周执行的作业<BR>exec p_createjob @jobname='ww',@sql='select * from syscolumns',@freqtype='week'<BR><BR>--每日执行的作业<BR>exec p_createjob @jobname='a',@sql='select * from syscolumns'<BR><BR>--每日执行的作业,每天隔4小时重复的作业<BR>exec p_createjob @jobname='b',@sql='select * from syscolumns',@fsinterval=4<BR><BR>--*/<BR>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_createjob]') and OBJECTPROPERTY(id, N'IsProcedure') = <BR>1)<BR>drop procedure [dbo].[p_createjob]<BR>GO<BR><BR>Create Procedure p_createjob<BR>@jobname varchar(100),&nbsp; --作业名称<BR>@sql varchar(8000),&nbsp;&nbsp; --要执行的命令<BR>@dbname sysname='',&nbsp;&nbsp; --默认为当前的数据库名<BR>@freqtype varchar(6)='day', --时间周期,month 月,week 周,day 日<BR>@fsinterval int=1,&nbsp;&nbsp; --相对于每日的重复次数<BR>@time int=170000&nbsp;&nbsp; --开始执行时间,对于重复执行的作业,将从0点到23:59分<BR>as<BR>if isnull(@dbname,'')='' set @dbname=db_name()<BR><BR>--创建作业<BR>exec msdb..sp_add_job @job_name=@jobname<BR><BR>--创建作业步骤<BR>exec msdb..sp_add_jobstep @job_name=@jobname,<BR>@step_name = '数据处理',<BR>@subsystem = 'TSQL',<BR>@database_name=@dbname,<BR>@command = @sql,<BR>@retry_attempts = 5, --重试次数<BR>@retry_interval = 5&nbsp; --重试间隔<BR><BR>--创建调度<BR>declare @ftype int,@fstype int,@ffactor int<BR>select @ftype=case @freqtype when 'day' then 4<BR>&nbsp;&nbsp;&nbsp;&nbsp; when 'week' then 8<BR>&nbsp;&nbsp;&nbsp;&nbsp; when 'month' then 16 end<BR>,@fstype=case @fsinterval when 1 then 0 else 8 end<BR>if @fsinterval&lt;&gt;1 set @time=0<BR>set @ffactor=case @freqtype when 'day' then 0 else 1 end<BR><BR>EXEC msdb..sp_add_jobschedule @job_name=@jobname, <BR>@name = '时间安排',<BR>@freq_type=@ftype ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --每天,8 每周,16 每月<BR>@freq_interval=1,&nbsp;&nbsp;&nbsp;&nbsp; --重复执行次数<BR>@freq_subday_type=@fstype,&nbsp;&nbsp; --是否重复执行<BR>@freq_subday_interval=@fsinterval,&nbsp; --重复周期<BR>@freq_recurrence_factor=@ffactor,<BR>@active_start_time=@time&nbsp;&nbsp;&nbsp;&nbsp; --下午17:00:00分执行<BR><BR>go<BR><BR><BR>/*--应用案例--备份方案:<BR>完整备份（每个星期天一次）+差异备份（每天备份一次）+日志备份（每2小时备份一次）<BR><BR>调用上面的存储过程来实现<BR>--*/<BR><BR>declare @sql varchar(8000)<BR>--完整备份（每个星期天一次）<BR>set @sql='exec p_backupdb @dbname=''要备份的数据库名'''<BR>exec p_createjob @jobname='每周备份',@sql,@freqtype='week'<BR><BR>--差异备份（每天备份一次）<BR>set @sql='exec p_backupdb @dbname=''要备份的数据库名'',@bktype='DF''<BR>exec p_createjob @jobname='每天差异备份',@sql,@freqtype='day'<BR><BR>--日志备份（每2小时备份一次）<BR>set @sql='exec p_backupdb @dbname=''要备份的数据库名'',@bktype='LOG''<BR>exec p_createjob @jobname='每2小时日志备份',@sql,@freqtype='day',@fsinterval=2<BR><BR>*--应用案例2<BR><BR>生产数据核心库：PRODUCE<BR><BR>备份方案如下：<BR>1.设置三个作业,分别对PRODUCE库进行每日备份,每周备份,每月备份<BR>2.新建三个新库,分别命名为:每日备份,每周备份,每月备份<BR>3.建立三个作业，分别把三个备份库还原到以上的三个新库。<BR><BR>目的:当用户在produce库中有任何的数据丢失时,均可以从上面的三个备份库中导入相应的TABLE数据。<BR>--*/<BR><BR>declare @sql varchar(8000)<BR><BR>--1.建立每月备份和生成月备份数据库的作业,每月每1天下午16:40分进行:<BR>set @sql='<BR>declare @path nvarchar(260),@fname nvarchar(100)<BR>set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_m.bak''<BR>set @path=dbo.f_getdbpath(null)+@fname<BR><BR>--备份<BR>exec p_backupdb @dbname=''PRODUCE'',@bkfname=@fname<BR><BR>--根据备份生成每月新库<BR>exec p_RestoreDb @bkfile=@path,@dbname=''PRODUCE_月''<BR><BR>--为周数据库恢复准备基础数据库<BR>exec p_RestoreDb @bkfile=@path,@dbname=''PRODUCE_周'',@retype=''DBNOR''<BR><BR>--为日数据库恢复准备基础数据库<BR>exec p_RestoreDb @bkfile=@path,@dbname=''PRODUCE_日'',@retype=''DBNOR''<BR>'<BR>exec p_createjob @jobname='每月备份',@sql,@freqtype='month',@time=164000 <BR><BR>--2.建立每周差异备份和生成周备份数据库的作业,每周日下午17:00分进行:<BR>set @sql='<BR>declare @path nvarchar(260),@fname nvarchar(100)<BR>set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_w.bak''<BR>set @path=dbo.f_getdbpath(null)+@fname<BR><BR>--差异备份<BR>exec p_backupdb @dbname=''PRODUCE'',@bkfname=@fname,@bktype=''DF''<BR><BR>--差异恢复周数据库<BR>exec p_backupdb @bkfile=@path,@dbname=''PRODUCE_周'',@retype=''DF''<BR>'<BR>exec p_createjob @jobname='每周差异备份',@sql,@freqtype='week',@time=170000<BR><BR>--3.建立每日日志备份和生成日备份数据库的作业,每周日下午17:15分进行:<BR>set @sql='<BR>declare @path nvarchar(260),@fname nvarchar(100)<BR>set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_l.bak''<BR>set @path=dbo.f_getdbpath(null)+@fname<BR><BR>--日志备份<BR>exec p_backupdb @dbname=''PRODUCE'',@bkfname=@fname,@bktype=''LOG''<BR><BR>--日志恢复日数据库<BR>exec p_backupdb @bkfile=@path,@dbname=''PRODUCE_日'',@retype=''LOG''<BR>'<BR>exec p_createjob @jobname='每周差异备份',@sql,@freqtype='day',@time=171500<BR><BR>一、下面部分是SQLSERVER上的存储过程部分<BR>*!*创建F_GetDbPath获取数据库目录的自定义函数<BR>cSQL="Select * from dbo.sysobjects where id = object_id(N'[dbo].[F_GetDbPath]') and xtype in (N'FN', N'IF', N'TF')"<BR>If SQLEXEC(LNConn,cSQL,'MyFunc')&lt;=0<BR>&nbsp;&nbsp; Messagebox('F_GetDbPath 函数检测失败!',64,gcMyCorp,2000)<BR>&nbsp;&nbsp; =ShowSqlError()<BR>ELSE<BR>&nbsp;&nbsp; Select MyFunc<BR>&nbsp;&nbsp; IF RECCOUNT()&lt;1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USE IN MyFunc<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TEXT TO CSQL NOSHOW<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create Function F_GetDbPath(@DbName sysname)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returns nvarchar(260)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @re nvarchar(260)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @DbName is null or db_id(@DbName) is null<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @re=rtrim(reverse(FileName)) from master..sysdatabases where name='master'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @re=rtrim(reverse(FileName)) from master..sysdatabases where name=@DbName<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @DbName is null<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @re=reverse(substring(@re,charindex('\',@re)+5,260))+'BACKUP\'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @re=reverse(substring(@re,charindex('\',@re),260))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(@re)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDTEXT<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If SQLEXEC(LNConn,cSQL)&lt;=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Messagebox('自定义F_GetDbPath函数创建失败!',64,gcMyCorp,2000)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =ShowSqlError()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp; Endif<BR>Endif<BR><BR>*!*创建P_BackupDb备份存储过程<BR>If !FoundProc('P_BackupDb')<BR>&nbsp;&nbsp; TEXT TO CSQL NOSHOW<BR>&nbsp;&nbsp;&nbsp;&nbsp; Create Procedure P_BackupDb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @DbName sysname='',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --要备份的数据库名称,不指定则备份当前数据库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @BkPath nvarchar(260)='',&nbsp; --备份文件的存放目录,不指定则使用SQL默认的备份目录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @BkFName nvarchar(260)='', --备份文件名,文件名中可以用\DbName\代表数据库名,\TIME\代表时间<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @BkType nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @AppendFile bit=1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --1追加/0覆盖备份文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @sql varchar(8000)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@DbName,'')='' set @DbName=db_name()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@BkPath,'')='' set @BkPath=dbo.F_GetDbPath(null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@BkFName,'')='' set @BkFName='_\DbName\.BAK'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @bkfname=replace(replace(@bkfname,'\DBNAME\',@dbname)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,'\Week\',cast(datepart(weekday,getdate())-1 as varchar(1)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @sql='backup '+case @BkType when 'LOG' then 'log ' else 'database ' end +@DbName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +' to disk='''+@BkPath+@BkFName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +''' with '+case @BkType when 'DF' then 'DIFFERENTIAL,' else '' end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +case @AppendFile when 1 then 'NOINIT' else 'INIT' end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print&nbsp; @sql<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec(@sql)<BR>&nbsp;&nbsp;&nbsp; ENDTEXT<BR>=NewProc('P_BackupDb')<BR>Endif<BR><BR>*!*创建P_RestoreDb恢复存储过程<BR>If !FoundProc('P_RestoreDb')<BR>&nbsp;&nbsp; TEXT TO CSQL NOSHOW<BR>&nbsp;&nbsp; Create Procedure P_RestoreDb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @bkfile nvarchar(1000),&nbsp;&nbsp;&nbsp; --定义要恢复的备份文件名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @DbName sysname='',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --定义恢复后的数据库名,默认为备份的文件名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @DbPath nvarchar(260)='',&nbsp; --恢复后的数据库存放目录,不指定则为SQL的默认数据目录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @ReType nvarchar(10)='DB', --恢复类型:'DB'完事恢复数据库,'DBNOR' 为差异恢复,日志恢复进行完整恢复,'DF' 差异备份的恢<BR>复,'LOG' 日志恢复<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @FileNumber int=1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --恢复的文件号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @OverExist bit=1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --是否覆盖已经存在的数据库,仅@ReType为<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @KillUser bit=1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --是否关闭用户使用进程,仅@overexist=1时有效<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @sql varchar(8000)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --得到恢复后的数据库名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@DbName,'')=''<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @sql=reverse(@bkfile)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@sql=case when charindex('.',@sql)=0 then @sql<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else substring(@sql,charindex('.',@sql)+1,1000) end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@sql=case when charindex('\',@sql)=0 then @sql<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else left(@sql,charindex('\',@sql)-1) end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@DbName=reverse(@sql)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; --得到恢复后的数据库存放目录<BR>&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@DbPath,'')='' set @DbPath=dbo.F_GetDbPath('')<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; --生成数据库恢复语句<BR>&nbsp;&nbsp;&nbsp;&nbsp; set @sql='Restore '+case @ReType when 'LOG' then 'log ' else 'database ' end+@DbName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +' from disk='''+@bkfile+''''<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +' with file='+cast(@FileNumber as varchar)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +case when @overexist=1 and @ReType in('DB','DBNOR') then ',replace' else '' end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +case @ReType when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end<BR>&nbsp;&nbsp;&nbsp;&nbsp; --添加移动逻辑文件的处理<BR>&nbsp;&nbsp;&nbsp;&nbsp; if @ReType='DB' or @ReType='DBNOR'<BR>&nbsp;&nbsp;&nbsp;&nbsp; begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --从备份文件中获取逻辑文件名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @lfn nvarchar(128),@tp char(1),@i int<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --创建临时表,保存获取的信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --从备份文件中获取信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into #tb exec('restore filelistonly from disk='''+@bkfile+'''')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare #f cursor for Select ln,tp from #tb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open #f<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch next from #f into @lfn,@tp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @i=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while @@fetch_status=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@DbName+cast(@i as varchar)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +case @tp when 'D' then '.mdf''' else '.ldf''' end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@i=@i+1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch next from #f into @lfn,@tp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close #f<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deallocate #f<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --关闭用户进程处理<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @overexist=1 and @killuser=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @spid varchar(20)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare #spid cursor for<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@DbName)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open #spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch next from #spid into @spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while @@fetch_status=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec('kill '+@spid)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch next from #spid into @spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close #spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deallocate #spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --恢复数据库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print&nbsp; @sql<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec(@sql)<BR>&nbsp;&nbsp;&nbsp; ENDTEXT<BR>=NewProc('P_RestoreDb')<BR>Endif<BR><BR>*!*创建P_CreateJob调度作业存储过程<BR>If !FoundProc('P_CreateJob')<BR>&nbsp;&nbsp; TEXT TO CSQL NOSHOW<BR>&nbsp;&nbsp;&nbsp;&nbsp; Create Procedure P_CreateJob<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @jobname varchar(100),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --作业名称<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @sql varchar(8000),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --要执行的命令<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @DbName sysname='',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --默认为当前的数据库名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freqtype varchar(6)='day', --时间周期,month 月,week 周,day 日<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @fsinterval int=1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --相对于每日的重复次数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @time int=030000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --开始执行时间,对于重复执行的作业,将从0点到23:59分<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@DbName,'')='' set @DbName=db_name()<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --创建作业<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec msdb..sp_add_job @job_name=@jobname<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --创建作业步骤<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec msdb..sp_add_jobstep @job_name=@jobname,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @step_name = '数据处理',<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @subsystem = 'TSQL',<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @database_name=@DbName,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @command = @sql,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @retry_attempts = 5, --重试次数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @retry_interval = 5&nbsp; --重试间隔<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --创建调度<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @ftype int,@fstype int,@ffactor int<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @ftype=case @freqtype when 'day' then 4<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; when 'week' then 8<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; when 'month' then 16 end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@fstype=case @fsinterval when 1 then 0 else 8 end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @fsinterval&lt;&gt;1 set @time=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @ffactor=case @freqtype when 'day' then 0 else 1 end<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXEC msdb..sp_add_jobschedule @job_name=@jobname, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @name = '时间安排',<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_type=@ftype ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --1 一次,4 每天,8 每周,16 每月<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_interval=1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --重复执行次数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_subday_type=@fstype,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --是否重复执行<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_subday_interval=@fsinterval,&nbsp; --重复周期<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_recurrence_factor=@ffactor,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @active_start_time=@time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --早上03:00:00分执行<BR>&nbsp;&nbsp;&nbsp; ENDTEXT<BR>=NewProc('P_CreateJob')<BR>Endif<BR><BR><BR>均维软件工作室&nbsp; E-MAIL:&nbsp; WNAEFI_SZB@21CN.NET&nbsp; ， MSN：LXJANDYMW@HOTMAIL.COM<BR><BR><BR>2004-10-11 23:32:22&nbsp;&nbsp; 鲜花(0)&nbsp; 鸡蛋(0)&nbsp;&nbsp; <BR><BR>真爱无敌&nbsp;&nbsp;&nbsp; <BR>&nbsp; <BR>&nbsp; <BR>&nbsp; 头衔：娱乐无限<BR>&nbsp; 等级：贵宾<BR>&nbsp; 文章：5056<BR>&nbsp; 积分：5695<BR>&nbsp; 注册：2002-11-27<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第2楼 <BR><BR><BR><BR>从上述方法经我加工成自己的备份效果<BR><BR>此主题相关图片如下：<BR><BR><BR>此主题相关图片如下：<BR><BR><BR>一、下面部分是SQLSERVER上的存储过程部分<BR>*!*创建F_GetDbPath获取数据库目录的自定义函数<BR>cSQL="Select * from dbo.sysobjects where id = object_id(N'[dbo].[F_GetDbPath]') and xtype in (N'FN', N'IF', N'TF')"<BR>If SQLEXEC(LNConn,cSQL,'MyFunc')&lt;=0<BR>&nbsp;&nbsp; Messagebox('F_GetDbPath 函数检测失败!',64,gcMyCorp,2000)<BR>&nbsp;&nbsp; =ShowSqlError()<BR>ELSE<BR>&nbsp;&nbsp; Select MyFunc<BR>&nbsp;&nbsp; IF RECCOUNT()&lt;1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USE IN MyFunc<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TEXT TO CSQL NOSHOW<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create Function F_GetDbPath(@DbName sysname)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returns nvarchar(260)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @re nvarchar(260)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @DbName is null or db_id(@DbName) is null<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @re=rtrim(reverse(FileName)) from master..sysdatabases where name='master'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @re=rtrim(reverse(FileName)) from master..sysdatabases where name=@DbName<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @DbName is null<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @re=reverse(substring(@re,charindex('\',@re)+5,260))+'BACKUP\'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @re=reverse(substring(@re,charindex('\',@re),260))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(@re)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDTEXT<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If SQLEXEC(LNConn,cSQL)&lt;=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Messagebox('自定义F_GetDbPath函数创建失败!',64,gcMyCorp,2000)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =ShowSqlError()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp; Endif<BR>Endif<BR><BR>*!*创建P_BackupDb备份存储过程<BR>If !FoundProc('P_BackupDb')<BR>&nbsp;&nbsp; TEXT TO CSQL NOSHOW<BR>&nbsp;&nbsp;&nbsp;&nbsp; Create Procedure P_BackupDb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @DbName sysname='',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --要备份的数据库名称,不指定则备份当前数据库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @BkPath nvarchar(260)='',&nbsp; --备份文件的存放目录,不指定则使用SQL默认的备份目录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @BkFName nvarchar(260)='', --备份文件名,文件名中可以用\DbName\代表数据库名,\TIME\代表时间<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @BkType nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @AppendFile bit=1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --1追加/0覆盖备份文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @sql varchar(8000)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@DbName,'')='' set @DbName=db_name()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@BkPath,'')='' set @BkPath=dbo.F_GetDbPath(null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@BkFName,'')='' set @BkFName='_\DbName\.BAK'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @bkfname=replace(replace(@bkfname,'\DBNAME\',@dbname)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,'\Week\',cast(datepart(weekday,getdate())-1 as varchar(1)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @sql='backup '+case @BkType when 'LOG' then 'log ' else 'database ' end +@DbName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +' to disk='''+@BkPath+@BkFName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +''' with '+case @BkType when 'DF' then 'DIFFERENTIAL,' else '' end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +case @AppendFile when 1 then 'NOINIT' else 'INIT' end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print&nbsp; @sql<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec(@sql)<BR>&nbsp;&nbsp;&nbsp; ENDTEXT<BR>=NewProc('P_BackupDb')<BR>Endif<BR><BR>*!*创建P_RestoreDb恢复存储过程<BR>If !FoundProc('P_RestoreDb')<BR>&nbsp;&nbsp; TEXT TO CSQL NOSHOW<BR>&nbsp;&nbsp; Create Procedure P_RestoreDb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @bkfile nvarchar(1000),&nbsp;&nbsp;&nbsp; --定义要恢复的备份文件名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @DbName sysname='',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --定义恢复后的数据库名,默认为备份的文件名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @DbPath nvarchar(260)='',&nbsp; --恢复后的数据库存放目录,不指定则为SQL的默认数据目录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @ReType nvarchar(10)='DB', --恢复类型:'DB'完事恢复数据库,'DBNOR' 为差异恢复,日志恢复进行完整恢复,'DF' 差异备份的恢<BR>复,'LOG' 日志恢复<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @FileNumber int=1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --恢复的文件号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @OverExist bit=1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --是否覆盖已经存在的数据库,仅@ReType为<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @KillUser bit=1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --是否关闭用户使用进程,仅@overexist=1时有效<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @sql varchar(8000)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --得到恢复后的数据库名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@DbName,'')=''<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @sql=reverse(@bkfile)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@sql=case when charindex('.',@sql)=0 then @sql<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else substring(@sql,charindex('.',@sql)+1,1000) end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@sql=case when charindex('\',@sql)=0 then @sql<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else left(@sql,charindex('\',@sql)-1) end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@DbName=reverse(@sql)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; --得到恢复后的数据库存放目录<BR>&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@DbPath,'')='' set @DbPath=dbo.F_GetDbPath('')<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; --生成数据库恢复语句<BR>&nbsp;&nbsp;&nbsp;&nbsp; set @sql='Restore '+case @ReType when 'LOG' then 'log ' else 'database ' end+@DbName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +' from disk='''+@bkfile+''''<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +' with file='+cast(@FileNumber as varchar)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +case when @overexist=1 and @ReType in('DB','DBNOR') then ',replace' else '' end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +case @ReType when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end<BR>&nbsp;&nbsp;&nbsp;&nbsp; --添加移动逻辑文件的处理<BR>&nbsp;&nbsp;&nbsp;&nbsp; if @ReType='DB' or @ReType='DBNOR'<BR>&nbsp;&nbsp;&nbsp;&nbsp; begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --从备份文件中获取逻辑文件名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @lfn nvarchar(128),@tp char(1),@i int<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --创建临时表,保存获取的信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --从备份文件中获取信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into #tb exec('restore filelistonly from disk='''+@bkfile+'''')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare #f cursor for Select ln,tp from #tb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open #f<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch next from #f into @lfn,@tp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @i=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while @@fetch_status=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@DbName+cast(@i as varchar)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +case @tp when 'D' then '.mdf''' else '.ldf''' end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@i=@i+1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch next from #f into @lfn,@tp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close #f<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deallocate #f<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --关闭用户进程处理<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @overexist=1 and @killuser=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @spid varchar(20)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare #spid cursor for<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@DbName)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open #spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch next from #spid into @spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while @@fetch_status=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec('kill '+@spid)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch next from #spid into @spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close #spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deallocate #spid<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --恢复数据库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print&nbsp; @sql<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec(@sql)<BR>&nbsp;&nbsp;&nbsp; ENDTEXT<BR>=NewProc('P_RestoreDb')<BR>Endif<BR><BR>*!*创建P_CreateJob调度作业存储过程<BR>If !FoundProc('P_CreateJob')<BR>&nbsp;&nbsp; TEXT TO CSQL NOSHOW<BR>&nbsp;&nbsp;&nbsp;&nbsp; Create Procedure P_CreateJob<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @jobname varchar(100),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --作业名称<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @sql varchar(8000),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --要执行的命令<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @DbName sysname='',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --默认为当前的数据库名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freqtype varchar(6)='day', --时间周期,month 月,week 周,day 日<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @fsinterval int=1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --相对于每日的重复次数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @time int=030000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --开始执行时间,对于重复执行的作业,将从0点到23:59分<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isnull(@DbName,'')='' set @DbName=db_name()<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --创建作业<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec msdb..sp_add_job @job_name=@jobname<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --创建作业步骤<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec msdb..sp_add_jobstep @job_name=@jobname,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @step_name = '数据处理',<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @subsystem = 'TSQL',<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @database_name=@DbName,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @command = @sql,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @retry_attempts = 5, --重试次数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @retry_interval = 5&nbsp; --重试间隔<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --创建调度<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @ftype int,@fstype int,@ffactor int<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @ftype=case @freqtype when 'day' then 4<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; when 'week' then 8<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; when 'month' then 16 end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,@fstype=case @fsinterval when 1 then 0 else 8 end<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @fsinterval&lt;&gt;1 set @time=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @ffactor=case @freqtype when 'day' then 0 else 1 end<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXEC msdb..sp_add_jobschedule @job_name=@jobname, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @name = '时间安排',<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_type=@ftype ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --1 一次,4 每天,8 每周,16 每月<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_interval=1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --重复执行次数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_subday_type=@fstype,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --是否重复执行<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_subday_interval=@fsinterval,&nbsp; --重复周期<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @freq_recurrence_factor=@ffactor,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @active_start_time=@time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --早上03:00:00分执行<BR>&nbsp;&nbsp;&nbsp; ENDTEXT<BR>=NewProc('P_CreateJob')<BR>Endif<BR><BR><BR><BR><BR><BR>----------------------------------------------<BR><BR>均维软件工作室&nbsp; E-MAIL:&nbsp; WNAEFI_SZB@21CN.NET&nbsp; ， MSN：LXJANDYMW@HOTMAIL.COM<BR><BR><BR>2004-10-11 23:34:52&nbsp;&nbsp;&nbsp; <BR><BR>真爱无敌&nbsp;&nbsp;&nbsp; <BR>&nbsp; <BR>&nbsp; <BR>&nbsp; 头衔：娱乐无限<BR>&nbsp; 等级：贵宾<BR>&nbsp; 文章：5056<BR>&nbsp; 积分：5695<BR>&nbsp; 注册：2002-11-27<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第3楼 <BR><BR><BR><BR>二、下面是备份按钮的代码部分<BR><BR>Local lcSQL,llPass,lcMdfName,lcShare,lsCmd,lcObject,lcShareCmd<BR>If !ISCONN()<BR>Messagebox('数 据 库 连 接 不 成 功 !',64,'系统提示')<BR>Return<BR>Endif<BR>lcMdfName=Alltrim(READINI('CONNECT','DATABASE','&amp;EXEPATH.LXJ.INI'))<BR>lcObject=Alltrim(READINI('CONNECT','Server','&amp;EXEPATH.LXJ.INI'))<BR>If At('.',lcObject)&gt;0<BR>lcObject=GetHostName32(lcObject)&nbsp; &amp;&amp;转换IP地址对应的电脑名称<BR>Endif<BR>llPass=.T.<BR>Wait Window "正在备份 &amp;lcMdfName. 数据库，请稍候 ......&nbsp; " At Srows()/2-12,(Scol()-45)/2&nbsp; Nowait&nbsp; Noclear<BR>*!* P_BackupDb 参数说明<BR>*!*参数1: 要备份的数据库名称,不指定则备份当前数据库<BR>*!*参数2: 备份文件的存放目录,不指定则使用SQL默认的备份目录<BR>*!*参数3: 备份文件名,文件名中可以用\DBNAME\代表数据库名,\WEEK\代表星期<BR>*!*参数4: 备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份<BR>*!*参数5: 追加/覆盖备份文件<BR>*!*&nbsp; P_CreateJob 参数说明<BR>*!*参数1:作业名称<BR>*!*参数2:要执行的命令<BR>*!*参数3:sysname='' ,默认为当前的数据库名<BR>*!*参数4:varchar(6)='day',时间周期,month 月,week 周,day 日<BR>*!*参数5:int=1 ,相对于每日的重复次数<BR>*!*参数6:int=030000 ,开始执行时间,对于重复执行的作业,将从0点到23:59分<BR>SQLEXEC(NCONN,"Use Master")<BR>SQLEXEC(NCONN,[Execute sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'])&nbsp; &amp;&amp;添加xp_cmdshell扩展存储过程<BR>*!*判断 SQLSERVERAGENT 是否启动<BR>*!* IF SQLEXEC(NCONN,[Execute Master..xp_cmdshell 'Net Start '],'Tmp_Agent')&gt;0<BR>*!*&nbsp;&nbsp;&nbsp; SELECT Tmp_Agent<BR>*!* ENDIF<BR>SQLEXEC(NCONN,[Execute Master..xp_cmdshell 'Net Start SQLSERVERAGENT'])&nbsp;&nbsp; &amp;&amp;启动SQL SERVER 代理服务<BR>SQLEXEC(NCONN,"Use &amp;lcMdfName.")<BR>lsCmd=[Declare&nbsp; @lcFileName as varchar(30)]<BR>lsCmd=lsCmd+CHR(13)+CHR(13)+[Set @lcFileName='&amp;lcMdfName._W'+Cast(Datepart(Weekday,Getdate())-1 as varchar(1))]<BR>lsCmd=lsCmd+CHR(13)+CHR(13)+[Backup Database&nbsp; &amp;lcMdfName.&nbsp; To disk = @lcFileName with INIT]<BR>If Thisform.OPADDRESS.value=1<BR>&nbsp; **************************************** 在服务器上备份<BR>&nbsp;&nbsp; *!*每天一次完整备份(按周轮换)<BR>Wait Window "正在备份生成每天一个 &amp;lcMdfName. 更新数据库，请稍候 ......&nbsp; " At Srows()/2-12,(Scol()-60)/2&nbsp; Nowait&nbsp; Noclear<BR>If SQLEXEC(NCONN,"Execute P_BackupDb ?lcMdfName,'','\DbName\_W\WEEK\','DB',0 ")&lt;1<BR>&nbsp; Messagebox('数据库每天完整备份失败！',64,gcMyCorp,3500)<BR>&nbsp; llPass=.F.<BR>Endif<BR><BR>SQLEXEC(NCONN,[Execute MSDB..Sp_Delete_Job @job_name ='&amp;lcMdfName.每天备份'])<BR>lcSQL=[Execute P_CreateJob '&amp;lcMdfName.每天备份',?lsCmd,'','day',1,030000]<BR>If SQLEXEC(NCONN,lcSQL)&lt;1<BR>&nbsp; Messagebox('每天自动完整备份作业创建失败！',64,gcMyCorp,3000)<BR>&nbsp; llPass=.F.<BR>Else<BR>&nbsp; lcSQL=[Execute MSDB..Sp_Apply_Job_To_Targets @job_name = '&amp;lcMdfName.每天备份',@target_servers='&amp;lcObject.',&nbsp; @operation = <BR>'APPLY']<BR>&nbsp; SQLEXEC(NCONN,lcSQL)<BR>Endif<BR><BR>*!*每4小时一次完整备份<BR>Wait Window "正在备份生成每4小时一个 &amp;lcMdfName. 更新数据库，请稍候 ......&nbsp; " At Srows()/2-12,(Scol()-62)/2&nbsp; Nowait&nbsp; Noclear<BR>If SQLEXEC(NCONN,"Execute P_BackupDb ?lcMdfName,'','\DbName\_4H','DB',0 ")&lt;1<BR>&nbsp; Messagebox('数据库每4小时一次完整备份失败！',64,gcMyCorp,3500)<BR>&nbsp; llPass=.F.<BR>Endif<BR><BR>SQLEXEC(NCONN,[Execute MSDB..Sp_Delete_Job @job_name ='&amp;lcMdfName.每4小时备份'])<BR>lsCmd=[Backup Database &amp;lcMdfName. to disk='&amp;lcMdfName._4H' with INIT]<BR>lcSQL=[Execute P_CreateJob '&amp;lcMdfName.每4小时备份',?lsCmd,'','day',4 ]<BR>If SQLEXEC(NCONN,lcSQL)&lt;1<BR>&nbsp; Messagebox('每4小时自动完整备份作业创建失败！',64,gcMyCorp,3000)<BR>&nbsp; llPass=.F.<BR>Else<BR>&nbsp; lcSQL=[Execute MSDB..Sp_Apply_Job_To_Targets @job_name = '&amp;lcMdfName.每4小时备份',@target_servers='&amp;lcObject.',&nbsp; @operation <BR>= 'APPLY']<BR>&nbsp; SQLEXEC(NCONN,lcSQL)<BR>Endif<BR>Else<BR>&nbsp;&nbsp;&nbsp; **************************************** 从远程服务器备份到本机上<BR>lcShare=Alltrim(Thisform.BAKPATH.value)<BR>lcShare=Iif(Right(lcShare,1)='\',Left(lcShare,Len(lcShare)-1),lcShare)<BR>If !Directory("&amp;lcShare.")<BR>&nbsp; Md &amp;lcShare.<BR>Endif<BR>&nbsp;&nbsp;&nbsp; *!*第一步: 建立共享文件夹<BR>&nbsp;&nbsp;&nbsp; lcShareCmd="Net Share MyShare=&amp;lcShare."<BR>&nbsp;&nbsp;&nbsp; Winexec(lcShareCmd,0)<BR>&nbsp;&nbsp;&nbsp; *!*第二步: 建立共享信用关系<BR>&nbsp;&nbsp;&nbsp; SQLEXEC(NCONN,"Use Master")<BR>&nbsp;&nbsp;&nbsp; lcShareCmd=[Execute Master..xp_cmdshell&nbsp; 'Net Use&nbsp; Z:&nbsp; /Delete]<BR>&nbsp;&nbsp;&nbsp; SQLEXEC(NCONN,lcShareCmd)<BR>&nbsp;&nbsp;&nbsp; lcShareCmd=[Execute Master..xp_cmdshell&nbsp; 'Net Use&nbsp; Z:&nbsp; \\]+ALLTRIM(Getenv("COMPUTERNAME"))+'\MyShare&nbsp; <BR>'+Thisform.TxtSharePass.value+'&nbsp; /user:'+Thisform.TxtShareUser.value+[']<BR>&nbsp;&nbsp;&nbsp; SQLEXEC(NCONN,lcShareCmd)<BR>&nbsp;&nbsp;&nbsp; *!*第三步:备份数据库<BR>If&nbsp; Upper(lcObject)!=Upper(Getenv("COMPUTERNAME"))<BR>&nbsp; lcShare='\\'+Getenv("COMPUTERNAME")+'\MyShare\'<BR>&nbsp; lcShare='Z:\'<BR>&nbsp;&nbsp;&nbsp; ELSE<BR>&nbsp; lcShare=lcShare+'\'<BR>Endif<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; *!*每天一次完整备份(按周轮换)<BR>Wait Window "正在备份生成每天一个 &amp;lcMdfName. 更新数据库，请稍候 ......&nbsp; " At Srows()/2-12,(Scol()-60)/2&nbsp; Nowait&nbsp; Noclear<BR>If SQLEXEC(NCONN,"Execute P_BackupDb ?lcMdfName,'&amp;lcShare.','\DbName\_W\WEEK\','DB',0 ")&lt;1<BR>&nbsp; Messagebox('数据库每天完整备份失败！',64,gcMyCorp,3500)<BR>&nbsp; llPass=.F.<BR>Endif<BR><BR>SQLEXEC(NCONN,[Execute MSDB..Sp_Delete_Job @job_name ='&amp;lcMdfName.每天备份'])<BR>lcSQL=[Execute P_CreateJob '&amp;lcMdfName.每天备份',?lsCmd,'','day',1,030000]<BR>If SQLEXEC(NCONN,lcSQL)&lt;1<BR>&nbsp; Messagebox('每天自动完整备份作业创建失败！',64,gcMyCorp,3000)<BR>&nbsp; llPass=.F.<BR>Else<BR>&nbsp; lcSQL=[Execute MSDB..Sp_Apply_Job_To_Targets @job_name = '&amp;lcMdfName.每天备份',@target_servers='&amp;lcObject.',&nbsp; @operation = <BR>'APPLY']<BR>&nbsp; SQLEXEC(NCONN,lcSQL)<BR>Endif<BR><BR>&nbsp;&nbsp;&nbsp; *!*每4小时一次完整备份<BR>Wait Window "正在备份生成每4小时一个 &amp;lcMdfName. 更新数据库，请稍候 ......&nbsp; " At Srows()/2-12,(Scol()-62)/2&nbsp; Nowait&nbsp; Noclear<BR>If SQLEXEC(NCONN,"Execute P_BackupDb ?lcMdfName,'&amp;lcShare.','\DbName\_4H','DB',0 ")&lt;1<BR>&nbsp; Messagebox('数据库每4小时一次完整备份失败！',64,gcMyCorp,3500)<BR>&nbsp; llPass=.F.<BR>Endif<BR><BR>SQLEXEC(NCONN,[Execute MSDB..Sp_Delete_Job @job_name ='&amp;lcMdfName.每4小时备份'])<BR>lsCmd=[Backup Database &amp;lcMdfName. to disk='&amp;lcMdfName._4H' with INIT]<BR>lcSQL=[Execute P_CreateJob '&amp;lcMdfName.每4小时备份',?lsCmd,'','day',4 ]<BR>If SQLEXEC(NCONN,lcSQL)&lt;1<BR>&nbsp; Messagebox('每4小时自动完整备份作业创建失败！',64,gcMyCorp,3000)<BR>&nbsp; llPass=.F.<BR>Else<BR>&nbsp; lcSQL=[Execute MSDB..Sp_Apply_Job_To_Targets @job_name = '&amp;lcMdfName.每4小时备份',@target_servers='&amp;lcObject.',&nbsp; @operation <BR>= 'APPLY']<BR>&nbsp; SQLEXEC(NCONN,lcSQL)<BR>Endif<BR>&nbsp;&nbsp;&nbsp; *!*第四步: 删除共享文件夹<BR>&nbsp;&nbsp;&nbsp; lcShareCmd=[Execute Master..xp_cmdshell&nbsp; 'Net Use&nbsp; Z: /Delete]<BR>&nbsp;&nbsp;&nbsp; SQLEXEC(NCONN,lcShareCmd)<BR>&nbsp;&nbsp;&nbsp; lcShareCmd="Net Share MyShare /Delete "<BR>&nbsp;&nbsp;&nbsp; Winexec(lcShareCmd,0)<BR>Endif<BR><BR>SQLEXEC(NCONN,"Use &amp;lcMdfName.")<BR>Wait Clear<BR>If&nbsp; llPass=.F.<BR>Messagebox('遗 憾 ! 部 分 备 份 操 作 失 败 !',16,gcMyCorp)<BR>Else<BR>Messagebox('恭 喜 ! 数 据 库 备 份 完 毕 !',64,gcMyCorp)<BR>Endif<BR><BR>三、下面是恢复备份部分代码<BR>Local lcSQL,llPass,lcMdfName,lcShare,lcFile,lcShareCmd,lcObject<BR>If !ISCONN()<BR>Messagebox('数 据 库 连 接 不 成 功 !',64,'系统提示')<BR>Return<BR>Endif<BR>lcMdfName=Alltrim(READINI('CONNECT','DATABASE','&amp;EXEPATH.LXJ.INI'))<BR>lcObject=Alltrim(READINI('CONNECT','Server','&amp;EXEPATH.LXJ.INI'))<BR>If At('.',lcObject)&gt;0<BR>lcObject=GetHostName32(lcObject)&nbsp; &amp;&amp;转换IP地址对应的电脑名称<BR>Endif<BR>llPass=.T.<BR>Wait Window "正在恢复 &amp;lcMdfName. 数据库，请稍候 ......&nbsp; " At Srows()/2-12,(Scol()-50)/2&nbsp; Nowait&nbsp; Noclear<BR>*!* P_RestoreDb 参数说明<BR>*!*参数1: nvarchar(1000), 定义要恢复的恢复文件名<BR>*!*参数2: sysname='', 定义恢复后的数据库名,默认为恢复的文件名<BR>*!*参数3: nvarchar(260)='', 恢复后的数据库存放目录,不指定则为SQL的默认数据目录<BR>*!*参数4: nvarchar(10)='DB', 恢复类型:'DB'完事恢复数据库,'DBNOR' 为差异恢复,日志恢复进行完整恢复,'DF' 差异恢复的恢复,'LOG' 日<BR>志恢复<BR>*!*参数5: int=1, 恢复的文件号<BR>*!*参数6: bit=1, 是否覆盖已经存在的数据库,仅@retype为DB<BR>*!*参数7: bit=1, 是否关闭用户使用进程,仅@overexist=1时有效<BR>=SQLEXEC(NCONN,"Use Master")<BR>If Thisform.OPADDRESS.value=1<BR>Do Case<BR>&nbsp; Case Thisform.MyFileName.value=1<BR>&nbsp;&nbsp; lcSQL=[EXEC P_RestoreDb &amp;lcMdfName._4H,'&amp;lcMdfName.','','DB' ]<BR>&nbsp; Case Thisform.MyFileName.value=8<BR>&nbsp;&nbsp; lcSQL=[EXEC P_RestoreDb &amp;lcMdfName._W0,'&amp;lcMdfName.','','DB' ]<BR>&nbsp; Otherwise<BR>&nbsp;&nbsp; lcSQL=[EXEC P_RestoreDb &amp;lcMdfName._W]+STR(Thisform.MyFileName.value-1,1)+[,'&amp;lcMdfName.','','DB' ]<BR>Endcase<BR>If SQLEXEC(NCONN,lcSQL)&lt;1<BR>&nbsp; llPass=.F.<BR>&nbsp; SHOWSQLERROR()<BR>Endif<BR>Else<BR>lcShare=Alltrim(Thisform.BAKPATH.value)<BR>lcShare=Iif(Right(lcShare,1)='\',Left(lcShare,Len(lcShare)-1),lcShare)<BR>&nbsp;&nbsp;&nbsp; *!*第一步: 建立共享文件夹<BR>&nbsp;&nbsp;&nbsp; lcShareCmd="Net Share MyShare=&amp;lcShare."<BR>&nbsp;&nbsp;&nbsp; Winexec(lcShareCmd,0)<BR>&nbsp;&nbsp;&nbsp; *!*第二步: 建立共享信用关系<BR>&nbsp;&nbsp;&nbsp; lcShareCmd=[EXEC Master..xp_cmdshell 'Net Use&nbsp;&nbsp; \\]+Getenv("COMPUTERNAME")+'\MyShare '<BR>&nbsp;&nbsp;&nbsp; lcShareCmd=lcShareCmd+JmJm(ReadIni('CONNECT','LocalPass','&amp;ExePath.LXJ.INI'),1)+' /user:'+Alltrim(ReadIni<BR>('CONNECT','LocalUser','&amp;ExePath.LXJ.INI'))<BR>&nbsp;&nbsp;&nbsp; SQLEXEC(NCONN,lcShareCmd)<BR>&nbsp;&nbsp;&nbsp; *!*第三步:恢复数据库<BR>If&nbsp; Upper(lcObject)!=Upper(Getenv("COMPUTERNAME"))<BR>&nbsp; lcShare='\\'+Getenv("COMPUTERNAME")+'\MyShare'<BR>Endif<BR><BR>Do Case<BR>&nbsp; Case Thisform.MyFileName.value=1<BR>&nbsp;&nbsp; lcSQL=[EXEC P_RestoreDb &amp;lcMdfName._4H,'&amp;lcMdfName.','','DB' ]<BR>&nbsp;&nbsp; lcFile='&amp;lcShare.\&amp;lcMdfName._4H'<BR>&nbsp; Case Thisform.MyFileName.value=8<BR>&nbsp;&nbsp; lcSQL=[EXEC P_RestoreDb &amp;lcMdfName._W0,'&amp;lcMdfName.','','DB' ]<BR>&nbsp;&nbsp; lcFile='&amp;lcShare.\&amp;lcMdfName._W0'<BR>&nbsp; Otherwise<BR>&nbsp;&nbsp; lcSQL=[EXEC P_RestoreDb &amp;lcMdfName._W]+STR(Thisform.MyFileName.value-1,1)+[,'&amp;lcMdfName.','','DB' ]<BR>&nbsp;&nbsp; lcFile='&amp;lcShare.\&amp;lcMdfName._W'+STR(Thisform.MyFileName.value-1,1)<BR>Endcase<BR><BR>If !File(lcFile)<BR>&nbsp; llPass=.F.<BR>&nbsp; Messagebox('&amp;lcFile. 数据库备份文件不存在！',64,gcMyCorp,3000)<BR>Endif<BR>If llPass=.T.<BR>&nbsp; If SQLEXEC(NCONN,lcSQL)&lt;1<BR>&nbsp;&nbsp; llPass=.F.<BR>&nbsp;&nbsp; SHOWSQLERROR()<BR>&nbsp; Endif<BR>Endif<BR><BR>&nbsp;&nbsp;&nbsp; *!*第四步: 删除共享文件夹<BR>&nbsp;&nbsp;&nbsp; lcShareCmd="Net Share MyShare /Delete "<BR>&nbsp;&nbsp;&nbsp; Winexec(lcShareCmd,0)<BR><BR>Endif<BR>=SQLEXEC(NCONN,"Use &amp;lcMdfName.")<BR>Wait Clear<BR>If&nbsp; llPass=.F.<BR>Messagebox('遗 憾 ! 数 据 库 恢 复 操 作 失 败 !',16,gcMyCorp)<BR>Else<BR>Messagebox('恭喜! 数据库恢复完毕，请退出系统重新进入! ',64,gcMyCorp)<BR>Endif<BR>Quit<BR><BR><BR>上述方法经过测试发现备份到非服务器电脑上成功与否同网络上相关电脑的安全设置有很大影响，安全性高的就是给了用户名和密码也不能从<BR>服务器上备份成功（本人同一个程序在公司不同电脑上测试得到的结果，具体原因还不清楚，总之是部分电脑上能成功，部分不成功，用过<BR>RegFix进行安全处理的电脑基本不能异地备份），还有，电脑间的信任关系一定要在SQL SERVER中创建（在COMMAND方式创建的共享是不能成功<BR>备份的），否则也不能备份到远程电脑上。<BR><BR><BR>]]></description>
<pubDate>
2007-06-09 21:52:03.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,5276804.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,5276804.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[表格内快捷的输入特殊的字符]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,5116935.shtml</link>
<description>
<![CDATA[表格内快捷的输入特殊的字符！已经解决！<BR>在一表单的表格内，怎样才能用快捷的方式输入某些特殊的字符？如：♂♀⊙×♁等，当然是固定的几个！！<BR><BR>先建一个有返回值的菜单<BR>*rclick.prg<BR>LPARAMETERS m1,m2,m3,m4,m5 &amp;&amp; .....<BR><BR>DEFINE POPUP 快捷菜单 SHORTCUT RELATIVE FROM MROW(),MCOL()<BR>if type('m1')="C"<BR>DEFINE BAR 1 OF 快捷菜单 PROMPT m1<BR>ON SELECTION BAR 1 OF 快捷菜单 return m1<BR>endif<BR>if type('m2')="C"<BR>DEFINE BAR 2 OF 快捷菜单 PROMPT m2<BR>ON SELECTION BAR 2 OF 快捷菜单 return m2<BR>endif<BR>if type('m3')="C"<BR>DEFINE BAR 3 OF 快捷菜单 PROMPT m3<BR>ON SELECTION BAR 3 OF 快捷菜单 return m3<BR>endif<BR>if type('m4')="C"<BR>DEFINE BAR 4 OF 快捷菜单 PROMPT m4<BR>ON SELECTION BAR 4 OF 快捷菜单 return m4<BR>endif<BR>if type('m5')="C"<BR>DEFINE BAR 5 OF 快捷菜单 PROMPT m5<BR>ON SELECTION BAR 5 OF 快捷菜单 return m5<BR>endif<BR><BR>*.........<BR><BR>ACTIVATE POPUP 快捷菜单<BR><BR>在text的rightclick中写<BR>aa=rclick('♂','♀','⊙','×','♁')<BR>if type('aa')='C'<BR>&nbsp; keyb aa<BR>endif<BR>可以将text做成类,在表格生成后把原来列中的text删除,用新的text类加到表格的列中<BR>]]></description>
<pubDate>
2007-06-06 19:30:46.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,5116935.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,5116935.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[SQL SERVER 表自增量字段重置]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,5116498.shtml</link>
<description>
<![CDATA[<BR><BR>方法1&nbsp; -- 清空已有数据，并且将自增自段恢复从1开始计数<BR>truncate table 表名&nbsp; <BR><BR>方法2&nbsp; -- 不清空已有数据，但将自增自段恢复从1开始计数<BR>dbcc checkident(表名,RESEED,0)<BR>]]></description>
<pubDate>
2007-06-06 19:16:59.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,5116498.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,5116498.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[如何获得刚插入数据库的记录的ID号?]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,5039852.shtml</link>
<description>
<![CDATA[<PRE class=9t>如何获得刚插入数据库的记录的ID号?


1.SQL Server
  对于SQL Server 2000来说，它提供了两个全新的函数(IDENT_CURRENT,SCOPE_IDENTITY),并且改进了@@IDENTITY的不足.当你插入新记
录后，可以调用函数:
    PRINT IDENT_CURRENT('table') '这将获得新的IDENTITY值，不管数据库中是不是有记录添加(这就避免了@@IDENTITY的连接限制)
    或者：PRINT SCOPE_IDENTITY() '这将获得在当前存储过程，触发器等其他程序创建的最新记录的IDENTITY值.
  而全局变量@@IDENTITY有一个问题，当对一张表执行insert时，如果该表有触发器程序在执行插入操作，然后，接着在另一张表中插入
记录，这样返回@@IDENTITY值就是第二张表的IDENTITY值。
  如果你用的不是SQL Server 2000，你最好一个简单的存储过程来解决这个问题。
CREATE PROCEDURE myProc 
    @param1 INT 
AS 
BEGIN 
    SET NOCOUNT ON 
    INSERT INTO someTable 
    ( 
        intField 
    ) 
    valueS 
    ( 
        @param1 
    ) 
    SET NOCOUNT OFF 
    SELECT NEWID = @@IDENTITY 
END 
在ASP中你可以这样做:
&lt;% 
    fakevalue = 5 
    set conn = Server.CreateObject("ADODB.Connection") 
    conn.open "&lt;conn string&gt;" 
    set rs = conn.execute("exec myProc @param1=" &amp; fakevalue) 
    response.write "New ID was " &amp; rs(0) 
    rs.close: set rs = nothing 
    conn.close: set conn = nothing 
%&gt;

2.Access 
  对于Access,你可以用下面这样的方法：
&lt;% 
    fakevalue = 5 
    set conn = Server.CreateObject("ADODB.Connection") 
    conn.open "&lt;conn string&gt;" 
    conn.execute "Insert into someTable(intField) values(" &amp; fakevalue &amp; ")" 
    set rs = conn.execute("select MAX(ID) from someTable") 
    response.write "New ID was " &amp; rs(0) 
    rs.close: set rs = nothing 
    conn.close: set conn = nothing 
%&gt;
  然而对于多人同时向数据库中添加数据，我们就要利用记录集的adOpenKeyset游标来防止出错。例如下面的例子:
&lt;% 
    fakevalue = 5 
    set conn = Server.CreateObject("ADODB.Connection") 
    conn.open "&lt;conn string&gt;" 
    set rs = Server.CreateObject("ADODB.Recordset") 
    rs.open "select [intField] from someTable where 1=0", conn, 1, 3 
    rs.AddNew 
    rs("intField") = fakevalue 
    rs.update 
    response.write "New ID was " &amp; rs("id") 
    rs.close: set rs = nothing 
    conn.close: set conn = nothing 
 
</PRE>]]></description>
<pubDate>
2007-06-04 08:30:28.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,5039852.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,5039852.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[在表单创建时释放表单(VFP)]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,4933479.shtml</link>
<description>
<![CDATA[&nbsp;在表单的 init 中如果想要退出表单 加 This.release&nbsp;&nbsp; ， release Thisform&nbsp; 是没有反应的。以前一直是在调用表单前进行判断是否运行表单， 在网上搜索发现可以加上 return .F.&nbsp; 可以实现。<BR>例 ：在表单的 init 中可以这样<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;&nbsp;条件不符<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; release Thisform&nbsp;&nbsp;&amp;&amp;&nbsp; 我试着删除此句，也能达到效果<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>RETURN .F.</STRONG>&nbsp;&nbsp; &amp;&amp; 这句一定要<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endif<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; ]]></description>
<pubDate>
2007-05-31 10:34:00.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,4933479.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,4933479.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[心情很不爽]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,4859849.shtml</link>
<description>
<![CDATA[&nbsp;刚做好的一个表单不知为何不见了， 用恢复软件也找不到啦，一个上午白忙活了。 苦啊 ！&nbsp;]]></description>
<pubDate>
2007-05-30 14:02:10.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,4859849.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,4859849.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[广告满天飞]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,4849528.shtml</link>
<description>
<![CDATA[&nbsp;&nbsp; 早上习惯性的打开链接，发现画面与以往有些不同。 有些字变蓝了，且有下划线，鼠标移到上面显示出 当当网，clickeye&nbsp; 之类的东东，不仅标题栏有，而且内容中也有。真是晕死了。 想上论坛反应此情况发现已有博友对此提出了搞议。真是搞不懂 为什么要搞那么多广告中！！？？？]]></description>
<pubDate>
2007-05-30 09:52:35.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,4849528.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,4849528.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[终于搞好了电脑与电视相联]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,4787226.shtml</link>
<description>
<![CDATA[　　开心，终于搞定了电脑与电视机相联问题。　现在可以在电视机上放电影，同时上网两不误了。<BR>注：　播放器用　ＫＭＰlayer,&nbsp;&nbsp;如果用　超霸10, 暴风影音 播放时，在最小化时，电视机上的输出会停止，用 KMPlayer 就不会。]]></description>
<pubDate>
2007-05-29 00:24:54.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,4787226.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,4787226.shtml#comment</comments>
</item>
<item>
<blogcn_uid>
<![CDATA[366807]]></blogcn_uid>
<title>
<![CDATA[VFP错误捕获处理程序]]></title>
<link>
http://jiangxixfwan.blogcn.com/diary,4749989.shtml</link>
<description>
<![CDATA[<PRE class=9t>******************************
*错误捕获处理程序
*  geterror.prg
*  调用方式： on error do geterror
*****************************
MESSAGEBOX("计算机名称:"+SYS(0)+CHR(13)+;
   "错误号:"+STR(ERROR())+CHR(13)+;
           "出错信息:"+MESSAGE()+CHR(13)+;   
           "出错的程序名:"+PROGRAM()+CHR(13)+;   
           "出错的程序行号:"+STR(LINENO())+CHR(13)+;    
           "出错的程序代码:"+ MESSAGE(1)+CHR(13)+CHR(13)+;
           "请根据系统以上错误信息修正系统!",; 
           0+48,;
           "警告信息:系统出现以下错误,需要终止运行!")
QUIT
****程序结束
 
</PRE>]]></description>
<pubDate>
2007-05-28 00:07:07.0</pubDate>
<guid>
http://jiangxixfwan.blogcn.com/diary,4749989.shtml</guid>
<comments>
http://jiangxixfwan.blogcn.com/diary,4749989.shtml#comment</comments>
</item>
</channel>
</rss>