<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://feeds.qzone.qq.com/rss.xsl" version="1.0"?>
<rss version="2.0" xmlns:qz="http://qzone.qq.com">
<channel>
<title><![CDATA[.～]]></title>
<description><![CDATA[未来不是梦]]></description>
<link>http://51566219.qzone.qq.com</link>
<lastBuildDate>Thu, 26 Nov 2009 11:44:15 GMT</lastBuildDate>
<generator>Qzone</generator>
<language>zh-cn</language>
<copyright>Copyright (C), 2005-2008, Tencent Tech. Co., Ltd.</copyright>
<pubDate>Wed, 11 Nov 2009 15:53:41 GMT</pubDate>

<item>
<title><![CDATA[程序员前端技术]]></title>
<link>http://51566219.qzone.qq.com/blog/1257954821</link>
<description><![CDATA[在国内，“前端开发”这个名词逐步被熟知，“前端开发”这个职位越来越被企业重视，表明国内的Web前端开发正在慢慢走向成熟，更好地学习提高自身的前端开发技术能力是必须的，整理8个国内优秀的前端开发设计网站给大家，也希望能看到你推荐的中文前端开发网站和社区。 <br>1, 蓝色理想 <br><a href="http://www.blueidea.com/" target="_blank">http://www.blueidea.com/</a><wbr /> <br><br>诞生于1999年10月的蓝色理想，以建设网站设计与开发人员之家为宗旨，以介绍网络开发技术与网站创作设计交流为主要内容，是国内最大的设计类站点之一。 <br><br>2, W3School <br><a href="http://www.w3school.com.cn/index.html" target="_blank">http://www.w3school.com.cn/index.html</a><wbr /> <br><br>W3School是最完善的在线教程站，包括 XHTML教程、XML教程JavaScript &amp; AJAX、网站构建等前端开发人员必备的系统性学习教材。 <br><br>3, 前端观察 <br><a href="http://www.qianduan.net/" target="_blank">http://www.qianduan.net/</a><wbr /> <br><br>前端观察是一个纯粹的前端技术分享网站，本站的目的是为前端技术人员提供所需的资讯及资源，挖掘国内优秀的原创设计及内容，加以高度的整理。 <br><br>4, CSS88 <br><a href="http://www.css88.com/" target="_blank">http://www.css88.com/</a><wbr /> <br><br>CSS88专注前端开发，关注用户体验，是一个资深的Web前端开发站，不仅传播前端技术，更重要的是关注前端设计从业者的生存状态，有多个开放的前端交流群。 <br><br>5, CssRain <br><a href="http://www.cssrain.cn/" target="_blank">http://www.cssrain.cn/</a><wbr /> <br><br>CssRain实用的前端技术信息，原创和搜集前端开发中细节的内容，一本jQuery新书推荐&lt;&lt;锋利的jQuery&gt;&gt;你值得拥有。 <br><br>6, 我爱CSS <br><a href="http://www.52css.com/" target="_blank">http://www.52css.com/</a><wbr /> <br><br>我爱CSS，致力于Web标准在中国的应用和发展，提供CSS和XHTML学习教程。 <br><br>7, iJavaScript <br><a href="http://www.ijavascript.cn/" target="_blank">http://www.ijavascript.cn/</a><wbr /> <br><br>iJavaScript致力于JavaScript信息的共享，提供JavaScript基础教程、AJAX技术及JavaScript框架的学习和应用。 <br><br>8, OKAJAX <br><a href="http://www.okajax.com/" target="_blank">http://www.okajax.com/</a><wbr /> <br><br>OKAJAX是以ajax技术为主，涉及网站建设、网络编程、网页设计、网页特效、服务器技术、资源下载等的综合性网站。 <br> <br><br>这是个人的一些整理分享，如果还有你认为非常优秀的前端开发设计资源类网站没有出现在列表中，请留言告诉我，我会及时地对此进行补充。<br><br><span style="text-decoration:underline;"><wbr /><span style="color:#810081;line-height:1.8em;">-------</span><wbr /></span><wbr /><br><a href="http://www.open-lib.com" target="_blank">http://www.open-lib.com</a><wbr /><br><a href="http://bbs.51js.com/" target="_blank">http://bbs.51js.com/</a><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[asp.net]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1257954821#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Wed, 11 Nov 2009 15:53:41 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1257954821</guid>
</item>

<item>
<title><![CDATA[拿到一个Dell的本本，发现网卡的mac地址不能修改，今天终于在网上找到更改的方法了，拿出来与大家分享。]]></title>
<link>http://51566219.qzone.qq.com/blog/1256870069</link>
<description><![CDATA[<br>拿到一个Dell的本本，发现网卡的mac地址不能修改，今天终于在网上找到更改的方法了，拿出来与大家分享。<br>装好驱动后打开注册表（不要说不知道怎么打开，可以运行regedit）。<br>1 、在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000 、 0001 、 0002 等主键下，查找 DriverDesc ，内容为你要修改的网卡的描述，如“ Realtek RTL8029(AS)-based PCI Ethernet Adapter ”。 <br>2 、在其下，添加一个字符串，命名为 NetworkAddress ，其值设为你要的 MAC 地址（注意地址还是连续写）。如： 00E0DDE0E0E0 。 <br>3 、然后到其下 Ndi\params 中添加一项名为 NetworkAddress 的主键，在该主键下添加名为 default 的字符串，其值是你要设的 MAC 地址，要连续写，如： 000000000000 。（实际上这只是设置在后面提到的高级属性中的“初始值”，实际使用的 MAC 地址还是取决于在第 2 点中提到的 NetworkAddress 参数，这个参数一旦设置后，以后高级属性中的值就是 NetworkAddress 给出的值而非 default 给出的了。） <br>4 、在 NetworkAddress 的主键下继续添加名为 ParamDesc 的字符串，其作用为指定 NetworkAddress 主键的描述，其值可自己命名，如“ Network Address ”，这样在网卡的高级属性中就会出现 Network Address 选项，就是你刚在注册表中加的新项 NetworkAddress ，以后只要在此修改 MAC 地址就可以了。继续添加名为 Optional 的字符串，其值设为“ 1 ”，则以后当你在网卡的高级属性中选择 Network Address 项时，右边会出现“不存在”选项。 <br>5 、重新启动你的计算机，打开网络邻居的属性，双击相应网卡项会发现有一个 Network Address 的高级设置项，可以用来直接修改 MAC 地址或恢复原来的地址。 <!--v:3.2--> ]]></description>
<category><![CDATA[系统故障]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1256870069#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Fri, 30 Oct 2009 02:34:29 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1256870069</guid>
</item>

<item>
<title><![CDATA[[转]高房价让80后成为最没志气的一代？]]></title>
<link>http://51566219.qzone.qq.com/blog/1255914517</link>
<description><![CDATA[<span style="font-family:'Times';line-height:1.8em;"> <br>        近段时间，房价迅速回升，房子又成了普通百姓的热门话题。近日，有网友发帖《房子让80后成为垮掉的一代》，直言在高房价下很多80后的抱负只是尽快拥有一套房子，因为房地产，80后沦落为最没有志气的一代。无独有偶，在某网论坛，也有网友发帖《姐妹们，把没房的男人当垃圾般扔掉》，直指30岁以上的未购房者，由此引发一场关于80后的房子与爱情的论战。高房价让初涉社会的80后无所适从，也让他们背上了没有志气的骂名。<br>        作为一个混迹网络的农村80后，我已经不问江湖，远离纷争。因为在我看来生活是最实在的，生存是最现实的。具体点说就是奋斗，先有车有房，体体面面地活着。否则，你跑出来到网上来跟人讲人生，谈理想。那无异于孔乙己在咸亨酒店里教别人“茴”字的五种写法，然后讨一碗酒喝。我们没有赶上改革开放初期，遍地黄金的好时代，我们就辛辛苦苦、兢兢业业地过好自己的日子，买房子买车。这就是为和谐社会做贡献了。<br>        为什么还有人跑出来指手画脚，说80后是最无志气的一代。何为志气？志气就是身陷困境不屈不挠，志气就是穷则独善其身，不依不靠。房价高了，我们想弄套房子，成家立业，就是目光短浅？没有志气。那好，我们都住进北京的地下室里去写诗歌、谈理想。然后走火入魔，卧轨跳楼就是有志气？或者跑到大街上呼吁自由，要求民主。这就是志气？如果谁认为自己有志气，就去大街上给我们示范一下。<br>        说80后没志气的另一个论据是80后啃老。这个问题确实存在，但是毕竟是一部分，甚至是一小部分。啃老很好，但是也要有得啃才行，农村出来的80后去哪里啃老，他们的父母一听说城里的房子动辄上百万一套，估计都要掰着手指头算一算几辈子才能赚够这个数。难道有人相信中国的广大农村已经奔小康了？农村出来的80后养老是很辛苦的，不要再说他们啃老了。这样下车伊始的话说出来就是脑子进水了，而且进的还是开水。退一步讲，也有啃老族。这是事实，但是不要觉得这是多么不可思议的事情。比尔盖茨真的把自己的钱全捐出去，让自己的儿子跟平民一样出去打工，你信么？老子帮儿子是天经地义的事情。80后大学毕业的时候已经二十三四，刚在职场上混出个道道，就要买房结婚。凭什么让我们短短两三年赚够一百万，这个时代，我们又拿什么赚够一百万，这个时候如果家里有条件，帮一点有何不可？60后、70后不是喝娘奶长大的？不是在父母的扶持下成长起来的？时代不同了，家庭帮助的方式也不一样而已。    <br>一代人有一代人的气质，一代人有一代人的人生追求和生活方式。时代变了，如果还是站在过去，硬生生地拿80后和60后、70后比，戴着有色眼镜苛刻地批评80后这个庞大的群体，那就是刻舟求剑，缘木求鱼。有人说80后是独生子女，娇生惯养。其实也就是没怎么挨饿而已。上世纪80年代到90年代中期，中国发展很快，但也并不是家家富有，天天吃肉。在特殊历史时期，挨点饿不能成为某些人对80后指手画脚的理由，况且独生子女的80后也有他们的难处和困惑，在家里缺少同龄人的交流，走向社会缺少手足兄弟的帮助。看问题需要辩证。这是中国哲学的命脉，可惜很多人总是对别人马列主义，对自己自由主义。<br>     网上流传这样一段话，我觉得是80后的真实写照：我们读小学的时候，读大学不要钱；我们要读大学的时候，读小学不要钱；我们还没能工作的时候，工作是分配的；我们可以工作的时候，找工作是要拼得头破血流的；我们不能挣钱的时候，房子是分配的；我们能挣钱的时候，却发现房子已经买不起了；我们没有进入股市的时候，傻瓜都在赚钱；我们兴冲冲地闯进去的时候，才发现自己成了傻瓜；当我们不到结婚年龄的时候骑单车就能娶媳妇；当我们到了结婚年龄的时候无房无车是不能娶老婆的；我们没生娃的时候，别人是可以生一打的；我们要生娃的时候，多生一个就要接扎的。<br>谁能否定这些现实？个体是在历史的背景下是渺小的，多数人都是沧海一粟。一个幸福成功的人生，与个人的能力和品质息息相关，但同样必须受限于时代。更何况每个时代都有它的评价标准。如果有人说，80后应该面对高价房，不依不靠，自力更生，赚钱买房，然后，奉献社会。这就是有志气的80后，那我想问，难道我们不正在这样做么？高价房下，我们不正在为个人的幸福，为拉动中国GDP的增长而努力工作着么？如果有人说80后应该胸怀祖国，奔赴前线，为祖国统一大业而奋斗，老大没发话，你怎么知道国家需要的时候，我们不会去做？国庆阅兵式上那威武的身姿，90%是80后揶！？<br>      听着《中国心》长大的人未必就比听《双节棍》的人有责任感，乌鸦也不能因为屁股上有一撮白毛就笑话猪“黑”，当我们“80后”在办公室夜以继日地加班的时候，小有成就的“60后”“70后”却腆着微微隆起的肚子，夹着小皮包，开着轿车，穿梭流连于灯红酒绿之中，批评我们感情脆弱，爱情堕落的时候，自己却沉醉于“小蜜”的温柔之乡，或者上演“二奶传说”。当你们说我们能力低下的时候，却忘了自己蹒跚学步时其实也挺可爱。为什么不认为我们也很可爱呢？ <br>        社会对“80后”的认识一直存在巨大误解，这种误解不仅表现在对问题本身认识的片面化，还表现在对80后主体认识的模糊化。 正如中国改革开放后，农村和城市发展不同步一样。农村80后和城市80后的人生历程也有着巨大的差别。具体表现在以下几点： <br>　     一、农村的“８０后”并不是传说中“娇生惯养”的独生子女，相反，我们大多是父母与“计划生育政策”抗争的产物，我们一生下来，父母就给政府交了一笔不菲的“超生费”，从此拉开了“欠债还钱”的序幕，虽说８０年代农村已经实行家庭生产承包责任制，温饱基本解决。但是，我们一直都在贫困线上挣扎，直到现在，也没有大的改观。事实上，中国的农村，从７０年代末８０年代初实现了第一次飞跃之后，一直裹足不前。相信那些生活在东北、西北、西南地区农村的８０后定有同感。相反，８０年代以后，中国在城市所进行的改革却一浪高过一浪，城市实现了数次飞跃，在这种巨变中，生活在城市里的８０后确实如媒体所言，独生独食催生了自私，父母的娇惯导致其能力低下，承受能力极差等等。但我并不认为农村的８０后存在这些问题。 <br>　     二、农村的８０后注定成为过渡的一代，父辈们挖地三尺，脱裤子当袄供应我们读完大学，（当然，没上大学的加入棒棒军，比我们更惨）一毕业，就面临就业困难，当城里的８０后依靠着父母的关系轻而易举地找到工作时，我们农村的８０后还抱着一沓简历在不属于自己的城市里一次又一次地碰壁。 <br>　     三、农村的８０后注定生命是残缺的，注定会有遗憾，我们好不容易找到一份稳定工作，让父母来城里住几天成为我们又一个人生愿望。我们被迫无休止地跳槽，无休止地加班，当我们终于荣幸地成为房的时候，我们的父母要么撒手西去，要么年老力竭，成为我们一生的遗憾。而城市里的８０后却可以从父母那里得到一笔首付款，很快成为有房一族。并且志高气昂地与我们争夺漂亮妹妹。   <br>    四、农村的８０后在贫困线上长大，在居无定所的城市中挣扎，带着农村人的质朴和善良，怀着“走出农村”的梦想与追求，背着父辈们的泪水和汗水，在一次又一次的跌打中前行，在对父辈们的无限内疚中品味苦涩人生。我们真的有别于城市８０后，当然，我们讨论的这一切都是在讨论一个普遍性问题，我不否认城市里也有穷人，也有成熟、成功、辛勤的80后。 <br>        总体上而言，80后同样是艰难的一代，在和平时期，我们不用同战争和饥饿作斗争，但是，我们需要和房子车子作斗争，这斗争是为了体面的活着，为了有尊严的活着，有志气的活着。如果还有人要批评80后，说他们没志气，请一定加好一长串定语。<br></span><wbr /><span style="font-size:16px;line-height:1.8em;"><br><br>　　</span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[个人日记]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1255914517#comment</comments>
<qz:effect>134218248</qz:effect>
<pubDate>Mon, 19 Oct 2009 01:08:37 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1255914517</guid>
</item>

<item>
<title><![CDATA[VB调用带参数存储过程]]></title>
<link>http://51566219.qzone.qq.com/blog/1254995743</link>
<description><![CDATA[数据库编程中调用带参数存储过程的实现上   <br>    <br>    　下面，我们谈谈在VB中调用存储过程的实现方法及其注意事项。   <br>  　　我们知道，VB的数据库编程有许多种方法，比如直接用ODBC   API编程，这种方法灵活、高效，程序员可以实现对数据库复杂的控制；也可以用VB中的数据对象，如RDO（远程数据对象）、DAO（数据访问对象）、ADO（ActiveX   数据对象），这种方法实现起来方便、快捷，但灵活性较差一些。由于存储过程在实现数据封装、隐藏以及代码的预编译、减少网络负载、维护方便等优点，所以被许多RDBMS和编程工具做支持。VB中的各类数据对象也提供对存储过程的支持。   <br>    <br>  　　我们以ADO为例来说明其实现的步骤：   <br>    <br>  1．   创建、调试存储过程。你可以在数据库中也可以在其他外挂程序的支持下进行存储过程的创建和调试工作。本例中的存储过程代码如下（使用PUBS的MS   SQL中的例子库   ）：   <br>    <br>  CREATE   PROCEDURE   myprocedure   <br>  @job_id   smallint,   <br>  @job_lvl   tinyint   <br>  AS   <br>  SELECT   *   <br>  FROM   employee   <br>  WHERE   job_id   &lt;   @job_id   <br>  AND   job_lvl   &gt;   @job_lvl   <br>    <br>  2．   在VB中生成一个新工程，窗体有一个COMMAND（NAME：COMMAND1）按钮，一个   MSFlexGrid（NAME：MSFlexGrid1）控件。   <br>  3．   创建连接ADO   connection；   <br>  4．   创建命令ADO   command;   <br>  5．   创建参数并设置各个参数的属性；   <br>  6．   执行ADO   command;   <br>  7．   对数据进行处理；MSFlexGrid显示查询到的数据   <br>  8．   释放连接，退出程序。   <br>    <br>  其中代码如下：   <br>    <br>  在窗体中声明以下变量：   <br>  Dim   cnn1   As   ADODB.Connection   '连接   <br>  Dim   mycommand   As   ADODB.Command   '命令   <br>  Dim   parm_jobid   As   ADODB.Parameter   '参数1   <br>  Dim   parm_joblvl   As   ADODB.Parameter   '参数2   <br>  Dim   rstByQuery   As   ADODB.Recordset   '结果集   <br>  Dim   strCnn   As   String   '连接字符串   <br>    <br>  在窗体的LOAD事件中加入如下代码：   <br>  Set   cnn1   =   New   ADODB.Connection   <br>  '生成一个连接   <br>  strCnn   =   &quot;DSN=MYDSN;uid=sa;pwd=&quot;   <br>  '创建的系统数据源MYDSN指向PUBS数据库   <br>  cnn1.Open   strCnn   '打开连接   <br>    <br>  在窗体的UNLOAD中的加入代码如下：   <br>  cnn1.Close   '关闭连接   <br>  Set   cnn1   =   Nothing   '释放连接 <br> <br> <br>数据库编程中调用带参数存储过程的实现下   <br>    <br>  在按钮中的代码如下：   <br>  Dim   i   As   integer   <br>  Dim   j   as   integer   <br>  Set   parm_jobid   =   New   ADODB.Parameter   <br>  Set   mycommand   =   New   ADODB.Command   <br>  '   parm_jobid.Name   =   &quot;name1&quot;   <br>  this   line   can   be   ommited   <br>  parm_jobid.Type   =   adInteger   '参数类型   <br>  parm_jobid.Size   =   3   '参数长度   <br>  parm_jobid.Direction   =   adParamInput   <br>  ‘参数方向，输入或输出   <br>  parm_jobid.value   =   100   '参数的值   <br>  mycommand.Parameters.Append   <br>  parm_jobid   '加入参数   <br>    <br>    <br>  Set   parm_joblvl   =   New   ADODB.Parameter   <br>  'parm_joblvl.Name   =   &quot;name2&quot;   <br>  parm_joblvl.Type   =   adInteger   <br>  parm_joblvl.Size   =   3   <br>  parm_joblvl.Direction   =   adParamInput   <br>  mycommand.value   =   100   <br>  mycommand.Parameters.Append   parm_joblvl   <br>    <br>    <br>  mycommand.ActiveConnection   =   cnn1   <br>  '指定该command   的当前活动连接   <br>  mycommand.CommandText   =   &quot;   myprocedure   &quot;   <br>  'myprocedure   是你要调用的存储过程名称   <br>  mycommand.CommandType   =   adCmdStoredProc   <br>  '表明command   为存储过程   <br>  Set   rstByQuery   =   New   ADODB.Recordset   <br>  Set   rstByQuery   =   mycommand.Execute()   <br>  i   =   0   <br>  Do   While   Not   rstByQuery.EOF   <br>  　i   =   i   +   1   '   i   中保存记录个数   <br>  　rstByQuery.MoveNext   <br>  Loop   <br>  MSFlexGrid1.Rows   =   i   +   1   <br>  '动态设置MSFlexGrid的行和列   <br>  MSFlexGrid1.Cols   =   rstByQuery.Fields.Count   +   1   <br>  MSFlexGrid1.Row   =   0   <br>  For   i   =   0   To   rstByQuery.Fields.Count   -   1   <br>  　MSFlexGrid1.Col   =   i   +   1   <br>  　MSFlexGrid1.Text   =   rstByQuery.Fields.Item(i).Name   <br>  Next   '设置第一行的标题，用域名填充   <br>    <br>  i   =   0   <br>  Set   rstByQuery   =   mycommand.Execute()   <br>  Do   While   Not   rstByQuery.EOF   <br>  　i   =   i   +   1   <br>  　MSFlexGrid1.Row   =   i   '确定行   <br>  　For   j   =   0   To   rstByQuery.Fields.Count   -   1   <br>  　　MSFlexGrid1.Col   =   j   +   1   <br>  　　MSFlexGrid1.Text   =   rstByQuery   (j)   <br>  　   '添充所有的列   <br>  　Next   <br>  　rstByQuery.MoveNext   <br>  Loop   '这个循环用来填充MSFlexGrid的内容   <br>    <br>    <br>    <br>  特殊说明   <br>  1．   Set   recordset   =   command.Execute(   RecordsAffected,   Parameters,   Options   )   command.Execute   RecordsAffected,   Parameters,   Options   <br>  这是command的两种用法，一种有返回结果集，一种没有返回结果集。   <br>    <br>  RecordsAffected：是指用update、delete操作时所影响的结果，对select的查询，其值为-1；这和在Ms   sql   server   中的Query   Analyzer中的不一样。Query   Analyzer中，select、update、delete的结果显示的是实际查、改、删的记录数。   <br>    <br>  Options：指明command的类型，有adCmdText、adCmdTable、adCmdStoredProc等等，用户可见MSDN。   <br>    <br>  2.在参数的类型中，用户可以用varchar来代替integer,系统会帮你自动实施转化；   <br>    <br>  3．本例中仅为带输入参数的存储过程，如果要有输出参数，根据MSDN的材料，用ADO不行。你可以用RDO数据对象，MSDN中有一个例子，此处不做过多赘述；   <br>    <br>  4．可以不用ADO   COMMAND对象，也可直接调用ADO   CONNECTION的execute方法,结果很类似。 <!--v:3.2--> ]]></description>
<category><![CDATA[VB专栏]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1254995743#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Thu, 08 Oct 2009 09:55:43 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1254995743</guid>
</item>

<item>
<title><![CDATA[用VB测试工程调试VB编写的Dll为什么不能单步调试]]></title>
<link>http://51566219.qzone.qq.com/blog/1254016630</link>
<description><![CDATA[重新生成DLL，然后选择工程-〉组件-〉二进制兼容。  最后再在exe里引用刚才生成的DLL <!--v:3.2--> ]]></description>
<category><![CDATA[VB专栏]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1254016630#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Sun, 27 Sep 2009 01:57:10 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1254016630</guid>
</item>

<item>
<title><![CDATA[VB启动/结束另一程序(Shell 等待程序运行结束)]]></title>
<link>http://51566219.qzone.qq.com/blog/1251793319</link>
<description><![CDATA[VB 中，常以Shell指令来执行外部程式，然而它在Create该外部process 後，立刻 <br>就会回到vb 的下一行程式，无法做到等待该Process结束时，才执行下一行指令， <br>或是说，无法得知该Process是否已结束，甚者，该Process执行到一半，又该如何 <br>中止其执行等等，这些都不是Shell指令所能控制的，因此我们需使API的帮助来完 <br>成。 第一个问题，如何等待shell所Create的process结束後才往後执行vb的程式。 <br>首先要知道的是，每个Process有唯一的一个ProcessID，这是OS给定的，用来 <br>区别每个 Process，这个Process ID(PID)主要可用来取得该Process相对应的一些 <br>资讯，然而要对该Process的控制，却大多透过 Process Handle(hProcess)。VB <br>Shell指令的传回值是PID，而非hProcess，所以我们需透过OpenProcess这个API来 <br>取得 hProcess而OpenProcess()的第一个叁数，指的是所取得的hProcess所具有的 <br>能力，像 PROCESS_QUERY_INFORMATION 便是让GetExitCode()可取得hProcess所指 <br>的process之状态，而PROCESS_TERMINATE，便是让TerminateProcess(hProcess..) <br>的指令能够生效，也就是说，不同叁数设定，使hProcess所具有的权限、能力有所 <br>不同。取得 hProcess後便可以使用WaitForSingleObject()来等待hProcess状态的 <br>改变，也就是说，它会等待 hProcess所指的process执行完，这个指令才结束，它 <br>第二个叁数所指的是 WaitForSingleObject()所要等待的时间(in milliseconds ) <br>，如果超过所指的时间，就TimeOut而结束WaitForSingleObject()的等待。若要它 <br>无限的等下去，就设定为INFIN99vE。 pid = Shell(&quot;C:\tools\spe3\pe2.exe&quot;, vbNormalFocus) <br>hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid) <br>ExitEvent = WaitForSingleObject(hProcess, INFIN99vE) <br>Call CloseHandle(hProcess) 上例会无限等待shell指令create之process结束後，才再做後面的vb指令。有 <br>时觉得那会等太久，所以有第二个解决方式：等process结束时再通知vb 就好，即 <br>：设定一个公用变数(isDone)，当它变成True时代表Shell所Create的Process已结 <br>束。当Process还在执行时，GetExitCodeProcess会传&amp;H103给其第二个叁数，直到 <br>结束时才传另外的数值，如果程式正常结束，那Exitcode = 0，否则就得看它如何 <br>结束了。或许有人在其他地方看到 loop的地方是Loop while Exitcode ＜＞ 0，那 <br>有一点危险，如果以这程子来看，您不是用F4来离开pe2而是用右上方 X 的结束 <br>dos window那麽，会因为ExitCode的值永远不会是0，而进入无穷的回圈。 Dim pid As Long <br>pid = Shell(&quot;C:\tools\spe3\pe2.exe&quot;, vbNormalFocus) <br>hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid) <br>isDone = False <br>Do <br>Call GetExitCodeProcess(hProcess, ExitCode) <br>Debug.Print ExitCode <br>DoEvents <br>Loop While ExitCode = STILL_ALIVE <br>Call CloseHandle(hProcess) <br>isDone = True 另外，如果您的shell所Create的程式，有视窗且为立刻Focus者，可另外用以 <br>下的方式Dim pid As Long <br>Dim hwnd5 As Long <br>pid = Shell(&quot;c:\tools\spe3\pe2.exe&quot;, vbNormalFocus) <br>hwnd5 = GetForegroundWindow() <br>isDone = False <br>Do While IsWindow(hwnd5) <br>DoEvents <br>Loop <br>isDone = True  <br>而如何强迫shell所Create的process结束呢，那便是 <br>Dim aa As Long <br>If hProcess &lt;&gt; 0 Then <br>aa = TerminateProcess(hProcess, 3838) <br>End If hProcess便是先前的例子中所取得的那个Process Handle， 3838所指的是传给 <br>GetExitCodeProcess()中的第二叁数，这是我们任意给的，但最好不要是0，因为 <br>0一般是代表正常结束，当然这样设也不会有错。当然不可设&amp;H103，以这个例子来 <br>看，如果程式正处於以下的LOOP <br>Do <br>Call GetExitCodeProcess(hProcess, ExitCode) <br>Debug.Print ExitCode <br>DoEvents <br>Loop While ExitCode = STILL_ALIVE <br>Debug.print ExitCode 而执行了 TerminateProcess(hProcess, 3838)那会看到ExitCode = 3838。然 <br>而，这个方式在win95没问题，在NT中，可能您要在OpenProcess()的第一个叁数要 <br>更改成 PROCESS_QUERY_INFORMATION Or PROCESS_TERMINATE 这样才能Work。不过 <br>良心的建议，非到最後关头，不要使用TerminateProcess()，因不正常的结束，往 <br>往许多程式结束前所要做的事都没有做，可能造成Resource的浪费，甚者，下次再 <br>执行某些程式时会有问题，例如：本人常使用MS-dos Shell Link 的方式执行一程 <br>式，透过Com port与大电脑的联结，如果Ms-dos Shell Link 不正常结束，下次再 <br>想Link时，会发现too Many Opens，这便是一例。 另外，有人使用Shell来执行.bat档，即： <br>pid = Shell(&quot;c:\aa.bat&quot;, vbNormalFocus) <br>可是却遇上aa.bat结束了，但ms-dos的Window却仍活着，那可以用以下的方式来做 <br>pid = Shell(&quot;c:\command.com /c c:\aa.bat&quot;, vbNormalFocus) <br>那是执行Command.com，而Command.com指定执行c:\aa.bat 而且结束时自动Close <br>所有程式如下： <br>Private Declare Function OpenProcess Lib &quot;kernel32&quot; _ <br>(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ <br>ByVal dwProcessId As Long) As LongPrivate Declare Function WaitForSingleObject Lib &quot;kernel32&quot; _ <br>(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long <br>Private Declare Function CloseHandle Lib &quot;kernel32&quot; _ <br>(ByVal hObject As Long) As Long <br>Private Declare Function GetExitCodeProcess Lib &quot;kernel32&quot; _ <br>(ByVal hProcess As Long, lpExitCode As Long) As Long <br>Private Declare Function TerminateProcess Lib &quot;kernel32&quot; _ <br>(ByVal hProcess As Long, ByVal uExitCode As Long) As Long <br>Private Declare Function GetForegroundWindow Lib &quot;user32&quot; () As Long <br>Private Declare Function IsWindow Lib &quot;user32&quot; _ <br>(ByVal hwnd As Long) As Long Const PROCESS_QUERY_INFORMATION = &amp;H400 <br>Const STILL_ALIVE = &amp;H103 <br>Const INFIN99vE = &amp;HFFFF Private ExitCode As Long <br>Private hProcess As Long <br>Private isDone As Long <br>Private Sub Command1_Click() <br>Dim pid As Long <br>pid = Shell(&quot;C:\tools\spe\pe2.exe&quot;, vbNormalFocus) <br>hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid) <br>isDone = False <br>Do <br>Call GetExitCodeProcess(hProcess, ExitCode) <br>Debug.Print ExitCode <br>DoEvents <br>Loop While ExitCode = STILL_ALIVE <br>Call CloseHandle(hProcess) <br>isDone = True <br>End Sub Private Sub Command2_Click() <br>Dim pid As Long <br>Dim ExitEvent As Long <br>pid = Shell(&quot;C:\tools\spe3\pe2.exe&quot;, vbNormalFocus) <br>hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid) <br>ExitEvent = WaitForSingleObject(hProcess, INFIN99vE) <br>Call CloseHandle(hProcess) <br>End Sub Private Sub Command3_Click() <br>Dim aa As Long <br>If hProcess &lt;&gt; 0 Then <br>aa = TerminateProcess(hProcess, 3838) <br>End If End Sub <br>Private Sub Command4_Click() <br>Dim pid As Long <br>Dim hwnd5 As Long <br>pid = Shell(&quot;c:\tools\spe3\pe2.exe&quot;, vbNormalFocus) <br>hwnd5 = GetForegroundWindow() <br>isDone = False <br>Do While IsWindow(hwnd5) <br>DoEvents <br>Loop <br>isDone = True <br>End Sub Private Sub Command5_Click() <br>Dim pid As Long <br>'pid = Shell(&quot;c:\windows\command\xcopy c:\aa.bat a:&quot;, vbHide) <br>pid = Shell(&quot;c:\command.com /c c:\aa.bat&quot;, vbNormalFocus) <br>End Sub <!--v:3.2--> ]]></description>
<category><![CDATA[VB专栏]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1251793319#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Tue, 01 Sep 2009 08:21:59 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1251793319</guid>
</item>

<item>
<title><![CDATA[推荐10个存储技术网站和论坛]]></title>
<link>http://51566219.qzone.qq.com/blog/1251431524</link>
<description><![CDATA[　　在学习网络存储技术的漫长过程中，经常需要查找大量的资料，希望能有人解答很多的疑难问题。给大家推荐10个我自己经常去的网络存储技术资源网站或论坛，希望能对大家的学习有帮助。<br>　　资源类网站：<br>　　1、存储在线：http://www.dostor.com/ 个人感觉最专业、资源最多、更新最快的一个网络存储技术网站，所有内容都是与存储有关的。<br>　　2、CDBEST存储网：http://www.cdbest.net/ 一个专注与光盘存储的网站。呵呵，我只是知道，但很少去。<br>　　3、IT168存储频道：http://storage.it168.com/ 感觉网站的SEO做的不错，找资料时经常能搜到，不过更新不够快，内容不够多。推荐它是因为曾经发过我几篇文章。<br>　　4、比特网存储频道存储高手速成：http://storage.chinabyte.com/b_jszq/ 浅显易懂，网络技术文章汇聚如海，上至老鸟下至菜菜都可观看，让你以最快速度进化。<br>　　5、存储部落：http://www.sansky.net 呵呵，我个人的博客，虽然信息量和大网站没法比，但很多文章可以帮助大家解决存储概念、存储选型和设计方面的问题，还提供在线答疑和邮件答疑，实用啊。<br>　　论坛：<br>　　1、存储论坛：http://bbs.doit.com.cn 存储圈里人气最旺的论坛、聚集了很多存储高人，我天天都要去看看。呵呵，不过个人感觉能说的比能干的人多。适合于初级和中级人员，适合于销售和售前。<br>　　2、chinaunix：http://bbs.chinaunix.net/ 老牌的存储技术论坛，是在unix论坛的基础发展起来的，感觉它的博客服务比论坛更有名气。论坛内容主要集中的存储设备在unix环境的安装和容灾备份。适合于中高级售后人员。<br>　　3、IXPUB技术社区：http://www.ixpub.net/ IT技术社区，各种操作系统论坛的合集，存储技术只是其中一个部分。技术讨论帖子较少，重要都是网管给大家提供的资料下载，适合于初学者。<br>　　4、51CTO技术论坛：http://bbs.51cto.com/ 和IXPUB技术社区差不多，典型的下载型论坛，适合于初学者。<br>　　5、存储时代：http://bbs.stor-age.com/ 也是一个老牌存储技术论坛，可惜从一开始就没有人气，已经和至顶网的存储社区http://bbs.zdnet.com.cn/合并。 <!--v:3.2--> ]]></description>
<category><![CDATA[档案信息化]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1251431524#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Fri, 28 Aug 2009 03:52:04 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1251431524</guid>
</item>

<item>
<title><![CDATA[上传文件的存放方式？文件夹/ 数据库]]></title>
<link>http://51566219.qzone.qq.com/blog/1251422850</link>
<description><![CDATA[       关于应用程序中上传的文件到底是放在文件夹下还是数据库中，有着一些争论，现在很多做法是根据实际情况选择一种做法，本文要介绍的是结合此两种方法的一种方式。<br><br>      文件的上传、下载的实现主要有两种方式：<br><br>1. 将文件保存在文件夹中；<br>2. 将文件保存在数据库中。<br><br>    这两种方法各有优缺点：<br><br>      比如文件保存在服务器的文件夹中，速度上有优势，文件上传、下载只是通过链接读取文件，但是这种方法，不便于文件的管理。比如将文件夹转移位置，或服务器硬盘满了，把文件放到其他地方，就得更新文件的链接。当然也不利于文件资料的备份等。<br><br>      而将文件放到数据库中，因为涉及到大容量的数据库的读写，速度上有点弱势，但是这种方法，文件全部放在数据库中，非常方便文件的查找、管理和备份等。<br><br>      我们在项目中将采用以上两种方法结合的方法。即先把文件放到服务器一个特定的文件夹中，然后再上传到数据库中，这样当用户读取某个文件时，若文件夹中有这个文件，则直接读取，而不用访问数据库。若文件夹中没有这个文件，则从数据库中读取，再放到这个文件夹中，这样，当用户第二次访问同样一个文件，就不需访问数据库，而直接从文件夹中读取。<br><br>      这种方法结合了文件夹存放方式和数据库存放方式两者的优点。不仅有着文件夹方式的访问效率，而且也有数据库存放方式的便于管理等优势。 <!--v:3.2--> ]]></description>
<category><![CDATA[vs.net]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1251422850#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Fri, 28 Aug 2009 01:27:30 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1251422850</guid>
</item>

<item>
<title><![CDATA[数据库异常恢复办法]]></title>
<link>http://51566219.qzone.qq.com/blog/1250155599</link>
<description><![CDATA[1.新建一个同名的数据库<br>2.再停掉sql server<br>3.用suspect数据库的文件覆盖掉这个新建的同名数据库<br>4.再重启sql server<br>5.此时打开企业管理器时新建的同名数据库会出现置疑，先不管，执行下面的语句（注意修改其中的数据库名)<br><br>USE MASTER<br>GOSP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE<br>GOUPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='his222'<br>Gosp_dboption 'test', 'single user', 'true'<br>GoDBCC CHECKDB('test') <br>Goupdate sysdatabases set status =28 where name='test'<br>Gosp_configure 'allow updates', 0 reconfigure with override<br>Go sp_dboption 'test', 'single user', 'false'<br>Go6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用<br>数据库的脚本创建一个新的数据库,并将数据导进去就行了.如果这样改不加数据库状态,你就把数据库导成一个新库来代替旧库吧<br>企业管理器--右键你的数据库--所有任务--导出数据<br>          --目标标数据库选择新建<br>          --选择&quot;在两个sql数据库之间复制对象和数据&quot;<br>          --把&quot;包含扩展属性&quot;选上,其他的根据需要选择<br>          --最后完成 <br>在MS SQLSERVER中一直有这样的问题,SQLSERVER的状态&quot;置疑&quot;,我们先来分析一下SQLSERVER数据库&quot;置疑&quot;的原因:<br>   1.错误的删除日志;<br>   2.硬件(HD)损坏,造成日志和数据文件写错误;<br>   3.硬盘的空间不够,比如日志文件过大;<br>解决办法:这是最简单的办法是有数据库的全备份,然后恢复即可.<br>步骤:1. 删除原始的数据库:<br>     USE MASTER<br>     GO <br>     DROP DATABASE DB_SUEPECT <br>    2.建立同名的数据库:<br>        USE master<br>       GO<br>       CREATE DATABASE DB_SUSPECT<br>        ON <br>         ( NAME = DBNAME_DAT,<br>           FILENAME = 'C:',<br>           SIZE = 10,<br>            FILEGROWTH = 5 )<br>           LOG ON<br>          ( NAME = 'DBNAME_LOG',<br>           FILENAME = 'g:',<br>           SIZE = 5MB,<br>           FILEGROWTH = 5MB )<br>           GO<br>    3.恢复数据库:<br>      RESTORE DATABASE DB_SUSPECT<br>     FROM DBNAME_BACKUP.DAT<br>  4.数据库完整性检测:<br>       DBCC CHECKDB('DB_SUSPECT')5.重新启动MSSQLSERVER服务.<br>如果没有全备份,那就要用一些特殊的方法:<br>1.设置数据库为紧急模式<br>       Use Master<br>       GO<br>       sp_configure 'allow updates', 1<br>       reconfigure with override<br>      GO<br>      UPDATE sysdatabases SET status = 32768 where name = 'DB_SUSPECT'<br>      GO2.停掉SQL Server服务:<br>     NET STOP MSSQLSERVER3.把原始数据库的数据文件DBNAME_DAT.MDF,DBNAME_LOG.LDF移走:<br>4.启动SQL Server服务:<br>      NET START MSSQLSERVER5.重新建立一个同名的数据库DB_SUSPECT；<br>       USE master<br>       GO<br>       CREATE DATABASE DB_SUSPECT<br>        ON <br>         ( NAME = DBNAME_DAT,<br>           FILENAME = 'C:',<br>           SIZE = 10,<br>            FILEGROWTH = 5 )<br>           LOG ON<br>          ( NAME = 'DBNAME_LOG',<br>           FILENAME = 'g:',<br>           SIZE = 5MB,<br>           FILEGROWTH = 5MB )<br>           GO<br>6.设置数据库运行在单用户的模式:<br>         USE MASTER<br>        GO<br>        ALTER DATABASE DB_SUSPECT SET SINGLE_USER<br>        GO7.停掉SQL服务:<br>     NET STOP MSSQLSERVER8.把原来的数据文件再覆盖回来:<br><br>9.启动SQL Server服务:<br>      NET START MSSQLSERVER10.重新设置SQLSERVER的状态:<br>         USE MASTER<br>        GO<br>        EXEC sp_resetstatus &quot;DB_SUSPECT&quot;11.数据库完整性检测:<br>        DBCC CHECKDB('DB_SUSPECT')12.恢复数据库为多用户模式:<br>        USE MASTER<br>        GO<br>        ALTER DATABASE DB_SUSPECT SET MULTI_USER<br>       GO13.恢复SQLSERVER原始的配置:<br>      USE MATER    GO      <br>    UPDATE sysdatabases SET status = 4194320 where name = 'DB_SUSPECT'<br>    GO14.配置SQLSERVER不允许更新系统表:<br>      USE MASTER<br>     GO<br>      sp_configure 'allow updates', 0<br>      reconfigure with override<br>     GO15.重新启动MSSQLSERVER服务:<br>     最好重新启动操作系统<br>16.备份数据库:<br>   可以通过SQLSERVER企业管理器或T-SQL.需要备份MASTER和DB_SUSPECT<br>补充一点，如果用DOMAIN\USER时,要注意对.MDF.LDF的所在目录的权限. <br> <br>如果 SQL Server 因为磁盘可用空间不足，而不能完成数据库的恢复，那么  SQL Server 2000 会返回错误 1105 并且将 sysdatabases 中的 status 列设为置疑。 <br>你可以看到在SQLSERVER 的ERROR LOG 和OS的应用程序日志中应该有1105的错误信息:SQL Server事务日志可能会被填满，这会阻止之后的数据库操作，包括UPDATE， DELETE， INSERT 和CHECKPOINT。 <br>事务日志填满会导致1105错误:<br>    Can't allocate space for object syslogs in database dbname because<br>    the logsegment is full。 If you ran out of space in syslogs， dump<br>    the transaction log。 Otherwise use ALTER DATABASE or<br>    sp_extendsegment to increase the size of the segment。这种现象可能出现于任何一个数据库中，包括Master和TempDB。一些难以预见的因素可能消耗日志空间。 例如:<br>一个大型事务， 尤其像批量数据更新、插入或删除。<br>一个未提交的事务。<br>检查点处理程序截除时所需的带宽过大。<br>截除时超过阈值<br>上述各种条件互相作用的结果。<br>用于发布的标记事务没有被日志读取程序读走<br>下面是修复的步骤和收缩日志的步骤:   1.在命令提示符下运行以下命令启动 SQL Server： <br>            SQLSERVER -f -m<br>       备注：-m 开关以单用户模式启动 SQL Server。在单用户模式下，只能成功建立一个连接。 请注意是否有任何其他客户机或服务可能会在您通过 SQL Server 查询分析器    建立连接前使用那个连接。<br>   2. 重置置疑数据库的状态。<br>        sp_resetstatus 'database_name'<br>下面是结果集：<br>Database'database_name'status reset!<br>WARNING: You must reboot SQL Server prior to accessing this database!<br>  3. 用 ALTER DATABASE 向数据库添加一个数据文件或日志文件:USE master<br>GO<br>CREATE DATABASE db_name ON<br>(<br> NAME = dbname_dat1, <br> FILENAME = 'D:\MSSQL\Data\dbname_dat1.ndf',<br> SIZE = 1000MB,<br> FILEGROWTH = 50MB<br>)<br>GO<br>--更改该数据库以添加一个 2GB 大小的新数据文件<br>ALTER DATABASE db_name<br>ADD FILE <br>(<br> NAME = dbname_dat2,<br> FILENAME = 'F:\MSSQL\DATA\dbname_dat2.ndf',<br> SIZE = 2000MB,<br> FILEGROWTH = 50MB<br>)<br>GO<br>--更改该数据库以添加一个1GB 大小的新日志文件<br>ALTER DATABASE db_name<br>ADD LOG FILE <br>( NAME = db_name_log2,<br>  FILENAME = 'F:\MSSQL\Data\db_name_log2.ldf',<br>  SIZE = 1000MB,<br>  FILEGROWTH = 20MB),<br>GO    4. 停止并重新启动 SQL Server:<br>   用新的数据文件或日志文件所提供的额外空间，SQL Server 应该能完成数据库的恢复。     5. 释放磁盘空间并且重新运行恢复操作,按照下面的步骤收缩日志。<br> sp_resetstatus 关闭数据库的置疑标志，但是原封不动地保持数据库的其它选项。<br>为从根本上解决这样的问题,你可以按下面的操作配置SQLSERVER 2000:<br>a.如果不需要恢复到指定的时间点,你可以将数据库的恢复模式配置为简单,这样<br>UPDATE,DELETE,SELECT就不会记录日志,日志就不会增加的很大:     USE MASTER<br>    GO<br>     ALTER DATABASE DB_NAME SET RECOVERY SIMPLE<br>b.如果你的恢复模式是全部,你一定要配置日志字段收缩:    USE MASTER<br>    GO<br>    sp_dboption 'databasename','trunc. log on chkpt.',true<br>    sp_dboption 'databasename','autoshrink',true<br>c.通过每日备份将日志收缩:<br>   BACKUP DATABASE DATABASE_NAME TO BACKUP_DEVICES<br>   BACKUP LOG DATABASE_NAME TO LOG_DEVICES<br>   OR<br>   BACKUP LOG DATABASE_NAME with truncate_only   **检查日志的容量:DBCC SQLPERF (LOGSPACE) 这时日志并没有收缩!<br>d.每天在备份数据库完成之后,重新启动MS SQLSERVER SERVICE.<br>     USE DATABASE_NAME<br>     go<br>     DBCC  SHRINKFILE(2,truncateonly)  **检查日志的容量:DBCC SQLPERF (LOGSPACE) 这时日志已经收缩!<br>e.手动快速收缩日志:<br>  / *run  below  script,you  will  shrink  you  database  log  files<br>immediately,  in  my  experience,you  need  to  run  the  script  for  3  or<br>4  minutes  before stopping  it  manually  */<br>use  databasename<br>dbcc  shrinkfile(2,notruncate)<br>dbcc  shrinkfile(2,truncateonly)<br>create  table  t1(char1  char(4000))<br>go<br>declare  @i  int<br>select  @i=0<br>while(1=1)<br>begin<br>     while(@i&lt;100)<br>             begin<br>           INSERT  INTO  T1  VALUES  ('A')<br>           SELECT  @I=@I+1<br>           END<br>TRUNCATE  table  T1<br>BACKUP  LOG  youdatabasename  with  truncate_only<br>end<br>GO<br> 注意  只有在您的主要支持提供者指导下或有疑难解答建议的做法时，才可以使用<br> sp_resetstatus。否则，可能会损坏数据库。 由于该过程修改了系统表，系统管理员必须在运行 sp_resetstatus这个过程前，启用系统表更新。要<br>启 用更新，使用下面的过程： USE master<br> GO<br> sp_configure 'allow updates', 1<br> GO<br> RECONFIGURE WITH OVERRIDE<br> GO<br> 过程创建后，立即禁用系统表更新： sp_configure 'allow updates', 0<br> GO<br> RECONFIGURE WITH OVERRIDE<br> GO<br> 只有系统管理员才能执行 sp_resetstatus。执行该过程后，立即关闭 SQL Server。 <br> <br>遇到这种数据库置疑情况，就运行下面这个脚本，屡试不爽：<br>======================================================<br>--before running any script, run the following to set the <br>master database to allow updates<br>USE master<br>GO<br>sp_configure 'allow updates', 1<br>GO<br>RECONFIGURE WITH OVERRIDE<br>GO<br>--Run the following script<br>UPDATE master..sysdatabases SET status = status ^ 256 <br>WHERE name = 'Database_Name'<br>--Run the following script<br>exec SP_resetstatus Database_Name<br>--stop and start the MSDTC at this stage<br>--After the procedure is created, immediately disable <br>updates to the system tables:<br>exec sp_configure 'allow updates', 0<br>GO<br>RECONFIGURE WITH OVERRIDE<br>GO<br>=====================================<br> 从上面可以看出，处理置疑的基本步骤还是我那篇文章中说的(注意我使用的字体颜色)：<br>执行 sp_configure 以允许对系统表进行更新，然后用 RECONFIGURE WITH OVERRIDE 语句强制实施该配置；<br>数据库重置紧急模式；<br>执行sp_resetstatus关闭数据库的置疑标志，但是原封不动地保持数据库的其它选项（只有系统管理员才能执行）。执行该过程后，立即重启 SQL Server服务；<br>执行 sp_configure 以禁止对系统表进行更新，然后用 RECONFIGURE WITH OVERRIDE 语句强制实施该配置。<br>    <br>status ^ 256的意思就是：<br>Constant<br> Value<br> Description<br> <br>SQLDMODBStat_Suspect<br> 256<br> Database integrity is suspect for the referenced database.<br> <br> 不同的是，有时候丢失了数据库日志文件，额外需要以下步骤：<br>&amp;Oslash;         把应用数据库设置为Single User模式；<br>&amp;Oslash;         做DBCC CHECKDB；<br>才可以。<br>但是几位网友的实践结果就是这个DBCC CHECKDB执行失败。一位网友yang说：“但是 DBCC CHECKDB就是执行不了，总是说“该数据库处于回避恢复模式”。我已经试了很多次了，就是改变不了这个状态。”<br>还有一位Rui执行DBCC CHECKDB时报错：“Server: Msg 943, Level 14, State 1, Line 1 Database 'his_yb' cannot be opened because its version (539) is later than the current server version (515).”<br>对于Yang，可能他没有一步一步做，。我的切身体会是，把应用数据库设置为Single User模式后就可以做DBCC CHECKDB。之后呢，也许SQL Server重启后自动检查数据库是否正常。但是数据应该是可以读出来的，至少可以被DTS Wizard读出来的。这时候的数据库还存在问题，比如我的组件使用数据库时，报告说：“发生错误：-2147467259,未能在数据库 'XXX' 中运行 BEGIN TRANSACTION，因为该数据库处于回避恢复模式。”<br>对于Rui，他碰到的那个错误<br>Server: Msg 943, Level 14, State 1, Line 2<br>Database 'XXXX' cannot be opened because its version (536) is later than<br>the current server version (515).这表明Rui正试图：<br>从一个SQL Server 2000(version 539,536之类的)的数据库备份恢复到一个SQL Server 7.0中<br>或者<br>把一个SQL Server 2000(version 539,536之类的)的数据库attach到一个SQL Server 7.0中，<br>这是不允许的。如果你必须使用这个SQL Server 2000的数据备份，那么请您首先把这个备份倒入SQL Server 2000，最后用DTS把数据库从SQL Server 2000上transfer到SQL Server 7.0上。<br> <br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/wzh1215/archive/2006/01/04/570461.aspx" target="_blank">http://blog.csdn.net/wzh1215/archive/2006/01/04/570461.aspx</a><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[SQL]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1250155599#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Thu, 13 Aug 2009 09:26:39 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1250155599</guid>
</item>

<item>
<title><![CDATA[GUID]]></title>
<link>http://51566219.qzone.qq.com/blog/1249966480</link>
<description><![CDATA[<span style="font-family:'Georgia';line-height:1.8em;"><span style="font-family:'Georgia';line-height:1.8em;">GUID（Global unique identifier）全局唯一标识符，它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">的一个 16 字节的二进制值。</span><wbr /> <br><span style="font-family:'Georgia';line-height:1.8em;">GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”，其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如：6F9619FF-</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中，分配必须具有唯一性的标</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">识符。在 Windows 平台上，GUID 应用非常广泛：注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">在这次开发 ASP.NET 应用时，我大量使用了类型为 GUID 的 ID 列作为各实体表的关键字(键)。由于其唯一、易产生的特性，给应用程序处理带</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">来诸多好处。</span><wbr /><br><span style="color:#0000ff;font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />1、在 SQL Server 中使用 GUID</span><wbr /></span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">如果在 SQL Server 的表定义中将列类型指定为 uniqueidentifier，则列的值就为 GUID 类型。</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">SQL Server 中的 NewID() 函数可以产生 GUID 唯一值，使用此函数的几种方式如下：</span><wbr /><br><span style="color:#000000;font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />1) 作为列默认值</span><wbr /></span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">将 uniqueidentifier 的列的默认值设为 NewID()，这样当新行插入表中时，会自动生成此列 GUID 值。<br></span><wbr /><span style="font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr /><br>2)使用 T-SQL</span><wbr /></span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">在 T-SQL 中使用 NewID()函数，如“INSERT INTO Table(ID,... ) VALUES(NewID(),...)”来生成此列的 GUID 值。</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />3)提前获取 GUID 值</span><wbr /></span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">由于特殊功能需要，需要预先获知新行的 ID 值，也可以使用如下 C# 代码提前获得 GUID 的值，再存储到数据库中:</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;"> SqlCommand cmd = New SqlCommand();<br> cmd.CommandText = &quot;SELECT NewID()&quot;;<br> string rowID = (string) cmd.ExecuteScalar();<br> cmd.CommandText = &quot;INSERT INTO Table(ID,...) VALUES(@ID,...)<br> cmd.Parameters.Add(&quot;@ID&quot;,SqlDbType.UniqueIdentifier).Value = new Guid(rowID);<br> cmd.ExecuteNoQuery();</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">uniqueidentifier 值不能进行算术运算，但可以进行(意义不大的)比较操作和 NULL 检查；它不能象 IDENTITY 列一样，可以获知每行的增加</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">时间的先后顺序，只能通过增加其它时间或时间戳列来完成此功能。</span><wbr /><br><span style="color:#0000ff;font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />2、在 .NET 中使用 GUID</span><wbr /></span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">GUID 在 .NET 中使用非常广泛，而且 .NET Framework 提供了专门 Guid 基础结构。</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">Guid 结构的常用法包括：</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />1) Guid.NewGUID()</span><wbr /> </span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">生成一个新的 GUID 唯一值</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />2) Guid.ToString()</span><wbr /></span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">将 GUID 值转换成字符串，便于处理</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />3)构造函数 Guid(string) </span><wbr /></span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">由 string 生成 Guid 结构，其中string 可以为大写，也可以为小写，可以包含两端的定界符“{}”或</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">“()”，甚至可以省略中间的“-”，</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">Guid 结构的构造函数有很多，其它构造用法并不常用。</span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">同时，为了适用数据库中使用 GUID 的需要，.NET Framework 也提供了 SqlGUID 结构，它和 Guid 结构类似，只是两者对排序(CompareTo)的</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">处理方式不同，SqlGuid 计算值的最后 6 个字节。而 Guid 计算全部 16 个字节，这种差异可能会给 SQL Server 中 uniqueidentifier 列的</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">排序带来一定影响，当然这种排序意义也不大。 </span><wbr /><br><span style="font-family:'Georgia';line-height:1.8em;">.NET Framework 中可以使用类 GuidConverter 提供将 Guid 结构与各种其他表示形式相互转换的类型转换器。</span><wbr /><br><br><span style="color:#0000ff;font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />3、GUID 的优缺点</span><wbr /></span><wbr /><span style="font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />1) 优点</span><wbr /></span><wbr /><br><span style="text-decoration:underline;"><wbr /><li style="margin:25px;"><span style="font-family:'Georgia';line-height:1.8em;">同 IDENTITY 列相比，uniqueidentifier 列可以通过 NewID() 函数提前得知新增加的行 ID，为应用程序的后续处理提供了很大方便</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">。<br><br></span><wbr /><li style="margin:25px;"><span style="font-family:'Georgia';line-height:1.8em;">便于数据库移植，其它数据库中并不一定具有 IDENTITY 列，而 Guid 列可以作为字符型列转换到其它数据库中，同时将应用程序中产</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">生的 GUID 值存入数据库，它不会对原有数据带来影响。<br><br></span><wbr /><li style="margin:25px;"><span style="font-family:'Georgia';line-height:1.8em;">便于数据库初始化，如果应用程序要加载一些初始数据， IDENTITY 列的处理方式就比较麻烦，而 uniqueidentifier 列则无需任何处</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">理，直接用 T-SQL 加载即可。<br><br></span><wbr /><li style="margin:25px;"><span style="font-family:'Georgia';line-height:1.8em;">便于对某些对象或常量进行永久标识，如类的 ClassID，对象的实例标识，UDDI 中的联系人、服务接口、tModel标识定义等。</span><wbr /> </li></span><wbr /><span style="font-family:'Georgia';line-height:1.8em;"><span style="font-weight:bold"><wbr />2) 缺点</span><wbr /></span><wbr /><br><span style="text-decoration:underline;"><wbr /><li style="margin:25px;"><span style="font-family:'Georgia';line-height:1.8em;">GUID 值较长，不容易记忆和输入，而且这个值是随机、无顺序的，所以使用时要注意场合，最好不要尝试用它来作为你的电子邮件地址 J<br><br></span><wbr /><li style="margin:25px;"><span style="font-family:'Georgia';line-height:1.8em;">GUID 的值有 16 个字节，与其它那些诸如 4 字节的整数相比要相对大一些。这意味着如果在数据库中使用 uniqueidentifier 键，可能</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">会带来两方面的消极影响：存储空间增大；索引时间较慢。</span><wbr /> </li></span><wbr /><br><span style="color:#0000ff;line-height:1.8em;"><span style="font-family:'Georgia';line-height:1.8em;">综合来说， GUID 的优点带来的便利远超出其缺点带来的影响，随着诸如 WebService 等系统互联与整合技术的不断发展，其唯一标识的特性</span><wbr /><span style="font-family:'Georgia';line-height:1.8em;">使得其应用越来越广，在您的应用程序中也应考虑使用它了。</span><wbr /></span><wbr /><br><span style="color:#0000ff;line-height:1.8em;"><span style="font-family:'Georgia';line-height:1.8em;">PS:</span><wbr /></span><wbr /><br>Windows 2000之后已经不使用网卡地址作为生成GUID的参数了，现在用的是第四代算法，使用的是安全子系统的随机数生成器（RNG），因此安全性没有什么问题了。 <br><br>如果没有网卡，系统会使用其它的一些具有随机特征的数字作为种子来生成GUID。</span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[SQL]]></category>
<author><![CDATA[51566219@qq.com(.～)]]></author>
<comments>http://51566219.qzone.qq.com/blog/1249966480#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Tue, 11 Aug 2009 04:54:40 GMT</pubDate>
<guid>http://51566219.qzone.qq.com/blog/1249966480</guid>
</item>

</channel>
</rss>

