<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[北大青鸟Aptech]]></title>
  <subtitle type="html"><![CDATA[北京北大公学授权培训中心]]></subtitle>
  <id>http://www.jb-accp/Blog1/</id>
  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.jb-accp/Blog1/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2008-11-29T16:51:24+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[数据库性能调优技术]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-11-29T16:51:24+08:00</updated>
	  <published>2008-11-29T16:51:24+08:00</published>
		  <summary type="html"><![CDATA[<p><br />
一、概述</p>
<p>随着<a target="_blank" href="http://www.jb-accp.com">数据库</a>在各个领域的使用不断增长，越来越多的应用提出了高性能的要求。数据库性能调优是知识密集型的学科，需要综合考虑各种复杂的因素：<a target="_blank" href="http://www.jb-accp.com">数据库缓冲区</a>的大小、索引的创建、语句改写等等。总之，数据库性能调优的目的在于使系统运行得更快。</p>
<p>调优需要有广泛的知识，这使得它既简单又复杂。说调优简单，是因为调优者不必纠缠于复杂的公式和规则。许多学术界和业界的研究者都在尝试将调优和查询处理建立在数学基础之上。</p>
<p>称调优复杂，是因为如果要完全理解常识所依赖的原理，还需要对应用、数据库管理系统、操作系统以及硬件有广泛而深刻的理解。</p>
<p><a target="_blank" href="http://www.jb-accp.com">数据库调优技术</a>可以在不同的数据库系统中使用。如果需要调优数据库系统，最好掌握如下知识：</p>
<p>1)查询处理、并发控制以及数据库恢复的知识；2)一些调优的基本原则。这里主要描述索引调优。</p>
<p>二、索引调优</p>
<p>索引是建立在表上的一种数据组织，它能提高访问表中一条或多条记录的特定查询效率。因此，适当的索引调优是很重要的。对于索引调优存在如下的几个误区：</p>
<p>误区1：索引创建得越多越好</p>
<p>实际上：创建的索引可能建立后从来未使用。索引的创建也是需要代价的，对于删除、某些更新、插入操作，对于每个索引都要进行相应的删除、更新、插入操作。从而导致删除、某些更新、插入操作的效率变低。</p>
<p>误区2：对于一个单表的查询，可以索引1进行过滤再使用索引2进行过滤</p>
<p>实际上：假设查询语句如下select&nbsp; from t1 where c1=1 and c2=2，c1列和c2列上分别建有索引ic1、ic2。先使用ic1(或ic2)进行过滤，产生的结果集是临时数据，不再具有索引，所以不可使用ic2(或ic1)进行再次过滤。</p>
<p><a target="_blank" href="http://www.jb-accp.com">索引优化</a>的基本原则：</p>
<p>1、将索引和数据存放到不同的文件组没有将表数据和索引数据存储到不同的文件组，而不加区别地将它们存储到同一文件组。这样，不但会造成IO竞争，也为数据库的维护工作带来不变。</p>
<p>2、组合索引的使用</p>
<p>假设存在组合索引it1c1c2(c1,c2)，查询语句select&nbsp; from t1 where c1=1 and c2=2能够使用该索引。查询语句select&nbsp; from t1 where c1=1也能够使用该索引。但是，查询语句select&nbsp; from t1where c2=2不能够使用该索引，因为没有组合索引的引导列，即，要想使用c2列进行查找，必需出现c1等于某值。</p>
<p>根据where条件的不同，归纳如下：</p>
<p>1) c1=1 and c2=2：使用索引it1c1c2进行等值查找。</p>
<p>2) c1=1 and c22：使用索引it1c1c2进行范围查找，可以有两种方法。</p>
<p>方法1，使用通过索引键(1,2)在B树中命中一条记录，然后向后扫描找出 第一条符合条件的记录，从此记录往后的每一条记录都是符合条件的。这种方法的弊端在于：如果c1=1 and c2=2对应的记录数很多，会产生很多无效的扫描。</p>
<p>方法2，如果c2对应的int型数据，可以使用索引键(1,3)在B树中命中一条记录，从此记录往后的每一条记录都是符合条件的。</p>
<p>本文中的例子均采用方法1。</p>
<p>3)c11 and c2=2：因为索引的第一个列不是等于号的，索引即使后面出现了c2=2，也不能将c2=2应用于索引查找。这里，通过索引键(1,- &infin;)在B树中命中一条记录，向后扫描找出第一条符合c11的记录，此后的每一条记录判断是否符合c2=2，如果符合则输出，否则过滤掉。这里我们称c2=2没有参与到索引运算中去。这种情况在实际应用中经常出现。</p>
<p>4)c11：通过索引键(1,- &infin;) 在B树中命中一条记录，以此向后扫描找出第一条符合c11的记录，此后的每条记录都是符合条件的。</p>
<p>3、唯一索引与非唯一索引的差异。假设索引int1c1(c1)是唯一索引，对于查询语句select c1 from t1 where c1=1，达梦数据库使用索引键(1)命中B树中一条记录，命中之后直接返回该记录(因为是唯一索引，所以最多只能有一条c1=1的记录)。假设索引it1c2(c2)是非唯一索引，对于查询语句select c2 from t2 where c2=2，达梦数据库使用索引键(2)命中B树中一条记录，返回该记录，并继续向后扫描，如果该记录是满足c=2，返回该记录，继续扫描，直到遇到第一条不符合条件c2=2的记录。于是，我们可以得知，对于不存在重复值的列，创建唯一索引优于创建非唯一索引。</p>
<p>4、非聚集索引的作用</p>
<p>每张表只可能一个聚集索引，<a target="_blank" href="http://www.jb-accp.com">聚集索引</a>用来组织真实数据。语句&ldquo;create table employee (id intcluster primary key,name varchar(20),addr varchar(20))&rdquo;。表employee的数据用id来组织。如果要查找id=1000的员工记录，只要用索引键(1000)命中该聚集索引。但是，对于要查找name=&rsquo;张三&rsquo;的员工记录就不能使用该索引了，需要进行全表扫描，对于每一条记录判断是否满足name=&rsquo;张三&rsquo;，这样会导致查询效率非常低。要使用聚集索引，必需提供id，我们只能提供name，于是需要引入一个辅助结构实现name到id的转换，这就是非聚集索引的作用。该非聚集索引的键是name，值是id。于是语句&ldquo;select&nbsp; fromemployee where name=&rsquo;张三&rsquo;&rdquo;的执行流程是：通过键(&rsquo;张三&rsquo;)命中非聚集索引，得到对应的id值3(假设&rsquo;张三&rsquo;对应的id为3)，然后用键(3)命中聚集索引，得到相应的记录。</p>
<p>5、是不是使用非聚集索引的查询都需要进行聚集的查询。不是的，虽然在上一点中查询转换为聚集索引的查找，有时候可以只需要使用非聚集索引。</p>
<p>创建表并创建相应的索引：create table t1(c1 int,c2 int,c3 int);create index it1c2c3 on</p>
<p>t1(c2,c3)。查询语句为：select c3 from t1 where c2=1。</p>
<p>因为索引it1c2c3(c2,c3)覆盖查询语句中的列(c2,c3)。所以，该查询语句的执行流程为：通过索引键(1,- &infin;)命中索引it1c2c3，对于该记录直接返回c3对应的值，继续向后扫描，如果索引记录中c1还是等于1，那么输出c3，以此类推，直到出现第一条c1不等于1的索引记录,结束查询。</p>
<p>6、<a target="_blank" href="http://www.jb-accp.com">创建索引</a>的规则</p>
<p>创建索引首先要考虑的是列的可选择性。比较一下列中唯一键的数量和表中记录的行数，就可以判断该列的可选择性。如果该列的&ldquo;唯一键的数量表中记录行数&rdquo;的比值越接近于1，则该列的可选择行越高。在可选择性高的列上进行查询，返回的数据就较少，比较适合索引查询。相反，比如性别列上只有两个值，可选择行就很小，不适合索引查询。</p>
<p><br />
&nbsp;<br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=153" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=153</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[三层交换机比拼路由器]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-11-22T16:43:40+08:00</updated>
	  <published>2008-11-22T16:43:40+08:00</published>
		  <summary type="html"><![CDATA[<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三层交换机和<a target="_blank" href="http://www.jb-accp.com">路由器</a>都工作在网络的第三层，根据IP地址进行数据包的转发。许多网管员朋友对两者的区别不是很清楚，本文将简单介绍这两种技术及它们之间的区别。</p>
<p><a target="_blank" href="http://www.jb-accp.com">路由技术</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 路由器内部有一个路由表，标明了如果要去某个地方，下一步应该往哪走。<a target="_blank" href="http://www.jb-accp.com">路由器</a>从某个端口收到一个数据包，它首先把链路层的包头去掉(拆包)，读取目的IP地址，然后查找路由表，若能确定下一步往哪送，再加上链路层的包头(打包)，把该数据包转发出去；如果不能确定下一步的地址，则向源地址返回一个信息，并把这个数据包丢掉。</p>
<p>三层交换技术</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://www.jb-accp.com">三层交换</a>是相对于传统交换概念而提出的。传统的交换技术是在OSI网络标准模型中的第二层&mdash;数据链路层进行操作的，而三层交换技术是在网络模型中的第三层实现了数据包的高速转发。简单地说，三层交换技术就是二层交换技术＋三层转发技术。</p>
<p>两种技术的对比</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两者最根本的区别是<a target="_blank" href="http://www.jb-accp.com">三层交换机</a>也具有&ldquo;路由&rdquo;功能，三层交换机并不等于路由器，同时也不可能取代路由器。路由技术和二层交换看起来有点相似，其实路由和交换之间的主要区别就是交换发生在OSI参考模型的第二层(数据链路层)，而路由发生在第三层。这一区别决定了路由和交换在传送数据的过程中需要使用不同的控制信息，所以两者实现各自功能的方式是不同的。</p>
<p>具体而言，有下面几点区别：</p>
<p>1. 主要功能不变</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然<a target="_blank" href="http://www.jb-accp.com">三层交换机与路由器</a>都具有路由功能，但不能因此而把它们等同起来。就和现在许多宽带路由器不仅具有路由功能，还提供了交换机端口、硬件防火墙功能，但不能把它与交换机或者防火墙等同起来一样。因为路由器的主要功能还是路由功能，其他功能只不过是附加功能，其目的是使设备适用面更广、使其更加实用。这里的三层交换机也一样，它仍是交换机产品，只不过它是具备了一些基本的路由功能的交换机，它的主要功能仍是数据交换。也就是说它同时具备了<a target="_blank" href="http://www.jb-accp.com">数据交换和路由转发</a>两种功能，但其主要功能还是数据交换，而路由器仅具有路由转发这一种主要功能。</p>
<p>2. 使用场所不同</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三层交换机主要用于简单的<a target="_blank" href="http://www.jb-accp.com">局域网连接</a>。正因如此，三层交换机的路由功能通常比较简单，路由路径远没有路由器那么复杂，它用在局域网中的主要用途还是提供快速数据交换功能，满足局域网数据交换频繁的应用特点。而路由器则不同，它是为了满足不同类型的网络连接。虽然也适用于局域网之间的连接，但它的路由功能更多的体现在不同类型网络之间的互联上，如局域网与广域网之间的连接、不同协议的网络之间的连接等，所以路由器主要用于不同类型的<a target="_blank" href="http://www.jb-accp.com">网络</a>之间，它最主要的功能就是路由转发，解决好各种复杂路由路径网络的连接就是它的最终目的。</p>
<p>3. 处理数据的方式不同</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 路由器一般由基于微处理器的<a target="_blank" href="http://www.jb-accp.com">软件路由引擎</a>执行数据包交换，而三层交换机通过硬件执行数据包交换。三层交换机在对第一个数据流进行路由后，它将会产生一个MAC地址与IP地址的映射表，当同样的数据流再次通过时，将根据此表直接从二层通过而不是再次路由，从而消除了路由器进行路由选择而造成网络的延迟，提高了数据包转发的效率。同时，<a target="_blank" href="http://www.jb-accp.com">三层交换机</a>的路由查找是针对数据流的，它利用缓存技术，很容易利用ASIC技术来实现，因此，可以大大节约成本，并实现快速转发。而路由器的转发采用最长匹配的方式，实现复杂，通常使用软件来实现，转发效率较低。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 综上所述，<a target="_blank" href="http://www.jb-accp.com">三层交换机与路由器</a>之间有着非常大的本质区别。在局域网中进行多子网连接，最好选用三层交换机，特别是在不同子网数据交换频繁的环境中。路由器虽然路由功能非常强大，但它的数据包转发效率远低于三层交换机，更适合于数据交换不是很频繁的不同类型网络的互联。</p>
<p><br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=152" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=152</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[SOA在企业发展中地影响]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-11-20T16:36:46+08:00</updated>
	  <published>2008-11-20T16:36:46+08:00</published>
		  <summary type="html"><![CDATA[<p><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面向服务架构与我们传统意义中封闭式的应用有很多的不同。<a target="_blank" href="http://www.jb-accp.com">SOA架构</a>下的应用是多层次的，其生命周期也是具有多阶段性，并且有着高度的可重用性，随着企业的不断发展，来自其自身内部或者是外部的变化也会给其带来多方面的影响。它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的，它应该独立于实现服务的硬件平台、<a target="_blank" href="http://www.jb-accp.com">操作系统</a>和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 提供一个安全可靠并完全适用的SOA并非易事，由于所提到的这些复杂因素，需要通过不同的方式确保SOA质量问题。在一个复杂的<a target="_blank" href="http://www.jb-accp.com">系统环境</a>下，质量测试必须深入到各个环节，才能转化为高质量的交付应用。</p>
<p>架构与接口的连贯性</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;具有中立的<a target="_blank" href="http://www.jb-accp.com">接口</a>定义(没有强制绑定到特定的实现上)的特征称为服务之间的松耦合。松耦合系统的好处有两点，一点是它的灵活性，另一点是，当组成整个应用程序的每个服务的内部结构和实现逐渐地发生改变时，它能够继续存在。而另一方面，紧耦合意味着应用程序的不同组件之间的接口与其功能和结构是紧密相连的，因而当需要对部分或整个应用程序进行某种形式的更改时，它们就显得非常脆弱。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对松耦合的系统的需要来源于业务应用程序需要根据业务的需要变得更加灵活，以适应不断变化的环境，比如经常改变的政策、业务级别、业务重点、合作伙伴关系、行业地位以及其他与业务有关的因素，这些因素甚至会影响业务的性质。我们称能够灵活地适应环境变化的业务为按需(Ondemand)业务，在按需业务中，一旦需要，就可以对完成或执行任务的方式进行必要的更改。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 举例来说，<a target="_blank" href="http://www.jb-accp.com">架构与接口</a>必须遵循一定的政策和标准来在组织内部保持一致性。为了达到这样的连贯性，企业必须在设计和开发阶段就开始推动标准化和特定政策的实行。一旦可定义的政策开始实行，SOA资产中的连贯性和基本信任就算达成了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为一项服务资产推行信任的过程必须在该资产建立初期就开始实行。早期和持续的对于该资产质量的可视性能促进信任的建立和随后的重新利用。为了在促进早期信任，企业必须定义和实施在服务生命周期中支配其不同方面的政策。比如，支配着服务开发的政策：诸如计划合法性(W3C)，语意的标准一致性，WS-I一致性和采用WS-*标准的定义。此类政策对于达成连贯性和保证再利用和互用性是至关重要的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;政策也可以囊括最佳实践――普遍被接受的最佳实践以及与企业目标的底层服务相关的最佳实践。这些一般领政策包括：安全、可维护性、可靠性和性能，以及根据特定要求制定的所有其他政策。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;一旦政策被定义，那么对其的应用、验证、测试和测量将是至关重要的。我们必须使同步数据链路控制(SDLC)基础架构和流程自动化，以使得这些政策和标准能够通过开发、测试和质量团队一致的在SOA产物中应用。</p>
<p>持续回归<a target="_blank" href="http://www.jb-accp.com">测试</a>：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了正确有力的实施服务资产政策、合约、情景描述，企业必须通过一系列自动的、持续的回归测试来验证。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;作为每一个特定服务资产的生命周期的一部分，持续回归测试(在任何发布周期内)对于提供持续和可预测的质量都是必要的，这个测试必须是由业务需求所决定的，并包括功能需求、技术需求和性能预期。如果这些早期测试是由需求驱动的，那么质量部门将通过重新利用测试资产取得显著的优势。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了保障安全、可靠、一致的服务资产，通过资产注册表来进行集成是必要的。持续回归测试应该每夜自动建立并运行，而适当的测试数据可以通过中央资产注册表获得。那么测试将在不打断现存开发过程的情况下持续运行。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;这种自动测试保障了需求的自动验证和开发阶段与质量保证期间的测试资产重新利用。自动回归测试同时也能为应用软件政策实施提供文件证明，从而对更可预测的成果提供了保障。</p>
<p>SOA环境的<a target="_blank" href="http://www.jb-accp.com">复杂性</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个SOA环境中开发并保证功能是非常复杂的。系统的分布式性质和数据几乎使建立阶段性测试环境成为不可能。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOA的设计部分通常都需要使用未完成的或不可获得的服务，通过仿效服务来提供压缩服务是比较理想化的方式。一个开发员或质量工程师应该仿效服务并在早期就演练业务情景以在早期阶段就确认问题所在，并判断服务的正确性、更好的预测性能。</p>
<p>流程敏捷性与速度</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先进的平台可以保证一个提供速度与敏捷性的SOA基础设施以满足更加复杂的业务需求变化。但不幸的是，质量检测流程仍旧还停留在传统的连续程度。有效协作与积木式构建方式的质量解决方法会是针对SOA所带来的一系列复杂问题最为合适的方法。如果一个企业需要快速递增的可交付产品从而达到需要的敏捷性，那么仅仅通过这样传统的质量检测流程是绝对做不到的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面对<a target="_blank" href="http://www.jb-accp.com">SOA环境</a>下的新交付状况，在企业中必须完全改变这样的质量监测手法才能更好的受益于敏捷性变化所带来的好处。这样的话一个可重复，并以变化为基础的质量流程将会最大程度的体现SOA真正的敏捷性优势。在之前的测试过程中所使用到的测试方法在业务服务的演变过程将会得到有效的重用，从而提高敏捷性和速度反应。此外，设置连续性的回归测试套件将会给刚刚所提到的敏捷性增加带来显著的效果。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以变化为基础的测试可以让团队更好的共同合作，改变版本控制，了解影响范围等，这样的测试以节约时间为重，并提供更快更准确的完善解决方案。</p>
<p>整合</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;如何让业务合作伙伴更有效的整合到一起仍旧是一个停留在&ldquo;整合&rdquo;层面的难题。无论是对于任何两个以上的业务流程而言都必须得做出取舍和让步。这意味着即便是基于标准的生产和消费服务都会有难以避免的麻烦所在。为了消除在整合过程中所出现的问题，业务合作伙伴需要获得一份关于服务的&ldquo;健康报告&rdquo;，一个类似于包含备份与数据测试的报告从而可以对服务的交互起到监测调控作用。这可以有效的防止错误在整个周期的最开始时期就被体现出来，而这也可以在服务资产回归测试中暴露并得到解决。</p>
<p>发展和发展前期的准备</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在业务流程方面，<a target="_blank" href="http://www.jb-accp.com">架构师</a>将必须做出选择，从而确保某项特定的服务资产会是所有资产中最优先的。当然，对于这项服务的选择决非毫无缘由。架构师在做出决定之前必须能够验证他们所选择的服务资产所能表现出来的性能。这使得开发人员以及质量测试人员可以通过其连续不断的回归测试手段所能实现的更新结果去对自己的业务情况和业务流程有一个清楚准确的认识。<br />
&nbsp;<br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=151" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=151</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[几种普遍地“数据库对象”]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-11-18T17:51:34+08:00</updated>
	  <published>2008-11-18T17:51:34+08:00</published>
		  <summary type="html"><![CDATA[<p><br />
数据库对象是<a target="_blank" href="http://www.jb-accp.com">数据库</a>的组成部分，常见的有以下几种：</p>
<p>1、表（Table ）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://www.jb-accp.com">数据库</a>中的表与我们日常生活中使用的表格类似，它也是由行（Row） 和列（Column）组成的。列由同类的信息组成，每列又称为一个字段，每列的标题称为字段名。行包括了若干列信息项。一行数据称为一个或一条记录，它表达有一定意义的信息组合。一个数据库表由一条或多条记录组成，没有记录的表称为空表。每个表中通常都有一个主关键字，用于惟一地确定一条记录。</p>
<p><br />
2、视图（View）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://www.jb-accp.com">视图</a>看上去同表似乎一模一样，具有一组命名的字段和数据项，但它其实是一个虚拟的表，在数据库中并不实际存。在视图是由查询数据库表产生的，它限制了用户能看到和修改的数据。由此可见，视图可以用来控制用户对数据的访问，并能简化数据的显示，即通过视图只显示那些需要的数据信息。</p>
<p>3、索引（Index）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://www.jb-accp.com">索引</a>是根据指定的数据库表列建立起来的顺序。它提供了快速访问数据的途径，并且可监督表的数据，使其索引所指向的列中的数据不重复。</p>
<p>&nbsp;</p>
<p>4、缺省值（Default）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a target="_blank" href="http://www.jb-accp.com">缺省值</a>是当在表中创建列或插入数据时，对没有指定其具体值的列或列数据项赋予事先设定好的值。</p>
<p>5、图表（Diagram）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://www.jb-accp.com">图表</a>其实就是数据库表之间的关系示意图。利用它可以编辑表与表之间的关系。</p>
<p>&nbsp;</p>
<p>6、触发器（Trigger）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://www.jb-accp.com">触发器</a>是一个用户定义的SQL事务命令的集合。当对一个表进行插入、更改、删除时，这组命令就会自动执行。</p>
<p>7、规则（Rule）</p>
<p>&nbsp;&nbsp;&nbsp; 规则是对<a target="_blank" href="http://www.jb-accp.com">数据库表</a>中数据信息的限制。它限定的是表的列。</p>
<p>8、存储过程（Stored Procedure）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://www.jb-accp.com">存储过程</a>是为完成特定的功能而汇集在一起的一组SQL 程序语句，经编译后存储在数据库中的SQL程序。</p>
<p>9、用户（User）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所谓用户就是有权限访问<a target="_blank" href="http://www.jb-accp.com">数据库</a>的人。<br />
&nbsp;<br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=150" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=150</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[如何在J2ME中使用颜色 ]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-11-15T10:37:53+08:00</updated>
	  <published>2008-11-15T10:37:53+08:00</published>
		  <summary type="html"><![CDATA[<p>　　在<a target="_blank" href="http://www.jb-accp.com">J2ME</a>手机开发过程中，需要经常用到颜色来进行绘制，增强<a target="_blank" href="http://www.jb-accp.com">程序</a>的表现效果，下面就介绍一下如何使用颜色。</p>
<p>　　由于<a target="_blank" href="http://www.jb-accp.com">J2ME技术</a>比较简单，所以没有实现专门的颜色类，而只是使用RGB的概念来代表颜色。这里简单介绍一下RGB的概念，颜色是由红(Red)、绿(Green)、蓝(Blue)<a target="_blank" href="http://www.jb-accp.com">三原色</a>组成的，所以可以使用这三个颜色的组合来代表一种具体的颜色，其中R、G、B的每个数值都位于0-255之间。在表达颜色的时候，即可以使用三个数字来表达，也可以使用一个格式如0X00RRGGBB这样格式的十六进制来表达，下面是常见颜色的表达形式：</p>
<p>　　红色：(255,0,0)或0x00FF0000<br />
　　绿色：(0,255,0)或0x0000FF00<br />
　　蓝色：(255,255,255)或0x00FFFFFF</p>
<p>　　其他颜色可以通过上面的方式组合出来。</p>
<p>　　知道了颜色的表达方式以后，下面来介绍一下如何在<a target="_blank" href="http://www.jb-accp.com">J2ME程序</a>中使用颜色，涉及的方法均在Graphics类中，有以下几个：</p>
<p>　　1.getColor()：<br />
　　获得当前使用的颜色，返回值是0x00RRGGBB格式的数字。例如：<br />
　　int&nbsp; color&nbsp; =&nbsp; g.getColor();<br />
　　其中g为Graphics类型的<a target="_blank" href="http://www.jb-accp.com">对象</a>。</p>
<p>　　2.setColor(int&nbsp; RGB)：<br />
　　设置使用的<a target="_blank" href="http://www.jb-accp.com">颜色</a>。例如：<br />
　　g.setColor(0x00ff0000);</p>
<p>　　3.setColor(int&nbsp; red,&nbsp; int&nbsp; green,&nbsp; int&nbsp; blue)<br />
　　和上面的方法作用一样，例如：<br />
　　g.setColor(255,0,0);<br />
　　在设置了Graphics使用的颜色以后，再进行绘制的时候，就可以绘制指定的颜色了。</p>
<p>　　在<a target="_blank" href="http://www.jb-accp.com">J2ME手机编程</a>中，可以通过使用字体类??Font在低级用户界面中，获得更好的表现效果，那么如何使用Font类呢？</p>
<p><br />
　　首先，由于手机设备的限制，手机中支持的字体类型很有限，所以在<a target="_blank" href="http://www.jb-accp.com">J2ME</a>中只能使用手机支持的默认字体来构造Font类对象。下面是创建Font类的对象时使用的方法：</p>
<p>　　getFont(int&nbsp; face,int&nbsp; style,int&nbsp; size);<br />
　　例如：<br />
　　Font&nbsp; font&nbsp; =&nbsp; Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.&nbsp; SIZE_MEDIUM);<br />
　　无论哪一个参数，都只能使用<a target="_blank" href="http://www.jb-accp.com">系统设置</a>的数值，这些数值具体的大小在不同的手机上可能不同。下面对于其中的三个参数的取值做详细的介绍：</p>
<p>　　face参数指<a target="_blank" href="http://www.jb-accp.com">字体的外观</a>，其的取值：<br />
　　FACE_MONOSPACE??等宽字体<br />
　　FACE_PROPORTIONAL??均衡字体<br />
　　FACE_SYSTEM??系统字体<br />
　　style参数指字体的样式，其的取值：<br />
　　STYLE_BOLD??粗体<br />
　　STYLE_ITALIC??斜体<br />
　　STYLE_PLAIN??普通<br />
　　STYLE_UNDERLINED??下划线<br />
　　STYLE_BOLD&nbsp; |&nbsp; STYLE_ITALIC??粗斜体<br />
　　STYLE_UNDERLINED&nbsp; |&nbsp; STYLE_BOLD??带下划线粗体<br />
　　STYLE_UNDERLINED&nbsp; |&nbsp; STYLE_ITALIC??带下划线斜体<br />
　　STYLE_UNDERLINED&nbsp; |&nbsp; STYLE_ITALIC&nbsp; |&nbsp; STYLE_BOLD??带下划线的粗斜体<br />
　　size参数指字体的大小，其的取值：<br />
　　SIZE_SMALL??小<br />
　　SIZE_MEDIUM??中<br />
　　SIZE_LARGE??大<br />
　　通过上面的<a target="_blank" href="http://www.jb-accp.com">参数</a>的值，可以组合出你需要的字体对象。</p>
<p>　　下面是一些常用的字体操作：<br />
&nbsp;</p>
<p>　　1.&nbsp; 获得<a target="_blank" href="http://www.jb-accp.com">系统</a>的默认字体：<br />
　　Font&nbsp; font&nbsp; =&nbsp; Font.getDefaultFont();</p>
<p><br />
　　2.&nbsp; 在panit方法内部，假设Graphics参数的名称为g，则获得当前字体的方法是：<br />
　　Font&nbsp; font&nbsp; =&nbsp; g.getFont();</p>
<p><br />
　　3.&nbsp; 在panit方法内部，假设Graphics参数的名称为g，则设置当前字体的方法是：<br />
　　g.setFont(font)；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中font为你构造好的字体对象。</p>
<p><br />
　　4.&nbsp; 在MIDP2.0中，List可以设置每行的字体格式，方法是：<br />
　　list.setFont(0,font);<br />
　　则上面的<a target="_blank" href="http://www.jb-accp.com">代码</a>是将list中的第一行设置为font类型的字体。 <br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=149" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=149</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[常用的四种SQL命令]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-11-12T20:59:37+08:00</updated>
	  <published>2008-11-12T20:59:37+08:00</published>
		  <summary type="html"><![CDATA[<p><br />
1.查询数据记录(<a target="_blank" href="http://www.jb-accp.com">Select</a>)<br />
　　语法：Select 字段串行 From table Where 字段=内容<br />
　　例子：想从book表中找出作者为&quot;cancer&quot;的所有记录，SQL语句便如下：</p>
<p>select * from book where author=&rsquo;cancer&rsquo;</p>
<p><br />
　　&quot;*&quot;是取出book表所有的字段，如查询的字段值为数字，则其后的&quot;内容&quot;便无须加上单引号，如</p>
<p>是日期，则在Access中用(#)包括，而在SQL server中则用(&rsquo;)包括，<br />
如:</p>
<p>select * from book where id=1<br />
select * from book where pub_date=#2002-1-7# (Access)<br />
select * from book where pub_date=&rsquo;2002-1-7&rsquo; (SQL Server)</p>
<p><br />
　　提示：<br />
　　<a target="_blank" href="http://www.jb-accp.com">日期函数</a>to_date不是标准sql文，不是所有的数据库适用，所以大家在使用的时候要参考数据</p>
<p>库具体语法</p>
<p>　　另外如果是查询传入的变量，则如下：</p>
<p>strau=request.form(&quot;author&quot;)<br />
strsql=&quot;select * from book where author=&rsquo;&quot;&amp;strau&amp;&quot;&rsquo;&quot;</p>
<p><br />
　　如果查询的是数字，则：</p>
<p>intID=request.form(&quot;id&quot;)<br />
strsql=&quot;select * from book where id=&quot;&amp;intID</p>
<p><br />
　　在很多<a target="_blank" href="http://www.jb-accp.com">数据库</a>中，如：oracle，上面的语句是可以写成：</p>
<p>strsql=&quot;select * from book where id='&quot;&amp;intID&amp;&quot;'&quot;</p>
<p><br />
　　但是字符型一定不能按照数字格式写，需要注意。</p>
<p><br />
　　2.添加记录(Insert)<br />
　　语法：</p>
<p>Insert into table(field1,field2,....) Values (value1,value2,....)</p>
<p><br />
　　例子：添加一作者是&quot;cancer&quot;的记录入book表:</p>
<p>insert into book (bookno,author,bookname) values (&rsquo;CF001&rsquo;,&rsquo;cancer&rsquo;,&rsquo;Cancer无组件上</p>
<p>传程序&rsquo;)</p>
<p><br />
　　同样，如果用到<a target="_blank" href="http://www.jb-accp.com">变量</a>就如下：</p>
<p>strno=request.form(&quot;bookno&quot;)<br />
strau=request.form(&quot;author&quot;)<br />
strname=request.form(&quot;bookname&quot;)<br />
strsql=&quot;insert into book (bookno,author,bookname) values (&rsquo;&quot;&amp;strno&amp;&quot;&rsquo;,&rsquo;&quot;&amp;strau&amp;&quot;&rsquo;,</p>
<p>&rsquo;&quot;&amp;strname&amp;&quot;&rsquo;)&quot;</p>
<p><br />
　　3.用Recordset对象的Addnew插入数据的方法:<br />
　　语法：</p>
<p>rs.addnew<br />
rs(&quot;field1&quot;).value=value1<br />
rs(&quot;field2&quot;).value=value2<br />
...<br />
rs.update</p>
<p><br />
　　4.修改数据记录(Update)<br />
　　语法：</p>
<p>update table set field1=value1,field2=value2,...where fieldx=valuex</p>
<p><br />
　　例子：</p>
<p>update book set author=&rsquo;babycrazy&rsquo; where bookno=&rsquo;CF001&rsquo;</p>
<p><br />
　　如果用到变量就如下：</p>
<p>strno=request.form(&quot;bookno&quot;)<br />
strau=request.form(&quot;author&quot;)<br />
strsql=&quot;update book set author=&rsquo;&quot;&amp;strau&amp;&quot;&rsquo; where bookno=&rsquo;&quot;&amp;strno&quot;&rsquo;&quot;</p>
<p>&nbsp;</p>
<p>　　5.Recordset对象的Update方法:<br />
　　语法：</p>
<p>rs(&quot;field1&quot;).value=value1<br />
rs(&quot;field2&quot;).value=value2<br />
...<br />
rs.update</p>
<p><br />
　　注意：使用语法3和语法5的时候，一定要注意字段的类型（尤其是日期型）一致，否则出错的</p>
<p>几率非常的高。</p>
<p>　　例子：</p>
<p>strno=request.form(&quot;bookno&quot;)<br />
strau=request.form(&quot;author&quot;)<br />
set adocon=server.createobject(&quot;adodb.connection&quot;)<br />
adocon.open &quot;Driver={Microsoft Access Driver(*.mdb)};DBQ=&quot; &amp; _<br />
Server.Mappath=(&quot;/cancer/cancer.mdb&quot;)<br />
strsql=&quot;select * from book where bookno=&rsquo;&quot;&amp;strno&amp;&quot;&rsquo;&quot;<br />
set rs=server.createobject(&quot;adodb.recordset&quot;)<br />
rs.open strsql,adconn,1,3<br />
if not rs.eof then &rsquo;如果有此记录的话<br />
rs(&quot;author&quot;).value=strau<br />
rs.update<br />
end if<br />
rs.close<br />
set rs=nothing<br />
adocon.close<br />
set adocon=nothing</p>
<p><br />
　　6.删除一条记录(Delete)<br />
　　<a target="_blank" href="http://www.jb-accp.com">语法</a>：</p>
<p>Delete table where field=value</p>
<p><br />
　　例子：删除book表中作者是cancer的记录</p>
<p>delete book where author=&rsquo;cancer&rsquo;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=148" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=148</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[金融危机下，如何成就高薪工作]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-11-07T18:51:09+08:00</updated>
	  <published>2008-11-07T18:51:09+08:00</published>
		  <summary type="html"><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10月15日，第104届广交会正式拉开帷幕。作为中国外贸风向标，广交会在第一期就出现了门庭冷清的情况：来自欧洲和美国的订单大幅减少，中国出口行业正在经受着全球<a target="_blank" href="http://www.jb-accp.com">金融危机</a>和贸易信贷紧缩的打击。这种现象预示，在未来两三个月甚至更长时间里，我国出口业的&ldquo;冬天会很长&rdquo;。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面对<a target="_blank" href="http://www.jb-accp.com">国际经济形势</a>始终挥之不去的阴霾，据某权威新闻媒体报道，素有中国制造业中心之称的长三角地区已有大批中小型工厂倒闭，中国的房地产业也做起了&ldquo;俯卧撑&rdquo;。这无疑缩窄了08、09年应届大学毕业生的就业范围。</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 记者近日走访杭州地区<a target="_blank" href="http://www.jb-accp.com">人才市场</a>发现，大量贸易、<a target="_blank" href="http://www.jb-accp.com">房地产</a>专业毕业大学生纷纷开始转向就业情况较好的IT行业。虽然专业与行业不对口，一些大学生迫于就业压力，选择做收入不稳定，较辛苦的销售员。另一些已有详细规划的大学生，选择先参加IT培训再就业。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 毕业于浙江工业大学<a target="_blank" href="http://www.jb-accp.com">国际贸易</a>专业的李岚告诉记者：&ldquo;受金融海啸影响，找本专业工作很难。庆幸的是我在大学选修了计算机方面的课程。希望自己能往IT行业发展&rdquo;。由于李岚平时喜欢网络安全方面的小实验，所以他坚持自己先参加培训再工作。&ldquo;毕竟技术人才需要有项目经验才能找到工作。&rdquo;李岚深有感触地说。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不少人在金融危机中受到冲击，在<a target="_blank" href="http://www.jb-accp.com">金融危机</a>引起的裁员风波中面临失业、转行危机。为缓解社会就业压力，为有志青年提供进入IT行业的机会。北大青鸟就成了一棵救命稻草。北大青鸟是一个专门学习专业化职业技能和职业素质的学校，是全国的品牌IT教育培训机构。和多家知名企业签订了就业学员推荐协议，学员可以享受免费推荐就业机会，平均月薪可达4000元。避免金融危机带来的裁员影响，转行即拿高薪。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对此<a target="_blank" href="http://www.jb-accp.com">北大青鸟北京公学</a>培训中心，凭借出色的教学质量、严格的学员管理和完善的就业体系，成为北大青鸟精品中心，培养学员掌握专业化主流的计算机专业技能、具备良好的职业素质和丰富的项目实战经验，完全可以胜任主流IT企业的软件开发或者网络管理工作，为大批北大青鸟学员实现职业发展梦。不再担心自己会受金融危机的影响。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://www.jb-accp.com">北大青鸟北京公学</a>培训中心，凭借出色的教学质量、严格的学员管理和完善的就业体系，成为北大青鸟精品中心，培养学员掌握专业化主流的计算机专业技能、具备良好的职业素质和丰富的项目实战经验，完全可以胜任主流IT企业的软件开发或者网络管理工作，为大批北大青鸟学员实现职业发展梦。</p>
<p>&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=147" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=147</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[数据类型的转换 ]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-11-04T17:42:27+08:00</updated>
	  <published>2008-11-04T17:42:27+08:00</published>
		  <summary type="html"><![CDATA[<p>&nbsp;&nbsp; 刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解，本文将介绍一些常用数据类型的使用。</p>
<p>&nbsp; 我们先定义一些常见类型变量借以说明</p>
<p>int i = 15;<br />
long l = 3000;<br />
float f=162.3;<br />
double d=12345.123;<br />
char username[]=＂数据结构＂;<br />
char temp[100];<br />
char *buf;<br />
CString str;<br />
_variant_t v1;<br />
_bstr_t v2;</p>
<p>一、其它数据类型转换为字符串</p>
<p><br />
短整型（int）<br />
itoa（i,temp,10）;///将i转换为字符串放入temp中,最后一个数字表示十进制<br />
itoa（i,temp,2）; ///按二进制方式转换 <br />
长整型（long）<br />
ltoa（l,temp,10）;</p>
<p>二、从其它包含字符串的变量中获取指向该字符串的指针</p>
<p><br />
CString变量<br />
str = ＂数据结构类型＂;<br />
buf = （LPSTR）（LPCTSTR）str; <br />
BSTR类型的_variant_t变量<br />
v1 = （_bstr_t）＂字符串＂;<br />
buf = _com_util::ConvertBSTRToString（（_bstr_t）v1）;</p>
<p>三、字符串转换为其它数据类型<br />
strcpy（temp,＂123＂）;</p>
<p>短整型（int）<br />
i = atoi（temp）; <br />
长整型（long）<br />
l = atol（temp）; <br />
浮点（double）<br />
d = atof（temp）;</p>
<p>四、其它数据类型转换到CString<br />
使用CString的成员函数Format来转换,例如:</p>
<p><br />
整数（int）<br />
str.Format（＂%d＂,i）; <br />
浮点数（float）<br />
str.Format（＂%f＂,i）; <br />
字符串指针（char *）等已经被CString构造函数支持的数据类型可以直接赋值<br />
str = username;</p>
<p>五、BSTR、_bstr_t与CComBSTR</p>
<p><br />
CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。<br />
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR（＂数据＂）;///使用前需要加上头文件comutil.h<br />
反之可以使用char *p=_com_util::ConvertBSTRToString（b）;</p>
<p><br />
六、VARIANT 、_variant_t 与 COleVariant</p>
<p><br />
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。<br />
对于VARIANT变量的赋值：首先给vt成员赋值，指明数据类型，再对联合结构中相同数据类型的变量赋值，举个例子：<br />
VARIANT va;<br />
int a=2001;<br />
va.vt=VT_I4;///指明整型数据<br />
va.lVal=a; ///赋值</p>
<p>对于不马上赋值的VARIANT，最好先用Void VariantInit（VARIANTARG FAR* pvarg）;进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:</p>
<p>unsigned char bVal; VT_UI1 <br />
short iVal; VT_I2 <br />
long lVal;&nbsp; VT_I4&nbsp; <br />
float fltVal;&nbsp; VT_R4 <br />
double dblVal;&nbsp; VT_R8&nbsp; <br />
VARIANT_BOOL boolVal;&nbsp; VT_BOOL <br />
SCODE scode;&nbsp; VT_ERROR <br />
CY cyVal;&nbsp; VT_CY <br />
DATE date;&nbsp; VT_DATE <br />
BSTR bstrVal;&nbsp; VT_BSTR <br />
IUnknown FAR* punkVal;&nbsp; VT_UNKNOWN <br />
IDispatch FAR* pdispVal;&nbsp; VT_DISPATCH <br />
SAFEARRAY FAR* parray;&nbsp; VT_ARRAY|* <br />
unsigned char FAR* pbVal;&nbsp; VT_BYREF|VT_UI1 <br />
short FAR* piVal;&nbsp; VT_BYREF|VT_I2 <br />
long FAR* plVal;&nbsp; VT_BYREF|VT_I4 <br />
float FAR* pfltVal;&nbsp; VT_BYREF|VT_R4 <br />
double FAR* pdblVal; VT_BYREF|VT_R8 <br />
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL <br />
SCODE FAR* pscode;&nbsp; VT_BYREF|VT_ERROR <br />
CY FAR* pcyVal;&nbsp; VT_BYREF|VT_CY <br />
DATE FAR* pdate; VT_BYREF|VT_DATE <br />
BSTR FAR* pbstrVal;&nbsp; VT_BYREF|VT_BSTR <br />
IUnknown FAR* FAR* ppunkVal;&nbsp; VT_BYREF|VT_UNKNOWN <br />
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH <br />
SAFEARRAY FAR* FAR* pparray;&nbsp; VT_ARRAY|* <br />
VARIANT FAR* pvarVal;&nbsp; VT_BYREF|VT_VARIANT <br />
void FAR* byref;&nbsp; VT_BYREF</p>
<p><br />
_variant_t是VARIANT的封装类，其赋值可以使用强制类型转换，其构造函数会自动处理这些数据类型。<br />
例如：<br />
long l=222;<br />
ing i=100;<br />
_variant_t lVal（l）;<br />
lVal = （long）i;</p>
<p><br />
COleVariant的使用与_variant_t的方法基本一样，请参考如下例子：<br />
COleVariant v3 = ＂字符串＂, v4 = （long）1999;<br />
CString str =（BSTR）v3.pbstrVal;<br />
long i = v4.lVal;</p>
<p><br />
七、其它</p>
<p>对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据（DWORD）分解成两个16位数据（WORD）,例如：<br />
LPARAM lParam;<br />
WORD loValue = LOWORD（lParam）;///取低16位<br />
WORD hiValue = HIWORD（lParam）;///取高16位 <br />
对于16位的数据（WORD）我们可以用同样的方法分解成高低两个8位数据（BYTE）,例如:<br />
WORD wValue;<br />
BYTE loValue = LOBYTE（wValue）;///取低8位<br />
BYTE hiValue = HIBYTE（wValue）;///取高8位<br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=146" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=146</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[MSN登录常见故障两则解决办法]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-11-03T17:51:10+08:00</updated>
	  <published>2008-11-03T17:51:10+08:00</published>
		  <summary type="html"><![CDATA[<p>MSN登录常见故障两则解决办法</p>
<p><br />
1、出现&ldquo;0x81000370错误&rdquo;提示信息</p>
<p>和平时一样，登录MSN时，却弹出了&ldquo;0x81000370错误&rdquo;提示，试了几次，还是一样。最后卸载、安装了一遍MSN，结果还是一样。</p>
<p>首先，单击 IE&ldquo;工具&rdquo;菜单，选&ldquo;Internet 选项&rdquo;，在打开的&ldquo;常规&rdquo;窗口里，点击&ldquo;删除文件&rdquo;和&ldquo;删除 Cookies&rdquo;按钮。单击&ldquo;连接&rdquo;选项卡里的&ldquo;局域网设置&rdquo;按钮，然后取消&ldquo;自动检测设置&rdquo;框。单击&ldquo;连接&rdquo;选项卡里的&ldquo;高级&rdquo;按钮，拖动滚动条到安全选区，证实&ldquo;检查服务器证书吊销&rdquo;没有被选中，同时证实&ldquo;使用 SSL 2.0&rdquo;和&ldquo;使用 SSL 3.0&rdquo;被选中，然后按&ldquo;确定&rdquo;。</p>
<p>其次，点击&ldquo;开始&rarr;运行&rdquo;，输入&ldquo;regsvr32 softpub.dll&rdquo;。然后按&ldquo;确定&rdquo;。</p>
<p>最后，在MSN&ldquo;工具&rdquo;菜单上，单击&ldquo;选项&rdquo;。在&ldquo;连接&rdquo;选项卡上，确保您没有使用代理服务器，故障解决。</p>
<p>2. 出现&ldquo;1601错误&rdquo;提示信息</p>
<p>这可能和Windows Installer服务的损坏有关，修复Windows Installer服务就行。</p>
<p>但当在控制面板的服务管理工具中查看&ldquo;Windows Installer服务&rdquo;状态，一般为停用，当试图启用此服务，会发现此服务已被系统禁用，或是服务已被标记为删除。在不同系统中如何解决问题呢？</p>
<p>（1）Windows 2000</p>
<p>首先，按&ldquo;WIN+R&rdquo;，输入&ldquo;msiexec /unregserver&rdquo;命令，停止Windows Installer服务。</p>
<p>然后，下载InstMsiW.exe安装程序包，解压后进入目录中，右键点击&ldquo;msi.inf&rdquo;文件，选择&ldquo;安装&rdquo;，用同样的方法点击&ldquo;mspatcha.inf&rdquo;文件，选择&ldquo;安装&rdquo;。</p>
<p>最后，在命令提示符窗口中输入&ldquo;msiexec /regserver&rdquo;命令，启动Windows Installer服务即可。</p>
<p>（2）Windows XP</p>
<p>由于此系统已经集成了Windows Installer v2.0，因此不用再安装。</p>
<p>首先，使用记事本编写一个文件，将文件保存为&ldquo;.reg&rdquo;格式，内容如下：</p>
<p>Windows Registry Editor Version 5.00</p>
<p>[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetSevicesMS IServer]</p>
<p>&quot;ImagePath&quot;=-</p>
<p>&quot;ImagePath&quot;=hex　　(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52, <br />
00,6f,00,6f,00,74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d，00,33,00,32,00,5c00,6d,73,00,69,00,65,00,78,00, <br />
65,00,63,00,2e,00,65,00,78,00,65,00,20,00,2f,00,56,00,00,00</p>
<p>完成后，双击该文件，将文件内容导入注册表。</p>
<p>然后，重新启动电脑，按F8键进入安全模式，按&ldquo;WIN+R&rdquo;，输入&ldquo;msiexec /regserver&rdquo;命令，再重新启动，正常进入系统就解决问题了。<br />
&nbsp;<br />
&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=145" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=145</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[给程序员的一些推荐]]></title>
	  <author>
		 <name>accp</name>
		 <uri>http://www.jb-accp/Blog1/</uri>
		 <email>Nolan8@VIP.QQ.com</email>
	  </author>
	  <category term="" scheme="http://www.jb-accp/Blog1/default.asp?cateID=17" label="学习资料" /> 
	  <updated>2008-10-28T18:10:09+08:00</updated>
	  <published>2008-10-28T18:10:09+08:00</published>
		  <summary type="html"><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信息技术的更新速度是惊人的，程序员的职业生涯则是一个要求不断学习的过程，永远不能固步自封。本人在工作期间曾看见过很多程序员只要有闲暇时间就浏览一些没有太大作用的网页，在网上聊天，打游戏，浪费了大量的时间，十分不可取。而另外一种情况是，IT技术的日新月异使很多程序员眼花缭乱，什么都想学，却又不知从何学起，今天看看这个，明天学学那个，贪多不熟。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然IT技术发展迅速，但很多技术都是有规律可循，一些基本的概念、原理和方法还很通用，可以举一反三。本人根据自己的体会和经验，向那些刚刚踏入IT行业的新程序员们或正在迷茫的程序员们推荐程序员必须掌握的七种武器，有了这七种武器，虽不敢说笑傲江湖，但将自己立于不败之地还是可以的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一种武器：开发工具<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至少熟练掌握两到三种开发工具的使用，这是程序员的立身之本，其中C/C++和JAVA是我重点推荐的开发工具，C/C++以其高效率和高度的灵活性成为开发工具中的利器，很多系统级的软件还是用C/C++编写。而JAVA的跨平台和与WEB很好的结合是JAVA的优势所在，而本人对SUN公司的&ldquo;网络即计算机&rdquo;的概念相当欣赏，并相信JAVA即其相关的技术集JAVA One会成为未来的主流开发工具之一。其次，如果能掌握一种简便的可视化开发工具，如VB，PowerBuilder，Delphi，C++ Builder，则更好，这些开发工具减小了开发难度，并能够强化程序员对象模型的概念。另外，需要掌握基本的脚本语言，如shell,perl等，至少能读懂这些脚本代码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二种武器：数据库<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么数据库是如此重要？很多应用程序都是以数据库的数据为中心，而数据库的产品也有不少，其中关系型数据库仍是主流形式，所以程序员至少熟练掌握一两种数据库，对关系型数据库的关键元素要非常清楚，要熟练掌握SQL的基本语法。虽然很多数据库产品提供了可视化的数据库管理工具，但SQL是基础，是通用的数据库操作方法。如果没有机会接触商业数据库系统，可以使用免费的数据库产品是一个不错的选择，如mySQL,&nbsp; Postgres等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三种武器：操作系统<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前主流的操作系统是Windows，Linux/Unix，熟练地使用这些操作系统是必须的，但只有这些还远远不够。要想成为一个真正的编程高手，需要深入了解操作系统，了解它的内存管理机制、进程/线程调度、信号、内核对象、系统调用、协议栈实现等。Linux作为开发源码的操作系统，是一个很好的学习平台，Linux几乎具备了所有现代操作系统的特征。<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第四种武器：网络协议TCP/IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在互联网如此普及的今天，如果您还没有对互联网的支撑协议TCP/IP协议栈有很好的掌握，就需要迅速补上这一课，网络技术已改变了软件运行的模式，从最早的客户/服务器结构，到今天的WEB Services，再到未来的网格计算，这一切都离不开以TCP/IP协议栈为基础的网络协议支持，所以，深入掌握TCP/IP协议是非常必要的。至少，你需要了解ISO七层协议模型，IP/UDP/TCP/HTTP等常用协议的原理和三次握手机制。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第五种武器：DCOM/CORBA/XML/WEB Services<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着技术的发展，软件与网络的无缝结合是必然趋势，软件系统的位置无关性是未来计算模式的重要特征之一，DCOM/CORBA是当前两大主流的分布计算的中间件平台，DCOM是微软COM(组件对象模型)的扩展，而CORBA是OMG支持的规范。程序员需要做的不仅仅是利用商业的开发平台来开发软件，而是要理解这些技术的初衷，即为什么需要这项技术，如果你能理解了这一点，再回头看这些技术的具体实现，就如庖丁解牛，迎刃而解。 XML/WebServices重要性不言而喻，XML以其结构化的表示方法和超强的表达能力被喻为互联网上的&ldquo;世界语&rdquo;，是分布计算的基石之一。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第六种武器：软件工程与CMM<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现代大型软件系统的开发中，工程化的开发控制取代个人英雄主义，成为软件系统成功的保证，一个编程高手并不一定是一个优秀的程序员，一个优秀的程序员是将出色的编程能力和开发技巧同严格的软件工程思想有机结合，编程只是软件生命周期中的其中一环，优秀的程序员应该掌握软件开发各个阶段的基本技能，如市场分析，可行性分析，需求分析，结构设计，详细设计，软件测试等。一句话可以概括我的看法：&ldquo;创意无限，流程保证&rdquo;。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第七种武器：强烈的好奇心<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么才是一个程序员的终极武器呢，那就是强烈的好奇心和学习精神。没有比强烈的好奇心和学习精神更好的武器了，它是程序员们永攀高峰的源泉和动力所在。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.jb-accp/Blog1/article.asp?id=144" /> 
	  <id>http://www.jb-accp/Blog1/default.asp?id=144</id>
  </entry>	
		
</feed>
