日志存档:02, 2008

(转)三层/多层体系结构在VB编程中的应用讨论

2008-02-29,星期五 | 分类:编 程|VisualBasic | 244 views

本人于一年前收集了一个CSDN中的贴子,主题是“ VB三层(多层)实现大讨论! (发表时间:2001-12-28 11:46:06Z)”
本人没有完全研究明白里面的讨论,先删掉一些口水,整理出来发到下面。
欢迎大家踊跃发言。

================
gmp

1.三层体系结构将应用逻辑从Server或Client端剥离出来,放进中间的应用服务器;

2.这样就可以使的三者各司其职,减轻数据库服务器或客户端原来所承担的应用逻辑计算压力,可以大大加快分布式计算的效率:

(2.1)数据库服务器及其DBMS专司数据的存放和管理,相当于WinDNA中的数据层(Storage);

(2.2)应用服务器接受用户端的请求,从数据库服务器抓取数据送给客户端,相当于WinDNA中的逻辑层;(COM+)
(2.3)客户端向应用服务器提出请求,接受来自数据库服务器经应用服务器转发的响应数据,并以特定用户容易接受的形式显示,相当于WinDNA中的表现层(Forms+)。

3.三层体系结构具体实施方案
(3.1)VB/Delphi/C++Builder/Java Applet作为客户端软件开发平台和技术。
(3.2)应用服务器软件开发可以采用ASP+ADO,JSP+JAVA Bean+JDBC,J2EE/Servlet/JSP等技术。
(3.3)服务器采用Oracle、SQL Server或DB2等DBMS;

======================
panzijing(若无所思)

我正在做一个基于COM+的多层应用的项目,对COM+有一些肤浅的理解,也遇到不少问题,希望能多和大家交流.

另外,《Microsoft Visual Basic 6.0 分布式应用程序开发》是一本难得的好书,十分精辟,可是说是COM+的宝典书籍,推荐!! pzj@263.net

======================
white(white)

首先澄清一些观点,ASP的应用都是三层结构,这是错误的,用了组件就是三层结构,也是错误的。
Windows DNA所讲的三层乃是指数据访问层和商业逻辑层分开,商业逻辑层和用户表现层分开。
只要你的应用做到了这几点,那就可以叫是三层结构。不过要做到这几点,COM+的应用是绝对少不了的。
大家可以看看 .NET 中的三层应用的例子,其概念在不用 .NET时也是适用的。
首先,数据访问层可以封装在COM+中(比如什么连接串啊,建立连接、执行查询、更新数据等等)。
然后,商业逻辑本身用OO的方法就可以用对象来表达,所以封装在COM+里真是最合适不过。
最后,用户表现层是采用什么技术无关的,如果你是WEB应用,那么就用ASP好了,如果你是单机应用,那么用VB、VC、DELPHI都无所谓。用户表现层只负责数据的输入、输出等。

分了层,一个操作到底放在哪一层就成了要解决的问题。判断你的部署好与坏,问一下这两个问题:
1、如果数据库换了(从SQL SERVER换成了ORACLE),你需要重写逻辑层组件吗?
如果答案是否,那么你做得对,数据访问应当交给数据访问层,只需要换换数据访问层的组件就可以。
2、如果用户界面换了(从VB写的程序换成了WEB上的ASP),你需要重写逻辑层组件吗?
如果答案是否,那么你的分割做得很成功。

==============
还有一点需要强调的是,不要为了“三层”而“三层”。首先要理解为什么要分层,
三层应用可以带来的好处包括:
。可重用性(组件可重用)
。可维护性(分层查找问题,将问题空间缩小)
。性能的提高(动态连编库)
。支持分布式应用(DCOM,COM+)
。开发过程更简单、更快速(Microsoft提出321概念,三层应用两个人一个月搞定)
。any more…

如果你的应用需要获得这些特性,那么你应该考虑使用这种架构。
如果你只是做一个留言板,那根本没有必要将“逻辑”封装在组件中,但如果你是开发的一个企业管理系统,那你应该考虑采用它。

DNA也并非是唯一的解决方案,Microsoft已经用.NET代替了它,而来自竞争对手的SUN 公司有J2EE构架。

至于采取什么语言似乎没有必要过多的争论,.NET里语言无关。

==========================
c7654321(荷船)

我们现在做的项目是三层的,我感觉最大的难点在于同服务器组件的连接上,
其实这个论坛里好多关于COM+的BBS都是与三层有关,大家不妨去搜一下,一
定受益斐浅。
而三层的好处,我想安全性和缓解数据服务器的压力不能不说是两层无法实现
的优势。
==========================
halfdream(哈欠)

把一个应用系统划分为
数据库服务
+中间层(包括业务应用逻辑,也称为应用服务器)
+客户端(主要实现界面,尽可能少的涉及逻辑部分,也叫瘦客户)
这样的划分,不仅仅是软件在系统逻辑体系上的划分,也是软件在物理上的划分.
最关键的是应用逻辑的独立与封装.
常用实现它的分布式技术有几大类,COM/DCOM/COM+, CORBA,…
因为这是十进制标准.
你可以使用你喜欢的开发工具实现中间层,不过不推荐使用VB6开发.
========================
peihexian(只有初中学历)

多层的精髓我认为是:瘦客户端+中间层应服务器+后台RDBMS
实例方案1: 客户端为浏览器IE等 ,中间层为asp+MTS组件,后台数据库好处就是客户端瘦到什么也不用安装了,但打印等比较麻烦。
实例方案2: 客户端为VB程序,主要负责用户界面的显示和交互,中间层为dcom组件,负责数据的存取,业务逻辑等,后台数据库好处是客户端的界面可以做的比较漂亮,人机交互性比b/s结构要强,缺点是客户端要安装程序,要VBRUN*.dll等支持文件,不易维护,但这个分发的问题可以解决,只要一点技巧就可以了。
实例方案3: 客户端为delphi/bcb程序,只要一个可执行文件和midas.dll就可以了,中间层可通过corba/dcom/scoket/http等联接,可以把中间层写为mts/com+/corba组件,后台为数据库好处就是客户端分发容易,只要两件文件即可,与中间层交互方便,甚至可通过http 方式联接web上的中间层程序。
所以我认为,尽量不要用VB做三层的应用吧,成功的可能性比较小。
========================
kinglyq(陆追风)

业务层的抽取对于应用程序的分发、二次开发也有很大的帮助,
可以提供给用户(带有一定开发能力的)一套应用程序业务组件(也称接口组件),因为被抽象的业务组件的业务方法对应了现实的工作, 因此很容易理解并且是统一的(基于COM),用户可以利用自己擅长的开发工具对业务组件的方法等进行搭建创建用户层,开发出自己所满意的应用程序WEB应用程序),而开发者只要保持业务组件的接口,可以给用户进行组件升级,也不影响用户的二次开发成果。
所以说,三层式的应用程序架构好处大大的有!!
欢迎意同者与我联系, 大家探讨,my oicq:1236078

==========================
Bardo(巴顿(永远只有一个))

真正的三层结构:
数据层:即数据库可以随便换
逻辑层:所有业处理都在其中,是程序的核心。
界面层:可以随便更换,如可以VB,也可以WEB。

逻辑层组件并不需要担心多个用户同时访问远程的同步问题。
ADO有同步打开方式,并且,数据库有有效性限制!
关键主要是大系统的需求分析与系统分析。技术上有较好的程序员都能实现。     

来源:CSDN

(转)建立三层结构的asp应用程序

2008-02-29,星期五 | 分类:编 程|VisualBasic | 109 views

本文介绍了三层结构应用程序的概念和优点,并结合一个实例介绍了如何建立三层结构的asp应用程序。

一、两层结构的asp应用有何缺点
  在browser/server 应用程序开发领域,微软公司的iis/asp以其强大的功能,良好的扩展能力,及与其它微软产品的一致性,迅速地流行起来。它能使一个具有vb/vc经验的程序员,很快地成为一个web程序员,开发出看上去非常专业的应用。但是,asp有一个天生的缺点,就是asp代码和html代码是混在一起的,asp程序员既需要考虑与数据库打交道,需要关心如何与html配合,有时还需要用asp直接生成html代码。其结果是,当程序逻辑足够复杂时,.asp源文件非常长;而且,无论客户提出用户界面的改变,还是商业逻辑的改变(比如,在考试系统中,"合格"的标准可能从达到60分就算合格,改为进入前100名才算合格),都需要对.asp文件进行改动,而商业逻辑的改变,很可能需要改动很多文件。

二、三层结构的概念
  在传统的client / server应用中,也存在着上述同样的问题,多层结构的应用正是在对c/s 结构的总结基础上产生的,并且也已经扩展到了b/s应用开发领域。 即将应用划分为三层(可以有更多层,但三层最常见): 用户界面层,商业逻辑层,数据库层。 用户界面层负责处理用户的输入和向用户的输出,但并不负责解释其含义(出于效率的考虑,它可能在向上传输用户输入前进行合法性验证),这一层通常用前端工具(vb,vc,asp等)开发;商业逻辑层是上下两层的纽带,它建立实际的数据库连接,根据用户的请求生成sql语句检索或更新数据库,并把结果返回给客户端,这一层通常以动态链接库的形式存在并注册到服务器的注册簿(registry)中,它与客户端通讯的接口符合某一特定的组件标准(如com,corba),可以用任何支持这种标准的工具开发;数据库层负责实际的数据存储和检索。 有了这样的结构,上面的问题迎刃而解:还是以考试系统中的合格标准为例,在客户端所有需要显示合格人员名单的地方,调用这样一个函数getqualifiedlist,至于这个函数如何编写,如何与数据库打交道,以至访问的是何种数据库都与其无关(你一定有过这样的经历,在一种数据库系统上运行得很好的sql语句,有时换到另一种数据库系统上必须加以修改); 在中间层dll中实现这个getqualifiedlist函数,如果用户对"合格"的定义变了,只需要修改这个函数就可以了,只要此函数的入口参数和返回内容不变,在客户端不需作任何改动。在这里,我们看到了面向对象编程的特性之一封装性的优点,而这一点在开发大型应用时尤其有用–我们可以把开发人员分成两组,一组负责开发界面层,另一组负责开发商业逻辑层,双方只要按照事先商定的函数接口,并行地开发就可以,而不必向从前那样,后面的工作必须等前面的工作完成后才能开始。当然,这样的开发模式需要很好的项目协调和文档作支持。

  你也许会问,如果我把这些函数些在一个单独的文件中,再在需要调用的地方把它包含进来,不是同样能达到目的吗? 第一,这种方法效率不高,无论你把这些函数分散到多少个文件中,当你需要调用其中一个时,总会包含进一些实际上并不需要的函数,这无疑加重了服务器的负担,对服务器性能要求较高的web应用尤其如此。而dll只在需要时才调入内存且只调入需要的函数,并且多个应用程序实例可以共享同一个dll实例;第二,设想一个员工,有20个属性(工号,姓名,年龄,性别……),现在给定某工号,要求返回此员工所有信息。此时如果单纯用函数,只能定义20个全局变量,在函数中改变这些变量值,或者定义一个有20个传参(by reference)参数的函数。显然,第一种方法很麻烦而一旦增加一个属性后一种方法就需要更改函数接口。而在一个对象里,既包含成员方法(即函数和过程),也包括成员属性。如果我们采用对象的方法,则在函数中只需要改变对象的属性,在函数外可以直接引用改变了的对象属性值。这种方法有些类似第一种方法,但1.属性值无需在函数外逐一说明;2.这些属性值只属于对象,与对象无关的代码不会无意地改变属性值;3.一旦对象被释放,这些值会被一起释放。

三、如何开发三层结构的asp应用程序
  asp具有良好的扩充性,我们访问数据库时,采用的时ado对象,访问文件时,采用的是文件系统对象(fso),其实这时程序已经是三层结构的应用程序了,只不过由于是利用内置的对象而为意识到罢了。这些对象都遵循com/activex接口,因此我们自己开发的对象也要遵循这个接口。下面,我们就以上文提到的"合格& quot;标准为例,演示如何创建自己的三层结构的asp应用。

  1。在数据库系统中建立如下数据库表:

    employee: emplid char (5) not null,
          name  char (10) not null,
          gender char (1) not null,
          score   int not null
  此表存储员工信息和考试成绩,为简单起见,这里只包含工号,姓名和性别三项,并且只有一门考试,emplid为主键。

  2。建立动态链接库
  启动vb(这里以vb为例,你可以用你喜欢的任何支持activex接口的开发工具开发),新建一工程,工程类型为activex dll。在工程中新建一个类,取名为employee。你可以class builder可视化的向类中填加属性和方法,也可以直接手工编辑。首先填加emplid属性如下:
  private msemplid as string
  property let emplid(semplid as string)
   msemplid=semplid
  end property
  property get emplid() as string
   emplid=msemplid
  end property

  一般地讲,每一个属性都应该有property let和property get两个方法,它们分别当向属性赋值和读取属性值时被调用。如果某个属性只被赋值而从不被读取(这种情况多发生在对应数据库表的主键的属性上),则property get方法可以省略。property let方法不能省略。你可以仿照上面的程序再建立name,gender和score三个属性。然后创建如下方法:

  public sub create(emplid as string)
  dim conn as new connection
  dim rs as new recordset
  dim sql as string
  "suppose that you create a dsn in the control panel, the connectionstring property
  "can also be dsn-less string
  conn.connectionstring="dsn=dsnname;uid=username;password=pwd"
  conn.open
  sql="select * from employee where emplid="" & emplid & """
  with rs
   .open sql,conn,1,3
   if .eof and .bof then
     exit sub
   else
     msemplid=trim(.fields("emplid"))
     msname=trim(.fields("name"))
     msgender=trim(.fields("gender"))
     msscore=.fields("score")
   end if
   .close
  end with
  set rs=nothing
  conn.close
  set conn=nothing
  end sub
  这里根据emplid创建employee对象,注意数据库中的值是赋给三个私有变量,而不是直接赋值给属性,如果你单步调试就会发现,给msemplid赋值会调用property let emplid,也就是给属性赋值。
  下面我们再创建一个类employees,并填加如下方法:
  private colqualifiedlist as new collection
  private mncurrentindex as integer
  public sub getqualifiedlist()
  dim conn as new connection
  dim rs as new recordset
  dim sql as string
  "suppose that you create a dsn in the control panel, the connectionstring property
  "can also be dsn-less string
  conn.connectionstring="dsn=dsnname;uid=username;password=pwd"
  conn.open
  sql="select emplid from employee where score>=60 order by score desc"
  with rs
   .open sql,conn,1,3
   if .eof and .bof then
     exit sub
   else
     do while not .eof
       dim oemployee as new employee
       oemployee.create trim(.fields("emplid"))
       colqualifiedlist.add oemployee
       set oemployee=nothing
     loop
   end if
   .close
  end with
  set rs=nothing
  conn.close
  set conn=nothing
  end sub
  首先请注意vb中创建类实例的语法dim oemployee as new employee,后面会看到,在asp中创建类实例的语法是不同的。这个方法检索成绩大于等于60的员工工号,并据此创建一个employee对象,再将此对象加入私有的集合对象中。下面两个函数遍历集合中的元素:
  public function getfirst() as employee
   if colqualifiedlist.count>0 then
     mncurrentindex=1
     set getfirst=colqualifiedlist.item(1)
   else
     set getfirst=nothing
   end if
  end function
  public function getnext() as employee
   mncurrentindex=mncurrentindex+1
   if mncurrentindex>colqualifiedlist.count then
     set getnext=nothing
   else
     set getnext=colqualifiedlist.item(mncurrentindex)
   end if
  end function
  也许你会说,为何不把集合声明public,这样在asp中不是可以直接引用吗?确实,这样也行得通,编程实现起来也更简单些,但是,这样做破坏了封装性原则。因为数据以何格式存储完全是商业逻辑层的事,与用户界面层无关,假设有一天你因为每种原因放弃了用集合来存储数据的设计,而改用数组或记录集(recordset)来存储,那你只需要修改getfirst和 getnext两个函数,用户界面层完全无需修改。
  至此类文件创建完毕,将工程文件存为 test.vbp,选file菜单下的make test.dll选项将其编译。
  3.注册动态链接库
  启动web server 上的microsoft transaction server (start–windows nt optionpack4–inte.net information server–inte.net service manager),展开microsoft transaction server–computer–my computer–package installed,点鼠标右键选new–package–create empty package,输入包名test(这里test是任选的名字,不一定要与dll同名),ok-interactive user-the current logon user–finish。双击test–component,右键选component-new-component-install new component(s)– add file,选择你刚编译好的dll文件,mts会发现dll中有两个类employee和employees。至此dll注册完毕。

  4.编写asp程序
  <html><body>
  <p>qualified employee list</p>
  <table border=1 cellspacing=0 cellpadding=0>
  <tr>
   <td>employee id</td>
   <td>name</td>
   <td>gender</td>
   <td>score</td>
  </tr>
  <%
   set oemployees=server.createobject(&quot;test.employees&quot;)
   oemployees.getqualifiedlist
   set oemployee=oemployees.getfirst()
   do while not oemployee is nothing
  %>
  <tr>
   <td><%=oemployee.emplid%></td>
   <td><%=oemployee.name%></td>
   <td><%=oemployee.gender%></td>
   <td><%=oemployee.score%></td>
  </tr>
  <%
     set oemployee=oemployees.getnext()
   loop
  %>
  </table>
  </body></html>
  注意在asp中创建类实例的语法set oemployees=server.createobject(&quot;test.employees&quot;),其中 test是dll的名字,employees是类的名字; 当然,如果一个函数的返回值是一个对象,类似set oemployee=oemployees.getfirst()这样的语法也是可以的。
  至此,一个完整的三层结构的应用程序已经完成了,让我们看以下,如果把&quot;合格&quot;的定义改为:只有成绩进入前100名才算合格,程序需要做那些修改。事实上,如果你的数据库系统是sql server,你只需把sql语句改为:
  sql=&quot;select top 100 emplid from employee order by score desc&quot; 就已经可以了,即使为了跨数据库系统的兼容性,我们也只需要对getqualifiedlist做如下修改:

  ……
  sql=&quot;select emplid from employee order by score desc&quot;
  with rs
   .open sql,conn,1,3
   if .eof and .bof then
     exit sub
   else
     i=1
     do while (not .eof) and (i<=100)
       dim oemployee as new employee
       oemployee.create trim(.fields(&quot;emplid&quot;))
       colqualifiedlist.add oemployee
       set oemployee=nothing
       i=i+1
     loop
   end if
   .close
  end with
  …

  然后把dll重新编译,注册就可以了,asp程序完全不必修改。

四.一些说明和注意事项
  1. 由于这个例子比较简单,在employee类中可以没有create方法,而在employees类中将员工的所有信息(工号,姓名,性别,成绩)都读出来并将其赋给employee对象对应的属性。但在实际应用中,当employee对象的属性增多,或表的数量增多,表之间关系变复杂时,还是本文所示的方法更有效,代码重用的机会更大。

  2. 当dll被修改后,在mts中只能将其删除后重新注册,因为每次重新编译后在注册表中对象的id值都将重新生成。

  3. 从asp中调用带参数的类方法和函数时,所有的变量参数一定要用相应的类型转换函数转换后再传入,否则会引起类型不匹配错误,因为vbscript中只有variant类型,它不能自动转换成其它类型。例如,有如下的函数定义:

  public function fun1(p1 as string,p2 as integer) as integer
  end function
  在asp程序中应如下调用:
  <%
   p1=obj.property1 &quot; property1 is a string property
   p2=obj.property2 &quot;property2 is an integer property
   a=obj.fun1(cstr(p1),cint(p2))
   a=obj.fun1(&quot;aaa&quot;,10) &quot; constant parameter need not be changed
  %>

  而下面的两种写法是错误的:

  <%
   p1=obj.property1 &quot; property1 is a string property
   p2=obj.property2 &quot;property2 is an integer property
   a=obj.fun1(p1,p2) &quot; incorrect,p1 and p2 are variant variables
   p1=cstr(p1)
   p2=cint(p2)
   a=obj.fun1(p1,p2) &quot; still incorrect
  %>
  这里第二种写法仍然是错误的,即使经过了类型转换,p1和p2仍然是variant变量。在vbscript中,数据类型和类型转换函数只在表达式运算中起作用,变量只有variant一种类型。

结束语
  以上对多层结构的理论和实践进行了一番探讨,希望能对您的开发有所帮助。这里还有一个问题,即类和类的成员该如何设计。这既涉及面向对象编程的理论,也需要一定的实践经验。请参考相关的oop理论书籍并在实践中不断总结,相信您一定能设计出自己的完美的多层结构的应用程序。

来源:丰搜网

(原)Visual Basic TreeView Control Bug

2008-02-29,星期五 | 分类:编 程|VisualBasic | 162 views

‘当树中设置有图片,并一边加节点,一边选中,结果选中操作不实现

‘请先引用Microsoft Windows Common Controls 6.0 或5.0
‘加ImageList1,加上一张图
‘测试程序
Option Explicit
Dim arr_tmp(3)
Private Sub Form_Load()
arr_tmp(0) = "001"
arr_tmp(1) = "002"
arr_tmp(2) = "003"
arr_tmp(3) = "004"

Dim i As Integer
With Me.TreeView1(0)
    .Checkboxes = True
    For i = 0 To 3
    .Nodes.Add , , "f" & arr_tmp(i), arr_tmp(i), 1 ‘这里是图
    .Nodes("f" & arr_tmp(i)).Checked = True ‘<——-这个操作没有实现
    Next i
End With
End Sub

Microsoft.XMLHTTP对象

2008-02-29,星期五 | 分类:编 程|VisualBasic | 119 views
 
MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。
创建XMLHTTP对象的语句如下:
Set objXML = createObject(Msxml2.XMLHTTP) 或
Set objXML = createObject(”Microsoft.XMLHTTP”)
‘ Or, for version 3.0 of XMLHTTP, use:
‘ Set xml = Server.createObject(MSXML2.ServerXMLHTTP)
对象创建后调用Open方法对Request对象进行初始化,语法格式为:
poster.open http-method, url, async, userID, password
Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示:
http-method: HTTP的通信方式,比如GET或是 POST
url: 接收XML数据的服务器的URL地址。通常在URL中要指明 ASP或CGI程序
async: 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作
userID 用户ID,用于服务器身份验证
password 用户密码,用于服务器身份验证 
XMLHTTP对象的Send方法
用Open方法对Request对象进行初始化后,调用Send方法发送XML数据:
poster.send XML-data
Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。
XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
值 说明
0 Response对象已经创建,但XML文档上载过程尚未结束
1 XML文档已经装载完毕
2 XML文档已经装载完毕,正在处理中
3 部分XML文档已经解析
4 文档已经解析完毕,客户端可以接受返回消息
客户机处理响应信息
客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。客户机接收响应是通过XMLHTTP对象的属性实现的:
● responseTxt:将返回消息作为文本字符串;
● responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用;
● responseStream:将返回消息视为Stream对象。
AspHTTP组件的属性

Accept
指示什么样的MIME类型可以被请求程序接受
例如:
HttpObj.Accept = “*/*”

Authorization
授权头可以让你获得 需要验证身份的地方的url
用户名和口令之间用冒号点开
例如:
HttpObj.Authorization = “jimb:superbmr”

BinaryData
返回来自getURl请求获得的两进制格式的数据,你可以用这个属性取得两进制数据
如来自另一个web服务器的图片例如:
<%
Response.ContentType = “image/gif”
Set HTTPObj = Server.createObject(”AspHTTP.Conn”)
HTTPObj.Url = “/blog/upload/200562215730899.gif”
HTTPObj.GetURL
Response.BinaryWrite HTTPObj.BinaryData
%>

ContentType
这个属性允许你在POST***作时自定义content-type头
例如:
ContentType = “application/x-www-form-urlencoded”

Error
报告请求中发生的任何错误

FollowRedirects
FollowRedirects告诉组件跟随HTTP Server的重定向
例如:
HttpObj.FollowRedirects = true

Headers
Headers属性包含了在请求被调用GetURL处理完成之后,来自http请求的回应头
例如:
Response.Write HttpObj.Headers

Port
Port属性指示连接http服务器的端口号
例如:
HttpObj.Port = 80

PostData
PostData属性应该被设置为你希望post请求POST到web服务器的数据的值
例如:
HttpObj.PostData = “suid=jimb&act=upd”

Protocol
指示请求应该使用的http协议版本号,缺省值是HTTP/1.0
例如:
HttpObj.Protocol = “HTTP/1.1″

Proxy
proxy属性包含proxy server代理服务器的地址/端口,冒号点开
例如:
HttpObj.Proxy = “address.net:2001″

ProxyPassword
设置需要验证的http代理服务器的http代理密码,现在只支持basic authentication(基本验证)

RequestMethod
RequestMethod属性指示发给服务器http请求的类型,合法的值是”GET”, “POST” 和 “HEAD”.
例如:
HttpObj.RequestMethod = “POST”

RegisteredUser
RegisteredUser属性指示组件授权用户的名字
例如:
Response.Write “This component is licensed to ” & HttpObj.RegisteredUser

Response
Response属性包含在收到web服务器过来的请求之后的http response回应

SaveFileTo
SaveFileTo允许你得到任何类型的文件,自动存到本地盘上。图形/文本/HTML文件均可以。
例如:
HttpObj.SaveFileTo = “c:\images\3rdqrtr.jpg”

TimeOut
timeout属性决定组件等待http server响应的时间
例如:
HttpObj.TimeOut = 45

URL
URL属性设定你希望request请求所***作的url,以http://开头
例如:
HttpObj.URL = “http://www.myfinancial.com/scripts/update3.asp”

UserAgent
UserAgent让组件通过发送一个request的UserAgent头伪装浏览器
例如:
HttpObj.UserAgent = “Mozilla Compatible (MS IE 3.01 WinNT)”

Version
指示AspHTTP组件的版本
例如:
Response.Write “The component version is ” & HttpObj.Version

AspHTTP组件的方法

方法 参数 返回值 描述
GetURL 无 String 返回http请求的响应,这是一个字符串,组件不支持2进制返回值,如Gif/Jpg图像
AddExtraHeader String 无 在请求内增加一个自定义的http头,自定义头可以包括模拟的浏览器头,例如IE的分辨率信息头
ClearExtraHeaders 无 无 清除所有AddExtraHeader设置的http头
GetHeader String String 在GetUrl调用之后,获得自定头的值,如果有多个头,返回第一个。要检索所有的头,请看GetHeaders
Example:
strCookie = HttpObj.GetHeader(”Set-Cookie”)
You could then on subsequent calls return the same cookie as follows:
if strCookie <> “” then
HttpObj.AddExtraHeader “Cookie: ” & strCookie
end if
GetHREFs 无 Variant 字符串数组,在调用GetUrl之后,你可以调用GetHREFs处理html里面的<a href=”"> Tags.
GetHREFs返回一个你可以进一步处理或显示的字符串的可变数组
请见HREFList.asp(下载包内有)使用这个方法的示例代码,GetHREFs是在aspHTTP版本2.4增加的。
URLDecode strValue String 解码一个URL编码的字符串
URLEncode strValue String 将一个字符串编码成一个合法的url值
Example:
HttpObj.URL = HttpObj.URLEncode(”http://www.test_xyz.com?avalue=this is a value with spaces”)

来源:未知

Google员工管理的十大关键原则

2008-02-19,星期二 | 分类:人力资源|项目管理 | 132 views

在Google,我们认为商业管理学的宗师彼得-德鲁克对于如何管理“知识型员工”的理解最为深刻。毕竟,这个词是由德鲁克于1959年发明。德鲁克说知识型员工相信自己拿工资是为了出效率,而不是为了完成朝九晚五的呆板工作,而聪明的企业会“排除任何影响‘知识型员工’工作的障碍”。这些成功经验将吸引最好的员工,并且保证“未来25年竞争优势的唯一且最大的因素。”

在Google,我们寻求这种优势。当前关于大型企业是否对于知识型员工处置失当的争论是我们慎重对待的问题之一,这是因为无法正确处理该问题的企业将被出局。我们从其他地方以及内部讨论得出得到很多好的想法。以下几条就是我们在最大化知识化员工效率方面所采用的关键原则。与大多数技术公司一样,我们的许多员工都是工程师级别的,因此我们将以这个特殊群体为主,但其中很多原则对于所有知识型员工均适用。

一、组织委员会,严格招聘

实质上每个参加Google面试的人至少与六位面试官交谈过,后者均是公司管理层面或潜在同事组成的。每个人的观点都算数,从而使招聘程序更加公平,标准更高。当然,花费的时间会长一些,但我们认为值得。如果希望招到优秀的员工,那么经过严格的招聘程序,你会得到更加优秀的员工。公司创立之初我们就开始构建这种积极的反馈循环,直到现在已经从中获得了巨大回报。

二、满足员工的所有需要

正如德鲁克所说,管理目标是“排除任何影响他们工作的障碍。”我们为他们提供了一整套标准的额外利益,但首先是一流的餐饮设施、体育馆、洗衣房、按摩室、理发厅、洗车房、干洗房、接送班车等,几乎任何一位勤奋工作的工程师所需的一切。我们可以这样分析:程序师乐意开发程序,他们不喜欢洗衣服。那么我们就让这两件事情变得同时简单起来。

三、拉近员工距离

Google的几乎每个项目都是小组项目,每个小组之间都必须进行交流合作。最好的让交流变得简单的方式就是让每个小组成员都近在咫尺。因此实质上 Google的所有员工分享一间办公室。这样,当某位程序师需要与一位同事协商时,就能马上找到对方:没有电话号码标签、没有电子邮件拖延、不用等待答复。当然,Google还有很多会议室供人们进行详细讨论,从而不会打扰各自的办公助手。即使是公司CEO,在来到Google后数月才得到一间办公室。和一个学识丰富的员工比邻而居,委实是一种高效的培训经验。

四、使合作简单协调

由于一个小组的所有成员都近在咫尺,因此在协调项目开展方面就相对容易些。除了身体保持近距离外,每位Google员工每周还向其所在工作组发送电子邮件回报上周的工作成绩。这样就能让每个人都能简单地跟踪其他成员的工作进度,更加容易地监控工作进程,并同步工作流程。

五、身体力行,使用自己的产品

Google员工都很频繁地使用公司开发的各种工具。最常见的就是为所有项目和任务而建内部网页组成的网络。这些网页都被索引并以按需访问的策略向项目参与者开放。我们对其他信息管理工具的用户进行了扩展,其中某些将最终以产品的形式对外推出。譬如Gmail成功的原因之一就是它曾在公司内部测试达数月之久。电子邮件主要用于组织信息,所以Gmail被不断改进,直至满足最大需求的消费者——我们的知识型员工的需要。

鼓励创新

Google工程师们可把20%的工作时间放在自选项目开发上。当然其中必须有一个批准过程以及某些失败,但基本上我们希望让所有富有创意的人们发挥创意。我们有一个公开的秘密武器,就是创意邮件目录:一个全公司共用的建议箱。任何人都可以把自己的创意发送到这里,从停车程序到下一代应用程序等等。在这里所有人都可以对创意发表评论、进行评价,从而促使最佳创意浮出水面。

六、尽可能统一意见

现代企业神话中都有一个英雄般的独特决议制订者。我们坚信“群众的智慧”这一理念,并希望在确定任何决议之前收集广泛的观点作为分析基础。在 Google,管理者的角色是一个观点的收集者,而不是决策的独裁者。统一大多数人的意见有时要花费较长时间,但通常可以组成一个更加忠诚的工作组和更为明智的决策。

七、不作恶

很多人曾经对Google的这一口号做过描写,但我们确实试图以此为工作指导,尤其在管理方面。就像任何组织的成员都对他们的观点充满热情一样。但在 Google,不会有人反对这一原则,不想其他某些知名技术公司管理习惯那样。我们努力创建一种充满宽容和尊重的工作氛围,而不是让公司里充满满嘴只会说是的人。

八、数据决定决策

在Google,几乎所有决策都是基于大量分析后得出。我们创建了多种管理信息的系统,不止是大方面的互联网,还有内部联网。我们有很多分析师专门研究数据,分析各种执行标准然后总结出发展趋势,从而使我们尽可能地跟上时代的步伐。我们为每个研究项目都建立了大量在线“仪表板”,从中获得最新的状态现状。

有效地交流

每周五公司所有员工都集合在一起,共同获得公司公告,业务介绍,解决各种问题(还有一些食物和饮料)。通过这种方式,管理层能够密切接触并及时了解知识型员工的所想,员工也能对管理层的想法有所了解。Google对组织内的信息分发进行了极大的扩展,并重点弥补了少数严重疏漏。与某些外界想法不同,我们认为值得信赖的劳动力才是忠实的工作团队是所有结果的第一真理。

发展道路上的潜在障碍

当然,我们公司不止遵守以上规则,其中许多在硅谷非常普遍。同时,我们意识到随着公司的发展,我们必须不断改进自己的管理技术。我们(以及其他类似于我们的公司)还面临很多问题。

第一就是“技术自大”问题。工程师们之间的竞争是自然的,并且他们难以容忍那些积极性或学识不如自己的人。但几乎所有工程项目都是小组项目,因此小组中出现头脑聪明但顽固不化的人对于整个工作都是致命的。如果我们在一封推荐信中看到“我所见过的最聪明的人”以及“我再也不想跟他们一起工作”的字眼,那么我们绝对不会通过他们的提议。普及同级人员面试的原因之一就是为了确保小组成员热情欢迎新成员的加入。我们的很多优秀员工在小组创建等方面都是楷模,因此我们希望继续保持这种方式。

与之相关的就是NIH症候群(not-invented-heresyndrome,“与我无关综合症”)。一个好的工程师通常坚信自己能够开发一套比现有系统更加完善的系统,并且以“创建而不购买”为信念。当然,他们或许是正确的,但我们却必须以极大的代价关注这些项目。有时这也意味着超出了公司的产品和服务界限。

还有一个问题也是我们未来几年将要面对,即公司、产业及内部劳动力将最终成熟起来。不止是我们,连同业内其他公司目前都处于一个告诉发展阶段,但这个阶段不会成为永久。我们中的很多员工都是刚走出校园的大学毕业生;其他的都有家庭以及丰富的工作经验。他们有着不同的兴趣和需求,因此我们必须提供可吸引所有年龄段员工的福利和工作环境。

最后的问题是确保Google成长过程中,通讯程序能够跟的上公司的扩展。周五例会对于山景镇的工作小组非常适用,但是现在的Google已经成为一个全球组织。

我们一直注重创新和改革,但这并不是Google的唯一。我们还必须管理日常运作,这也不是一项简单的任务。我们将建造比历史上已存的,更加庞大、复杂和要求更加严格的技术基础设施。这些系统必须持续发展不断满足不断增加的一系列要求,因此计划、执行并维护这些系统的人还必须具有强烈的积极性。在 Google,日常运作不是简单的事后三思:它们对于公司的成功有着至关重要的作用,同时我们希望在新产品开发中,能够取得像现在的统治领域一样的成绩和发明。

(转)如何用家用数码相机拍摄1寸2寸标准证件相

2008-02-09,星期六 | 分类:综合分类|经典收藏 | 134 views

到相馆里拍个证件相要8元钱左右,但洗张6寸的相片也就1元钱左右,基于成本考虑,很多人非常想用手头的家用数码相机给自己拍个证件相,以备各种用途.

     如果你和相馆的人熟,他们会帮你的数码相裁剪成证件相的大小,要不然只好自己动手
     没有经过PS处理(photoshop的简称PS)的相片,一般还不适合冲洗证件相

首先你要了解证件相的大小
如:普通1寸相 25X35mm 如简历,证件22X32mm 如驾驶证,身份证 26X32mm ,毕业证大一寸 33X48mm

         我们要冲洗的是6寸/4R的相片尺寸: 6X4英寸 15.24×10.16 (厘米)
本文以 2.2X3.2 (厘米)的一寸证件相为例

          还要了解,相片使用的背景色,以前的证件大多用红蓝色,现在开始流行白色,如新的驾驶证和身份证,红底的请准备一块红布或在photoshop后期处理也行,白底可以用墙来做背景,注意增加两侧灯光,以免产生阴影。

    需要的设备:
1.数码相机 (没它不行)
2.三脚架    (固定相机,稳定为避免抖动,而且操作也方便很多)
3.一面白色/红布的背景墙   (后期PS处理简单些)
4.读卡器及家用电脑 (用读卡器将相片输入电脑里)
5.PhotoShop软件 (这是本文的重点)

    准备:
1.用三脚架起相机在离墙1.5至2米的位置,能拍到人的半身为宜
2.相机的高度正好与人的面部等高
3.可以坐着,没有三脚架也可以用桌子或其它固定物替代
4.使用自然光时光线要充足
5.最好穿深色有领衣服,露出部份脖子,免冠

    开拍:

     1.目光要看着镜头
     2.上下左右调整头部使的两只耳朵要看得见,如果是自拍,多试几张来调整自己的位置
     3.如果室内光线不足,要用闪光补光,调好补光值,调好白平衡,建议用手动档拍摄,或P档程序爆光档
     4.相机一般都有延时功能,记得要用它,自拍用10秒,一般拍摄用2秒,目的是让手离开相机后才自动拍摄,减少抖动
     5.注意,请不要在这么近的距离对着小孩开闪光灯,伤害眼睛,拍小孩要选择在室外光线充足,或室内一定人有辅助光线
     ,柯嚓,柯嚓……
     好了,一下子已经拍了N 张了,反正拍多几张不花钱,是的,如果是初次拍,那么从N张中选出一张满意也是不难的

    冲洗前的后期处理:

     这时拿相片去冲洗的话是不行的,我们要在电脑里裁成标准的尺寸
     输入相片到电脑里,我们选择了一张最好的

标准相:

    注:为了看上去舒服些,就不用上面那张了,随便在网上找了一张活勃的为例,以免别人说我抄教程,呵:),仅为了讲讲PS软件的操作方法,实际证件的规格请参考标准证件。

用photoshop软件打开这张图片
点击右边的裁切工具,如图
        
     在上属性栏中填入1寸相的参数如上,在分辩率118.11像素/厘米约等于300像素/英寸
     拉动载切工具如下图,证件相头部要占相片的2/3,或参考标准证件.
     注:图片裁切出来后,点击菜单-图像-图像大小,将图片的文档大小调整成2.2X3.2厘米,300像素/英寸,实际操作中你可以加大一毫米作为裁剪如(2.3X3.3)
        

     另新建一个文件
        
     修改参数为6寸相片尺寸,注:这就是刚才修改一寸相为300像素/英寸的目的,保证合并后的图片相对大小
        
     生成一个6:4比例的6寸规格相片底板,为了以后洗出的相片容易裁剪,这里填充淡绿色到这个背影上
        
     由于本图背景简单,用套索工具,很容易就去底,并用纯白色填充底色(驾驶照要求白底相片),将一寸相拖到6寸相中
        
     按住ALT键,鼠标左键拖复制出另一图,此时不要放开鼠标和ALT键的手指,同时再按下Shift键,这时的复制是横向对齐的,放开鼠标后得到如图:
        
     Shift+ALT+鼠标配合复制整齐的图片以下,完成保存
        

提示:对齐的要决是,横向复制完成后,按住Shift键左右调整间距,然后合并一排六张1寸相,然后用此法向下复制,这就得到18张上下左右对齐的相片了,到时用裁刀一裁就出来了

     把这相考到U盘拿出冲洗吧!
     本人利用此方法自拍了证件照!

来源:游泳的鱼 www.kxpp.com

超强的声音模仿,不收藏太可惜了(七巨星版 老鼠爱大米- 江梁) & 江梁和杨帆在央视的模仿PK秀

2008-02-08,星期五 | 分类:休闲娱乐|音影收藏 | 标签: | 318 views

这个强人名叫 江梁

江梁和杨帆在央视的模仿PK秀

(转)如何在SQL Server数据库中加密数据

2008-02-08,星期五 | 分类:数据库|SQLServer | 111 views

 为了防止某些别有用心的人从外部访问数据库,盗取数据库中的用户姓名、密码、信用卡号等其他重要信息,在我们创建数据库驱动的解决方案时,我们首先需要考虑的的第一条设计决策就是如何加密存储数据,以此来保证它的安全,免受被他人窥测。

  SQL Server中有哪一种支持可以用于加密对象和数据?从一开始就讨论一下SQL Server欠缺什么是明智的,或者是对于SQL Server中的加密部分你不应该做什么。

  首先,SQL Server有两个内置的密码函数——即,pwdencrypt() 和 pwdcompare()。同时,还有两个SQL Server用来管理密码哈希的没有正式记录的函数:pwdencrypt() 将密码哈希过后进行存储;pwdcompare()将提供的字符串与哈希后的字符串进行比较。不幸的是,这个哈希函数不是非常安全,它可以通过字典攻击算法被破解(类似命令行应用程序!)。

  这些函数随着SQL Server的版本发展而不断进行修改,这也是另一个没有使用它们的原因。早期版本的SQL Server对密码进行的哈希,在后来的版本中无法解密,所以如果你依赖一个版本中的函数,那么当升级的时候,所有你的加密数据就都没有用了,除非你可以首先对其解密——这也就违背了加密的最初的目的。

  第二,你可能会尝试去创建一个针对你的数据库的自制的加密解决方案,但是有以下三个理由说明你不要这样做:

  除非你是加密专家,否则胡乱编写的加密系统只会提供非常低级的价值不高的保护。新鲜的是,单向密码哈希或者 "ROTx "形式的加密几乎不需要费事就可以被轻松打败。

  如果由于你自己的能力的缺乏而导致加密被破解,那么你的数据就完蛋了。你需要将所有的东西进行没有加密的备份,是吗?(即使你加密了,那里有没有安全漏洞?)

  当市面上提供有专业级别的,具有工业强度的加密解决方案的时候,你就不值得花费时间去自己做。把你的时间用于构建一个好的,坚固的数据库,而不是再重新发明一次车轮。

  那么,什么才是好的加密数据的方式呢?

  对于新手,微软提供了一个自己生成的加密解决方案,CryptoAPI 。对于轻量级的加密,军用级别的安全就不在考虑范围之内,它具有相对容易实现的优势:管理员可以安装一个名为CAPICOM 的ActiveX 控制,它可以在T-SQL存储过程中提供CryptoAPI 功能。CAPICOM 支持各种类型的双向加密和单向哈希算法,所以管理员可以挑选最适合应用程序的问题的部分。

  如果你对使用微软的解决方案不感兴趣,还有一些很好的第三方的方案可以使用。一家名为ActiveCrypt 的软件有限责任公司制造了XP_CRYPT ,它是SQL Server的插件,可以在视图、程序和触发器中通过扩展存储过程和用户自定义函数(在SQL Server 2000中)来完成加密。你可以下载一个支持无线的MD5,DES ,以及SHA1哈希的免费版本的应用程序;其他的加密模型就是在比特深度上进行的。(完全版本是无限的。)在你自己的代码中,你可以使用XP_CRYPT,与ActiveX 控制一样(在受限的免费版本中)。对于ASP程序员来说,一个名为AspEncrypt 的组件提供了一种将高级加密整合到你的代码中的简单方式。

  对数据库文件自身进行加密或者提供传输层上的安全保护怎么样?对于前者,大家可以在Windows系统中持续使用加密文件系统。然而,你必须保存加密密钥的备份,在出现问题的时候,这个数据有可能会丢失。对于后者,有IPSec和SQL Server自己的SSL加密,都是SQL Server和Windows自带的大家的主要精力应该放在避免以明文存储敏感数据,因为从数据库中抽取没有加密的数据同样是最容易受到攻击的薄弱环节。

如何在SQL Server数据库中加密数据

2008-02-08,星期五 | 分类:数据库|SQLServer | 标签: | 120 views

为了防止某些别有用心的人从外部访问数据库,盗取数据库中的用户姓名、密码、信用卡号等其他重要信息,在我们创建数据库驱动的解决方案时,我们首先需要考虑的的第一条设计决策就是如何加密存储数据,以此来保证它的安全,免受被他人窥测。

SQL Server中有哪一种支持可以用于加密对象和数据?从一开始就讨论一下SQL Server欠缺什么是明智的,或者是对于SQL Server中的加密部分你不应该做什么。

首先,SQL Server有两个内置的密码函数——即,pwdencrypt() 和 pwdcompare()。同时,还有两个SQL Server用来管理密码哈希的没有正式记录的函数:pwdencrypt() 将密码哈希过后进行存储;pwdcompare()将提供的字符串与哈希后的字符串进行比较。不幸的是,这个哈希函数不是非常安全,它可以通过字典攻击算法被破解(类似命令行应用程序!)。

这些函数随着SQL Server的版本发展而不断进行修改,这也是另一个没有使用它们的原因。早期版本的SQL Server对密码进行的哈希,在后来的版本中无法解密,所以如果你依赖一个版本中的函数,那么当升级的时候,所有你的加密数据就都没有用了,除非你可以首先对其解密——这也就违背了加密的最初的目的。

第二,你可能会尝试去创建一个针对你的数据库的自制的加密解决方案,但是有以下三个理由说明你不要这样做:

除非你是加密专家,否则胡乱编写的加密系统只会提供非常低级的价值不高的保护。新鲜的是,单向密码哈希或者 “ROTx “形式的加密几乎不需要费事就可以被轻松打败。

如果由于你自己的能力的缺乏而导致加密被破解,那么你的数据就完蛋了。你需要将所有的东西进行没有加密的备份,是吗?(即使你加密了,那里有没有安全漏洞?)

当市面上提供有专业级别的,具有工业强度的加密解决方案的时候,你就不值得花费时间去自己做。把你的时间用于构建一个好的,坚固的数据库,而不是再重新发明一次车轮。

那么,什么才是好的加密数据的方式呢?

对于新手,微软提供了一个自己生成的加密解决方案,CryptoAPI 。对于轻量级的加密,军用级别的安全就不在考虑范围之内,它具有相对容易实现的优势:管理员可以安装一个名为CAPICOM 的ActiveX 控制,它可以在T-SQL存储过程中提供CryptoAPI 功能。CAPICOM 支持各种类型的双向加密和单向哈希算法,所以管理员可以挑选最适合应用程序的问题的部分。

如果你对使用微软的解决方案不感兴趣,还有一些很好的第三方的方案可以使用。一家名为ActiveCrypt 的软件有限责任公司制造了XP_CRYPT ,它是SQL Server的插件,可以在视图、程序和触发器中通过扩展存储过程和用户自定义函数(在SQL Server 2000中)来完成加密。你可以下载一个支持无线的MD5,DES ,以及SHA1哈希的免费版本的应用程序;其他的加密模型就是在比特深度上进行的。(完全版本是无限的。)在你自己的代码中,你可以使用XP_CRYPT,与ActiveX 控制一样(在受限的免费版本中)。对于ASP程序员来说,一个名为AspEncrypt 的组件提供了一种将高级加密整合到你的代码中的简单方式。

对数据库文件自身进行加密或者提供传输层上的安全保护怎么样?对于前者,大家可以在Windows系统中持续使用加密文件系统。然而,你必须保存加密密钥的备份,在出现问题的时候,这个数据有可能会丢失。对于后者,有IPSec和SQL Server自己的SSL加密,都是SQL Server和Windows自带的大家的主要精力应该放在避免以明文存储敏感数据,因为从数据库中抽取没有加密的数据同样是最容易受到攻击的薄弱环节。

(转)Microsoft SQL Server与Sybase内在区别

2008-02-08,星期五 | 分类:数据库|SQLServer | 159 views

  Microsoft SQL Server与Sybase的内在区别:

  1.Sybase没有用户自定义函数。

  2.判断fetch成功的全局变量是@@sqlstatus,而不是@@fetch_status。

  3.没有set,赋值与查询通用select。

  4.没有top,返回N行要使用set rowcount N / set rowcount 0

  5.raiserror 22009 " "–> raiserror( ‘ ‘,16,1)

  6.游标一定要在过程中使用,不能单独在查询中使用。

  7.销毁游标要加cursor关键字.如:deallocate cursor cur_tmp

  8.没有bigint类型。

  9.create table #t(id numeric(12,0) identity not null),不支持int型,且不能设置起始值和步进值。

  10.不能alter一个存储过程,要先drop掉再create。

  11.没有len函数,使用char_length或datalength等效。

  12.通过sysindexes中的doampg列可返回某表的行数,rowcnt(doampg) 。

  13.convert函数没有120格式(yyyy-mm-dd hh:mm:ss),需要使用select convert(char(4),datepart(year,getdate()))+ ‘- ‘+right( ‘0 ‘+convert(varchar(2),datepart(month,getdate())),2)+ ‘- ‘+right( ‘0 ‘+convert(varchar(2),datepart(day,getdate())),2)+ ‘ ‘+convert(char(10),getdate(),8)

  14.charindex不能从被查找字符串中按指定位置查找某字符串。

  15.不能使用rtrim函数将数值型转为字符型。

  16.没有cast函数,数值型到字符型转移使用select convert(varchar(10),123)

  17.没有replace函数。

  18.没有left函数,只有right函数。

  19.不支持在字段上加[]。

  20.select语句中不支持变量累加,例如:select @sql=@sql+colname from tablename

  21.在过程及视图中系统会自动将select * 变为select 列1,列2…

  22.varchar最大支持16384个字节(SQLServer中是8000) 。

  23.Sybase不支持表变量。

  24.Sybase不支持instead of触发器。

  25.Sybase没有调度(注:定时执行某个操作) 。

Pages: 1 2 Next