ChiefSailor的歪酷Blog
 
chiefsailor @ 2006-05-15 19:23

Visual Basic作为应用程序的开发“利器”也表现在数据库应用程序的开发上,它良好的界面和强大的控件功能使数据库编程变得简单多了。但即便如此,数据库应用程序的开发仍然算得上是VB编程中的难点,这是因为你不仅要熟悉VB中关于数据库编程方面的知识(当然这是十分简单的)还要了解数据库的知识。所以我们先介绍一下数据库的基本知识,算是学习数据库编程前的热身运动吧!

一、热身运动
  首先需要声明是,我们这里介绍的数据库知识都是指的关系数据库。所谓关系数据库就是将数据表示为表的集合,通过建立简单表之间的关系来定义结构的一种数据库。
  不管表在数据库文件中的物理存储方式如何,它都可以看作一组行和列,与电子表格的行和列类似。在关系数据库中,行被称为记录,而列则被称为字段。下面是一个客户表的例子。
  表1 客户表

客户号 姓名 地址 城市 街道 邮编
1723 Doe John 1234 Ffth Avenue New York NY 1004
3391 Smith Mary 9876 Myrtle Lavee Bosten MA 6078
3765 Blasel Mortimer 2296j River Road peoria IL 7011

  此表中每一行是一个记录,它包含了特定客户的所有信息,而每个记录则包含了相同类型和数量的字段:客户号、姓名等等。
  表 是一种按行与列排列的相关信息的逻辑组,类似于工作单表。
  字段 数据库表中的每一列称作一个字段。表是由其包含的各种字段定义的,每个字段描述了它所含有的数据。创建一个数据库时,须为每个字段分配一个数据类型、最大长度和其它属性。字段可包含各种字符、数字甚至图形。
  记录 各个客户有关的信息存放在表的行,被称为记录。一般来说,数据库表创建时任意两个记录都不能相同。
  键 键就是表中的某个字段(或多个字段),它(们)为快速检索而被索引。键可以是唯一的,也可以是非唯一的,取决于它(们)是否允许重复。唯一键可以指定为主键,用来唯一标识表的每行。例如,在前面的例子中,客户标识号 (客户号) 是表的主键,因为客户号唯一地标识了一个客户。
  关系 数据库可以由多个表组成,表与表之间可以以不同的方式相互关联。例如,客户数据库还可以有一个包含某个客户的所有定单的表。它只用“客户号”字段来引用该定单的客户,而不在定单表中的每项重复所有客户信息,如下表所示:
  表2 定货表

定货 客户号 日期 内容 数量
14764 3391 2/23/94 27 $22.95
14932 3391 3/17/94 46 $9.57
15108 8765 2/15/96 27 $22.95

  在这个表中,客户号字段引用了客户表中的 客户号字段,从而把定单和客户联系起来了。可以看到,客户 3391 (Mary Smith) 在 94 年 2 月 23 日订购了 27 项,在 94 年 3 月 17 日订购了 46 项。用来建立关系的键叫做外部键,因为它与“外部”表(客户表)的主键关联。
  一对多和多对多关系 上表中的关系类型叫做一对多关系,因为一个客户可以发出多个定单,而某个特定的定单只能是一个客户所发。也可以建立多对多的关系。例如,列出所有可以销售的项(存货)的盘存表:
表3 盘存表

内容 描述 供应商 费用 盘存
27 Straw Hat Garden Supply Co. $14.00 50
46 Garden gloves Garden Supply Co. $4.50 75
102 hanging floral industries $6.00 137

  从盘存表中,可以看到在客户和存货项之间存在多对多的关系。也就是说,一个客户可以订购多个存货项,而一个存货项又能够被多个客户订购。多对多关系是通过两个独立的一对多关系来定义的,公共的“多”表包含了两个其它表的外部键。在该例中,定货s 表与 盘存 表(通过 “内容”)与 Customer 表(通过 客户号)都相关联。通过这三个表,我们可以看到,Mary Smith (客户号 3391) 订购了 Straw Hat (“内容” 27) 和Garden Gloves (“内容” 46),而 Mary Smith (客户号 3391) 和 Mortimer Blaselflatz (客户号 8765) 都订购了Straw Hat (“内容” 27)。如果把客户表和盘存表的相关字段与 定货表的“定货”字段联结起来,建立一个“关联”表,那么这个关系就更清楚了。
表4 关联表:按客户号和内容排序

定货号 客户号 姓名 内容 描述
14764 33391 Smith Mary 27 Straw Hat
14932 33391 Smith Mary 46 Garden Gloves
15168 8765 Blaselfatz Mortimer 27 Straw Hat

  规范化 数据库设计者的任务就是组织数据,而组织数据的方法,应能消除不必要的重复,并为所有必要信息提供快速查找路径。为了达到这种目标而把信息分离到各种独立的表中去的过程,叫作规范化。
  规范化是用许多指定的规则和不同级别的范式来进行规范的复杂过程。该过程的研讨已超出了本文的范围。但是,大多数简单数据库的规范化可以用下面简单的经验规则来完成:包含重复信息的表必须分成独立的几个表来消除重复。
  例如,使学生和课程对应的学生数据库,包含了下表所示的信息。
表5

学生 课程 描述 教授
1 4 Introduction to Physiology Dawson
2 3 Applied Basketweaing Carruth
3 1 Physics for Short-定货 cooks Adms
4 2 Introduction to Physiology Dawsons

  如果有选学了十二门课程的 1000 个学生,每门课程的说明和教师将显示100多次─ 对选了那门课程的每个学生都要重复一次。要避免这种低效率,应当把表分成两个独立的表来规范化,一个用来表示学生,另一个用来表示课程,如表6,表7所示。


学生 课程
1 4
2 3
3 1
4 4
课程 描述 教授
1 Physics for Short-定货 cooks Adms
2 Counterculture Sociology Beckely
3 Applied Basketweaing Carruth
4 Introduction to Physiology Dawsons

表6
表7


  现在表被规范化了,所以,要改变特定课程的课程描述或“数据”,只要改变一个记录就可以了。
以上是关于数据库的基本知识,这是学习数据库编程所必须的。虽然数据库技术作为一门学科,其深度和广度不是这点篇幅能描述的,但作为入门和简单数据库编程应该是足够了。
  好了,下面我们就可以开始练练了。我们经常遇到数据库系统是登记系统,不管你是在单位,或是参加什么组织,登记是免不了的,而且它的结构比较简单,我们就以一个登记系统为例吧。分析一下该系统所涉及到的数据。

二、磨刀不误砍柴功

  对于登记,要跟踪的信息包括:
●姓名   ● 性别
●籍贯   ● 年龄
●出生年月 ● 单位
●地址   ● 邮政编码
●电话   ● 传真
  当然,可以简单地创建一个表,使得上述的每个数据项对应一个字段。
  现在需要给表指派主键,用以唯一标识每一条记录,在登记表中分别添加登记号作为唯一键,这样就保证数据库中的任两条记录都不同了。
  对数据库作出以上分析后,我们就可以开始建立数据库了。

三、建营扎寨
  在这里我们学习怎样建立数据库,首先需要确定要建立数据库的类型。在Visual Basic中通过数据访问控件或数据访问对象(DAO)可以访问下列数据库:
  1. JET数据库,即Microsoft Access
  2. ISAM数据库,如:dBase,FoxPro等
  3. ODBC数据库,凡是遵循ODBC标准的客户/服务器数据库。如:Microsoft SQL Server、Oracle
  一般来说,如果要开发个人的小型数据库系统,用Access数据库比较合适,要开发大、中型的数据库系统用ODBC数据库更为适宜。而dBase和FoxPro数据库由于已经过时,除非特别的情况,否则不要使用。在我们的例子中,当然选用Access数据库了。建立Access数据库有两种方法:一是在Microsoft Access中建立数据库。点击“新建”按钮就可以建立新的表了(如图1)。这里我们主要介绍第二种方法:使用可视化数据管理器,不需要编程就可创建数据库。可视化数据管理器是一个非常有用的应用程序,它是VB企业版和专业版附带的,在目录\..\DevStudio\vb\samples\Visdata下,其界面如下图。
  点击菜单“文件”项下“新建”子项“Microsoft ACCESS”子项的“版本7.0 MDB”项。在弹出窗口中输入新建数据库的名称“登记”,出现下面图3所示窗口:
  要生成新的表,右键单击数据库窗口弹出菜单,然后选择“新表”命令,在随后出现的“表结构”对话框中建立所要的字段。每次向表中加入新的字段,单击“增加字段”按钮,会出现图4 的“增加字段”对话框。
  “增加字段”对话框中的选项如表10所示,根据字段的类型,有些选项是无效的,无法读取。
在我们建立的登记数据库中,各个字段的类型如表11。

  要注意的是,由于字段登记号用来唯一标志记录的,因此,它不能由用户输入。所以在定义该字段时需要定义为Long数据类型,“自动生成字段”项有效,并选中这一项。这样当用户每输入一条新记录时,系统就会在该字段上自动输入一个与其它记录不同的值。
在ACCESS数据库中,关键字是用索引实现的,作为编程人员在对表类型的记录集编程时,只需调用索引名。在查询时,Rushmore技术自动用索引信息优化查询。完成表定义后,点击“增加索引”按钮,弹出如图5所示窗口。
  在窗口中右边有三个选项,其意义如表 12。
  添加索引对话框选项
  完成之后如图6。
  当然,学会数据库的建立也并非一朝一夕的事,读者不妨多练习一下。下面你就可以运行VB开始我们的编程了。

四、千里相会
  Visual Basic 数据库应用程序有三个部分,如图7所示。
  用户程序是程序员开发的,也是我们即将用VB来编写的部分。数据库引擎是数据库驱动程序,使用它程序员可以用统一的格式访问各种数据库,不管这个数据库是本地的 Visual Basic 数据库,还是所支持的其它任何格式的数据库格式,所使用的数据访问对象和编程技术都是相同的。数据库则是我们上面完成的部分。从这个结构可以看出用户与正在访问的特定数据库无关。那我们在用VB编写数据库程序时,就需要使程序能够访问指定的数据库。
  如果是简单的数据库应用,可以使用 Data 控件来执行大部分数据访问操作,而根本不用编写代码。与 Data 控件相捆绑的控件自动显示来自当前记录的一个或多个字段的数据。

DATA数据控件
属性
CONNECT属性 指定打开的数据库类型,并且包括参数,如用户和口令等。
例如:
打开Access数据库(缺省)
CONNECT=“ACCESS”
打开ODBC数据库
CONNECT=“ODBC;DATABASE=??;UID=??;PWD=??;DSN=??”
DATABASENAME属性 确定数据控件访问哪一个数据库。
对于多表数据库它为具体的数据库文件名,例如:ACCESS数据库
DATABASENAME=“D:\...\DEMO.MDB"
  对于单表数据库它为具体的数据库文件所在的目录,而具体文件名放在RECORDSOURCE属性中,例如:访问FOXPRO数据库文件D:\FOX\DEMO.DBF
DATABASENAME=“D:\FOX”
RECORDSOURCE=“DEMO”不带文件扩展名
RECORDSOURCE属性
  确定数据控件的记录集,即:所要访问的数据内容。它可以是一个表名、存储查询名或SQL语句。例如:访问Register表所有数据 :
RECORDSOURCE=“Register”访问RC表中1973年以前出生的数据:
RECORDSOURCE=“SELECT *FROM Register WHERE [BIRTHDAY]<#1/1/1973#"
注意:当我们在运行时修改了该属性后,需要调用REFRESH方法刷新记录集。

方法
REFRESH方法 当我们在运行时修改了Record-
Source属性后,需要调用该方法刷新记录集。
UPDATERECORD方法 将绑定在数据控件上的控件的数据写入数据库中。即:当我们修改了数据后调用该方法确定修改。
CANCELUPDATE方法 将数据库中的数据重新读到绑定在数据控件上的控件中。即:当我们修改了数据后调用该方法放弃修改。

事件
  VALIDATE事件 当我们移动记录集记录指针时发生。例如:我们将记录集记录指针从A移动到记录B时当产生VALIDATE事件时,记录指针仍在记录A上。
Sub XXXX_Validate(Action As integer,Save As integer)
其中:
Action 指出如何产生了该事件,如:移动,增加,查询等。
Save 表示是否保存已修改的数据。当我们修改了绑定在数据控件的数据,又没有UPDATERECORD,则移动指针时,Save=True。如果在事件中令Save=False,则放弃修改。
例如:

Sub XXXX_Validate(Action As integer,Save As integer)
If Save then
I= MsgBox("Dada changed,Save?",vbYesNo)
If I = vbNo then
Save = False
End if
End if
End Sub

Reposition事件 当我们移动记录集指针时发生。例如:我们将记录集记录指针从A移动到记录B 时,当产生Reposition事件时,记录指针已移动到B上。
通常我们在该事件中显示当前的指针位置。例如:
Sub XXXX_Reposition()
XXXX.Caption=??
XXXX.RecordSet.AbsolutePosition + 1
End Sub

  了解了DATA控件之后我们就可以连接数据库了。现在我们可以编写一个应用程序。因为虽然我们建立了Register数据库,但是数据库中却没有数据,我们程序的目的就是向数据库中输入数据。它的运行情况如图8。
  各个文本框正好对应着表Register的各个字段,在文本框中输入数据,点击“增加”按钮,就完成了一条记录的输入。我们看一下,DATA控件是怎样和数据库连接起来的,各个文本框又是怎样和DATA控件捆绑起来的。
  在DATA控件的CONNECT属性中,选中“ACCESS”项,在DatabaseName属性中,输入“C:\TEMP\登记.mdb”,在RecordSource属性中,选中“Register”,这样就完成了数据库与DATA控件的连接,也就是完成了与应用程序的连接。

  数据库中各个字段又是怎样和文本框连接起来的呢?在VB中,我们可以将普通控件绑定在数据控件上,来完成自动地显示、更新记录集的数据。常用的可绑定的控件有:Label,Text,checkBox,Image等。通过设置这些控件的DataSource和DataField属性来完成绑定。

DataSource 属性 表示绑定到哪一个数据控件上,程序中我们可能使用多个数据控件。
DataField 属性 表示绑定到记录集的哪一个记录上。
  现在我们需要把Text1与表“登记”中的姓名字段连接起来。完成DATA控件的连接之后,在Text1控件的DataSource属性中,选中“Data1”,在DataField属性中,选中“姓名”值。用同样的方法,将各个文本框分别绑定到对应的字段上,就完成了文本框的捆绑。
  下面我们编写两个按钮命令,完成其相应的操作了。喂!别着急,还有一个重要的对象没讲呢!
  当应用程序启动时,Data 控件被自动地初始化。如果 Connect、DatabaseName、Options、RecordSource、Exclusive、ReadOnly 和 RecordsetType 属性是合法的, Microsoft Jet 数据库引擎就会试图创建一个新的基于这些属性的 Recordset 记录集对象。Recordset 对象可以表示表中的记录或者作为查询结果的记录,使用 Recordset 对象可以在记录一级上对数据库中的数据进行处理。这在数据库编程中是一个十分重要的,也是比较复杂的对象。
  Recordset 对象有三种类型:表、动态集、快照,它们之间存在明显的区别。
  表类型的 Recordset 对象是指当前数据库中的表在创建表类型的记录集时,数据库引擎打开的表。后续的数据操作都是直接对表进行的。只能对单个的表打开表类型的记录集,而不能对联接或者联合查询打开表类型的记录集。与其它类型的 Recordset 对象相比,表类型的搜索与排序速度最快。
  动态集类型的 Recordset 对象可以是本地的表,也可以是返回的行查询结果。它实际上是对一个或者几个表中的记录的一系列引用。可用动态集从多个表中提取和更新数据,其中包括链接的其它数据库中的表。动态集类型具有一种与众不同的特点:不同数据库的可更新联接。利用这种特性,可以对不同类型的数据库中的表进行可更新的联接查询。动态集和它的基本表可以互相更新。如果动态集中的记录发生改变,同样的变化也将在基本表中反映出来。在打开动态集的时候,如果其他的用户修改了基本表,那么动态集中也将反映出被修改过的记录。动态集类型是最灵活的Recordset 类型,也是功能最强的。不过,它的搜索速度与其它操作的速度不及表类型的 Recordset。
  快照类型的 Recordset 对象包含的数据是固定的,它反映了在产生快照的一瞬间数据库的状态。从 Microsoft Jet 数据源得到的快照是不可更新的,从开放数据库互连 (ODBC) 数据源得到的某些快照是可以更新的,这取决于数据库系统本身的能力。与动态集类型和表类型的 Recordset 对象相比,快照的处理开销较少。因此,它执行查询和返回数据的速度更快,特别是在使用 ODBC 数据源时。快照类型保存了表中所有记录的完整复本,因此,如 果记录的个数很多,快照的性能将比动态集慢得多。为了确定快照与动态集哪一个更快,可以先以动态集方式打开记录集,然后再以快照方式打开它。
  具体使用什么记录集,取决于需要完成的任务:是要更改数据呢,还是简单地查看数据。例如,如果必须对数据进行排序或者使用索引,可以使用表。因为表类型的 Recordset 对象是做了索引的,它定位数据的速度是最快的。如果希望能够对查询选定的一系列记录进行更新,可以使用动态集。如果在特殊的情况下不能使用表类型的记录集,或者只须对记录进行扫描,那么使用快照类型可能会快一些。
  一般来说,尽可能地使用表类型的 Recordset 对象,它的性能通常总是最好的。
  为选择特定的 Recordset 类型,把 Data 控件的RecordsetType属性设成:

RecordSet记录集属性
BOF属性 当记录集记录指针指向第一条记录时返回True
EOF属性 当记录集记录指针指向最后一条记录时返回True
AbsloutePosition属性 返回当前记录集记录指针,第一条记录为0,是只读属性
Bookmark属性 String类型,返回或设置当前记录集记录指针的书签,是可读写属性。每一条记录都有自己唯一的书签,它与记录在记录集中的顺序无关。将Bookmark属性存放到变量中,后面可以通过将该变量赋值给Bookmark属性,并返回到这个记录。
注意:程序中使用BookMark属性重定位记录指针,而不能使用Abslouteposition
NoMatch属性 当我们使用Find方法查询时如果未找到则返回True。常与BookMark属性同时使用。
例如:查找[NAME]字段中第一个姓李的人

Dim S As String
With XXXX.RecordSet
S = .BookMark
.FindFirst "[NAME] Like '李*'"
if .NoMatch then
MsgBox "数据未找到“
.BookMark = S
End if
End With

记录集方法
AddNew方法 向记录集增加一条新记录
Delete方法 从记录集中将当前记录删除。在删除后常使用MoveNext方法移动指针。
例如:

With XXXX.RecordSet
.Delete
.MoveNext
if .EOF then .MoveLast
End With

MoveXXXX方法
MoveFirst 将记录集指针移动到第一条记录上
MoveLast 将记录集指针移动到最后一条记录上
MovePrevious 将记录集指针移动到前一条记录上
MoveNext 将记录集指针移动到下一条记录上
FindXXXX方法
FindFirst在记录集中查询符合条件的第一条记录
FindLast 在记录集中查询符合条件的最后一条记录
FindPrevious 在记录集中查询符合条件的前一条记录
FindNext 在记录集中查询符合条件的下一条记录
  好了,有了这么充分的知识了,编写两个按钮命令简直是小菜一碟,先来试一下,添一个“增加”命令按钮吧。

Private Sub Command1_Click()
Data1.Recordset.AddNew
End Sub

  哇!怎么这么简单,再看一下“删除”命令按钮

Private Sub Command2_Click()
Data1.Recordset.Delete
Data1.Recordset.AddNew
End Sub

  就这样行了吗?运行程序吧,OK!一切正常,迫不及待地输入一条记录,点击“增加”按钮,怎么?出问题了!因为你只有在进行了AddNew方法后才可以输入数据,好吧,在窗口的初始化时就增加一条新记录吧。

Private Sub Form_Initialize()
Data1.Recordset.AddNew
End Sub
  输入完了数据,我们打算退出程序,很自然的我们执行关闭窗口操作,就顺利地结束了输入工作。真的很顺利吗?打开数据库,看看数据库中的数据,我们发现刚才输入的最后一条记录没有存入数据库中。这个很好解释,每当我们调用AddNew方法时,它就将输入的记录存入数据库中,而当我们关闭窗口时,刚输入的记录并没有保存到数据库中,那么在关闭窗口之前对DATA控件进行一次刷新就可以将数据存入数据库中了。

Private Sub Form_QueryUnload(Cancel As Inte ger, UnloadMode As Integer)
Data1.Refresh
End Sub

  到了这里,我们似乎可以稍稍轻松了一点,这个窗口的功能差不多完成了。但是我不得不给你提出一个忠告:在数据库系统中,应尽量将错误在应用级上处理。这句话看起来似乎有点抽象,实际上用在这个程序中就简单多了。在表Register中,我们将出生日期定义为Date/Time类型,如果在程序运行时,在该字段对应的文本框中输入的不是Date/Time格式,在向数据库提交数据时会出现什么情况呢?数据库会向用户报告错误信息。然而这样对应用程序并不好,这样的错误应该由用户程序处理,而不是交给数据库去处理,所以在数据提交之前就应该检查该字段的输入是否合法。

Private Sub Text3_LostFocus()
If IsDate(Text3.Text) Or Text3.Text = "" Then '检查是否输入合法数据
Exit Sub
End If
MsgBox ("输入错误,请输入你出生的年月日!"
,将选取不合法的数据,以便重新输入,并使控制焦点不动
Text3.SetFocus
Text3.SelStart = 0
Text3.SelLength = Len(Text3.Text)
End Sub

  上面虽是应用程序处理错误的一个小例子,可是这种在应用级处理错误的思想是十分重要的。

五、寻寻觅觅
  在数据库管理系统中,输入和查询就象两个孪生姐妹不可或缺,下面将介绍如何创建查询窗口。查询窗口的设计分为两部分:查询结果和查询条件。查询结果是指用户所需要的数据,它包括根据查询条件查询出来的记录,但并非表中每个字段里的数据都需要提供给用户。比如在我们这个例子中,登记表中的登记号的值是用户不感兴趣的,所以在查询结果中,我们不希望显示RegID字段的值。查询条件是用户提出的查询要求。比如在我们这个系统中,可以有姓名条件,当用户想知道某个人的具体情况,他可以输入此人的姓名,就查询出此人各方面的情况;也可以有年龄条件,当用户输入某个年龄段,就会查询出处于这个年龄段的所有人的信息。到底采用哪些查询条件,这需要开发者根据用户和系统的要求进行设计,其具体实现过程大都大同小异。为了节省篇幅,我们就仅以年龄为条件进行查询。查询窗口运行情况如图9。
在这个程序中我们使用了一个控件DBGrid,这个控件用来显示查询结果,选中VB的“工程”菜单下的“部件……”项,在控件标签中,选中“Microsoft Data Bound Grid Control 5.0”即可,在工具箱中就会出现DBGrid控件的小图标。其使用和其它控件一样。
  为了和数据库连接,DATA控件是不可少的,回忆一下,该怎样设置它的属性,OK!同输入窗口一样,在CONNECT属性中,选中“ACCESS”项。在DatabaseName属性中,输入“C:\TEMP\登记.mdb”。在RecordSource属性中,选中......嘿,嘿,这里稍微有点不同,如果按输入窗口那样的设置,查询结果中就会包含登记号字段了。在此属性中我们应该输入SQL语句:
  select name as 姓名,sex as 性别,hometown as 籍贯,age as 年龄,birthday as 生日,company as 单位,address as 地址,zip as 邮编,telephone as 电话,fax as 传真 from Register。别着急,尽管这条语句有点长,实际上却比较简单。这条语句的语法是:
  SELECT 字段名,字段名,……FROM 表名 WHERE 条件;
  对照语法,我们可以看出输入的SQL语句的含义:从表Register中查询姓名,性别,籍费,……字段的值。只要在字段列表中不选中登记号字段,在查询结果中,就不会显示登记号的值了。如果你够细心的话就会注意到我们所写的SQL语句中在字段列表中并不仅仅输入字段名,在其后面还增加了as……项,如“name as 姓名”,这是为name字段取一个别名“姓名”,以便在DBGrid控件中显示字段名时,就会显示“姓名”而不是“name”。
  完成了DATA控件属性的设置就可以将DBGrid控件捆绑到DATA控件上,其方法同输入窗口。对了,将“DataSource”属性设置为“DATA1”即可。现在不妨运行一下程序,真令人兴奋,DBGrid显示出表中所有的信息。可是怎样显示符合条件的数据呢?再看一看上面的SQL语法,WHERE段后可以输入查询条件,比如:需要年龄在20到30岁之间的人员信息,其语句为:Select name,... from register where age>20 and age<30;
  我们只要根据用户输入的条件构成新的SQL语句,并利用DATA控件的Refrensh方法刷新数据库,就可以完成条件查询了。
  整个程序十分简单,当用户在文本框中输入年龄段后,点按“查询”命令,就会显示符合条件的查询结果。程序代码如下:

Option Explicit
Const allinfo = "select name as 姓名,sex as 性别,hometown as 籍贯,age as 年龄,birthday as 生日,company as 单位,address as 地址,zip as 邮编,telephone as 电话,fax as 传真 from 登记" '定义不带条件的SQL查询语句

Private Sub Command1_Click()
Dim t1, m, n As String
'构造SQL语句的WHERE条件段
If IsNumeric(Text1.Text) Then
m = " age >" + Text1.Text
End If
If IsNumeric(Text2.Text) Then
n = " age < " + Text2.Text
End If
If m = "" And n = "" Then
t1 = ""
Else
If m = "" Then
t1 = n
Else
If n = "" Then
t1 = m
Else
t1 = m + " and " + n
End If
End If
End If
If t1 <> "" Then
t1 = " where " + t1
End If
Data1.RecordSource = allinfo + t1
'将RecordSource属性的值设置为新的SQL语句
Data1.Refresh
‘刷新数据库,获得符合当前条件的查询结果
End Sub

  在这个程序中,你还可以加上姓名查询、籍贯查询等,其设计过程都是通过构造SQL语句来实现的。另外,还需要注意的一点是既然是查询窗口,当然允许修改,将DBGrid控件的AllowUpdate属性值设为False。OK!运行程序吧,啊!万事大吉。看一看应用程序,再看一看你编写的代码,不可思议,这么短的代码居然完成了这么强大的功能。事实就是这样,数据库编程中最重要的是对概念的清楚,与之相比,技巧好象摆在了次要位置。让我们闭上眼睛,想一想我们需要了解那些东西吧:DATA控件,RECORDSET对象、控件的捆绑、简单的SQL查询语句。熟悉了这些东西,你就可以进行数据库编程了,如果你对开发数据库系统比较感兴趣,可以再加强一下在数据库设计和SQL语句方面的知识。但数据库编程真的总是这样简单吗?如果已经熟悉了上面的内容,建议你看一下下面这一节。

六、拨云见雾
  还记得我们在前面说过Visual Basic 提供了两种与 Jet 数据库引擎接口的方法吗?Data 控件和数据访问对象。我们已经见识了DATA控件,确实给人意想不到的方便,但Data 控件只给出有限的访问现存数据库的功能。而 DAO 模型则可以全面控制数据库的完整编程接口。这两种方法事实上并不是互斥的,实际上,它们常同时使用。
  DAO 模型是设计关系数据库系统结构的对象类集合。它们提供了完成管理这样一个系统所需的全部操作属性和方法,包括创建数据库,定义表、字段和索引,建立表间的关系,定位和查询数据库等工具。DAO结构的主要对象如图10所示。
  Visual Basic 中的数据库编程就是创建DAO(数据访问对象)。这些对象对应于被访问物理数据库的不同部分,如 Database、TableDef、Field 和 Index 对象,用这些对象的属性和方法来实现对数据库的操作,能够在 Visual Basic 窗体中使用绑定和非绑定控件来显示操作结果并接收用户输入。这样就简化了代码,它赋予程序员很大的灵活性。因为可以使用同样的对象、属性和方法来处理各种不同的数据库格式。同时,如果从一种数据库格式变到另一种格式(例如,将本地的 Microsoft Access 数据库转换为网络上的 SQL Server 数据库),只需变动少量的代码就可以适应这种改变。甚至可以创建这样的应用程序,在单一的查询或报表中连接来自多个不同数据库的表。
  我们先介绍DAO对象,从上图中我们可以看到,DAO对象中最关键的是DBEngine对象,所有的数据库操作都要通过它来完成。

DBEngine对象
DBEngine对象相当于jet数据库引擎,不需要创建该对象。
CreateWorkspace方法:创建一个工作区对象
例如 :
Dim ws As Workspace
Set ws = DbEngine.CreateWorkspace (SpName,UserID,password",SpType)
其中
SpName 工作区名称String
UserID 用户名 String
Password 口令String
SpType 工作区类型 = dbUsejet jet工作区
= dbUseODBCODBC工作区

Workspace对象
  Workspace对象为用户定义一个会话,通过与之关联的用户名和口令建立一个安全级别。当不需要安全级别时可使用缺省的工作区DBEngine.Workspace。
方法:
OpenDatebase 打开一个数据库
Close 关闭当前工作区
BeginTrans 启动一个事务
CommitTrans 提交当前事务
RollBack 回滚当前事务
例如我们需要打开一个数据库。
我们调用Workspace的OpenDatabase方法打开一个数据库。
例如:
Dim db As DataBase
Set db=OpenDatabase(dbname,exc,readonly,source)
其中:
dbname 数据库文件名(对于单表数据库为路径)
exc = TRUE 表示打开数据库后,该数据库不能被其它应用程序访问。
FALSE 表示共享地打开数据库
Readonly=TRUE 表示打开数据库后,只能对数据库进行读操作
=FALSE 表示打开数据库后,可对数据库进行读写操作
source数据源名,用于指定打开地数据库类型。

创建记录集
  我们使用DataBase对象的OpenRecordSet方法打开一个记录集。
例如:
Dim rs As RecordSet
Set rs=db.OpenRecordSet(source,type)
其中:
source 指定记录集的内容,它可以是一个表名,查询名或SQL语句
type 创建记录集的类型
=dbOpenTable表型记录集
=dbOpenDynaset动态型记录集
=dbOpenSnapshot快照型记录集

访问ODBC数据库
  Visual Basic 通过 DAO 和 Jet 引擎可以识别三类数据库:Visual Basic 数据库,外部数据库,ODBC 数据库。在开发大中型数据库系统中一般都采用ODBC 数据库,如 Microsoft SQL Server等。DAO(数据访问对象)的 ODBCDirect 模式允许直接访问 ODBC 数据。另外,远程数据对象 (RDO) 库和远程数据控件 (RDC)也 允许直接访问 ODBC 数据。
要访问ODBC数据库需要两步,首先需要在WINDOWS 95 或WINDOWS NT的控制面板中设置ODBC数据源名(DSN)。然后在OpenDatabase方法的Source参数中使用该数据源名。
例如:访问Microsoft SQL Server
Source="ODBC;DSN=MyDSN;UID=sa;PWD=xx;DataBase=pubs"
在程序中使用DAO
  DAO的强大功能确实让人兴奋,只是较之DATA控件要复杂得多。在复杂的数据库处理中,这两种方法常常同时使用。要使用DAO,必须选中VB的“工程”菜单下的“部件……”项,在控件标签中选中"Microsoft DAO 3.5 Object Library"之后就可以在程序中定义DAO变量了。在这篇文章中我们所举的数据库例子比较简单,有兴趣的朋友不妨采用数据访问对象(DAO)来实现这个程序。

七、高屋建瓴
  到了这里,似乎VB数据库编程的内容也差不多完整了,但是你完全可以再往前走一步。在目前的数据库开发过程中,客户/服务器体系结构占这个领域的主体地位,利用VB进行客户/服务器应用程序的开发是完全可行的。同时,在程序开发过程中,还可以利用面向对象技术,提高你的程序的可重用性和可维护性。总之,数据库应用程序的开发始终是技术上和理论上的热点。使用最高级的方法,最先进的技术,你会变得越来越COOL



 
chiefsailor @ 2006-05-15 19:21

毕业典礼上的演讲大都轻松愉快,而且容易被遗忘。然而, 乔布斯(Steve Jobs)2005年 6 月在斯坦福大学的演讲在经过了一个夏天之后依然为人所提及。这位苹果电脑公司(Apple Computer)和皮克斯动画公司(Pixar Animation Studios)首席执行官在演讲中谈到了他生活中的三次体验,这三次体验不仅在斯坦福大学的毕业生、也在硅谷乃至其他地方的技术同行中引起了巨大反响。他们将他的演讲登在互联网上,在博客上展开讨论,通过电子邮件互相发送,在全球传阅。我们在此刊登全文,以飨还没有看到该演讲的读者。 ‘You’ve got to find what you love,’ Jobs says
This is the text of the Commencement address by Steve Jobs, CEO of Apple Computer and of Pixar Animation Studios, delivered on June 2, 25.
I am honored to be with you today at your commencement from one of the finest universities in the world. I never graduated from college. Truth be told, this is the closest I’ve ever gotten to a college graduation. Today I want to tell you three stories from my life. That’s it. No big deal. Just three stories.
很荣幸和大家一道参加这所世界上最好的一座大学的毕业典礼。我大学没毕业,说实话,这是我第一次离大学毕业典礼这么近。今天我想给大家讲三个我自己的故事,不讲别的,也不讲大道理,就讲三个故事。
The first story is about connecting the dots.
I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 8 months or so before I really quit. So why did I drop out?
第一个故事讲的是点与点之间的关系。我在里德学院(Reed College)只读了六个月就退学了,此后便在学校里旁听,又过了大约一年半,我彻底离开。那么,我为什么退学呢?
It started before I was born. My biological mother was a young, unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by college graduates, so everything was all set for me to be adopted at birth by a lawyer and his wife. Except that when I popped out they decided at the last minute that they really wanted a girl. So my parents, who were on a waiting list, got a call in the middle of the night asking: “We have an unexpected baby boy; do you want him?” They said: “Of course.” My biological mother later found out that my mother had never graduated from college and that my father had never graduated from high school. She refused to sign the final adoption papers. She only relented a few months later when my parents promised that I would someday go to college.
这得从我出生前讲起。我的生母是一名年轻的未婚在校研究生,她决定将我送给别人收养。她非常希望收养我的是有大学学历的人,所以把一切都安排好了,我一出生就交给一对律师夫妇收养。没想到我落地的霎那间,那对夫妇却决定收养一名女孩。就这样,我的养父母─当时他们还在登记册上排队等著呢─半夜三更接到一个电话: “我们这儿有一个没人要的男婴,你们要么?”“当然要”他们回答。但是,我的生母后来发现我的养母不是大学毕业生,我的养父甚至连中学都没有毕业,所以她拒绝在最后的收养文件上签字。不过,没过几个月她就心软了,因为我的养父母许诺日后一定送我上大学。
And 7 years later I did go to college. But I naively chose a college that was almost as expensive as Stanford, and all of my working-class parents’ savings were being spent on my college tuition. After six months, I couldn’t see the value in it. I had no idea what I wanted to do with my life and no idea how college was going to help me figure it out. And here I was spending all of the money my parents had saved their entire life. So I decided to drop out and trust that it would all work out OK. It was pretty scary at the time, but looking back it was one of the best decisions I ever made. The minute I dropped out I could stop taking the required classes that didn’t interest me, and begin dropping in on the ones that looked interesting.
7 年后,我真的进了大学。当时我很天真,选了一所学费几乎和斯坦福大学一样昂贵的学校,当工人的养父母倾其所有的积蓄为我支付了大学学费。读了六个月后,我却看不出上学有什么意义。我既不知道自己这一生想干什么,也不知道大学是否能够帮我弄明白自己想干什么。这时,我就要花光父母一辈子节省下来的钱了。所以,我决定退学,并且坚信日后会证明我这样做是对的。当年做出这个决定时心里直打鼓,但现在回想起来,这还真是我有生以来做出的最好的决定之一。从退学那一刻起,我就可以不再选那些我毫无兴趣的必修课,开始旁听一些看上去有意思的课。
It wasn’t all romantic. I didn’t have a dorm room, so I slept on the floor in friends’ rooms, I returned coke bottles for the 5&cent; deposits to buy food with, and I would walk the 7 miles across town every Sunday night to get one good meal a week at the Hare Krishna temple. I loved it. And much of what I stumbled into by following my curiosity and intuition turned out to be priceless later on. Let me give you one example:
那些日子一点儿都不浪漫。我没有宿舍,只能睡在朋友房间的地板上。我去退还可乐瓶,用那五分钱的押金来买吃的。每个星期天晚上我都要走七英里,到城那头的黑尔-科里施纳礼拜堂去,吃每周才能享用一次的美餐。我喜欢这样。我凭著好奇心和直觉所干的这些事情,有许多后来都证明是无价之宝。我给大家举个例子:
Reed College at that time offered perhaps the best calligraphy instruction in the country. Throughout the campus every poster, every label on every drawer, was beautifully hand calligraphed. Because I had dropped out and didn’t have to take the normal classes, I decided to take a calligraphy class to learn how to do this. I learned about serif and san serif typefaces, about varying the amount of space between different letter combinations, about what makes great typography great. It was beautiful, historical, artistically subtle in a way that science can’t capture, and I found it fascinating.
当时,里德学院的书法课大概是全国最好的。校园里所有的公告栏和每个抽屉标签上的字都写得非常漂亮。当时我已经退学,不用正常上课,所以我决定选一门书法课,学学怎么写好字。我学习写带短截线和不带短截线的印刷字体,根据不同字母组合调整其间距,以及怎样把版式调整得好上加好。这门课太棒了,既有历史价值,又有艺术造诣,这一点科学就做不到,而我觉得它妙不可言。
None of this had even a hope of any practical application in my life. But ten years later, when we were designing the first Macintosh computer, it all came back to me. And we designed it all into the Mac. It was the first computer with beautiful typography. If I had never dropped in on that single course in college, the Mac would have never had multiple typefaces or proportionally spaced fonts. And since Windows just copied the Mac, its likely that no personal computer would have them. If I had never dropped out, I would have never dropped in on this calligraphy class, and personal computers might not have the wonderful typography that they do. Of course it was impossible to connect the dots looking forward when I was in college. But it was very, very clear looking backwards ten years later.
当时我并不指望书法在以后的生活中能有什么实用价值。但是,十年之后,我们在设计第一台 Macintosh 计算机时,它一下子浮现在我眼前。于是,我们把这些东西全都设计进了计算机中。这是第一台有这么漂亮的文字版式的计算机。要不是我当初在大学里偶然选了这么一门课,Macintosh 计算机绝不会有那么多种印刷字体或间距安排合理的字号。要不是 Windows 照搬了 Macintosh,个人电脑可能不会有这些字体和字号。要不是退了学,我决不会碰巧选了这门书法课,个人电脑也可能不会有现在这些漂亮的版式了。当然,我在大学里不可能从这一点上看到它与将来的关系。十年之后再回头看,两者之间的关系就非常、非常清楚了。
Again, you can’t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something — your gut, destiny, life, karma, whatever. This approach has never let me down, and it has made all the difference in my life.
你们同样不可能从现在这个点上看到将来;只有回头看时,才会发现它们之间的关系。所以,要相信这些点迟早会连接到一起。你们必须信赖某些东西─直觉、归宿、生命,还有业力,等等。这样做从来没有让我的希望落空过,而且还彻底改变了我的生活。
My second story is about love and loss.
I was lucky — I found what I loved to do early in life. Woz and I started Apple in my parents garage when I was 2. We worked hard, and in years Apple had grown from just the two of us in a garage into a $2 billion company with over 4 employees. We had just released our finest creation — the Macintosh — a year earlier, and I had just turned 3. And then I got fired. How can you get fired from a company you started? Well, as Apple grew we hired someone who I thought was very talented to run the company with me, and for the first year or so things went well. But then our visions of the future began to diverge and eventually we had a falling out. When we did, our Board of Directors sided with him. So at 3 I was out. And very publicly out. What had been the focus of my entire adult life was gone, and it was devastating.
我的第二个故事是关于好恶与得失。幸运的是,我在很小的时候就发现自己喜欢做什么。我在 2 岁时和沃兹(Woz,苹果公司创始人之一 Wozon 的昵称─译注)在我父母的车库里办起了苹果公司。我们干得很卖力,十年后,苹果公司就从车库里我们两个人发展成为一个拥有 2 亿元资产、4, 名员工的大企业。那时,我们刚刚推出了我们最好的产品─ Macintosh 电脑─那是在第 9 年,我刚满 3 岁。可后来,我被解雇了。你怎么会被自己办的公司解雇呢?是这样,随著苹果公司越做越大,我们聘了一位我认为非常有才华的人与我一道管理公司。在开始的一年多里,一切都很顺利。可是,随后我俩对公司前景的看法开始出现分歧,最后我俩反目了。这时,董事会站在了他那一边,所以在 3 岁那年,我离开了公司,而且这件事闹得满城风雨。我成年后的整个生活重心都没有了,这使我心力交瘁。
I really didn’t know what to do for a few months. I felt that I had let the previous generation of entrepreneurs down - that I had dropped the baton as it was being passed to me. I met with David Packard and Bob Noyce and tried to apologize for screwing up so badly. I was a very public failure, and I even thought about running away from the valley. But something slowly began to dawn on me — I still loved what I did. The turn of events at Apple had not changed that one bit. I had been rejected, but I was still in love. And so I decided to start over.
一连几个月,我真的不知道应该怎么办。我感到自己给老一代的创业者丢了脸─因为我扔掉了交到自己手里的接力棒。我去见了戴维?帕卡德(David Packard,惠普公司创始人之一─译注)和鲍勃?诺伊斯(Bob Noyce,英特尔公司创建者之一─译注),想为把事情搞得这么糟糕说声道歉。这次失败弄得沸沸扬扬的,我甚至想过逃离硅谷。但是,渐渐地,我开始有了一个想法─我仍然热爱我过去做的一切。在苹果公司发生的这些风波丝毫没有改变这一点。我虽然被拒之门外,但我仍然深爱我的事业。于是,我决定从头开始。
I didn’t see it then, but it turned out that getting fired from Apple was the best thing that could have ever happened to me. The heaviness of being successful was replaced by the lightness of being a beginner again, less sure about everything. It freed me to enter one of the most creative periods of my life.
During the next five years, I started a company named NeXT, another company named Pixar, and fell in love with an amazing woman who would become my wife. Pixar went on to create the worlds first computer animated feature film, Toy Story, and is now the most successful animation studio in the world. In a remarkable turn of events, Apple bought NeXT, I retuned to Apple, and the technology we developed at NeXT is at the heart of Apple’s current renaissance. And Laurene and I have a wonderful family together.
虽然当时我并没有意识到,但事实证明,被苹果公司炒鱿鱼是我一生中碰到的最好的事情。尽管前景未卜,但从头开始的轻松感取代了保持成功的沉重感。这使我进入了一生中最富有创造力的时期之一。在此后的五年里,我开了一家名叫 NeXT 的公司和一家叫皮克斯的公司,我还爱上一位了不起的女人,后来娶了她。皮克斯公司推出了世界上第一部用电脑制作的动画片《玩具总动员》(Toy Story),它现在是全球最成功的动画制作室。世道轮回,苹果公司买下 NeXT 后,我又回到了苹果公司,我们在 NeXT 公司开发的技术成了苹果公司这次重新崛起的核心。我和劳伦娜(Laurene)也建立了美满的家庭。
I’m pretty sure none of this would have happened if I hadn’t been fired from Apple. It was awful tasting medicine, but I guess the patient needed it. Sometimes life hits you in the head with a brick. Don’t lose faith. I’m convinced that the only thing that kept me going was that I loved what I did. You’ve got to find what you love. And that is as true for your work as it is for your lovers. Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do. If you haven’t found it yet, keep looking. Don’t settle. As with all matters of the heart, you’ll know when you find it. And, like any great relationship, it just gets better and better as the years roll on. So keep looking until you find it. Don’t settle.
我确信,如果不是被苹果公司解雇,这一切决不可能发生。这是一剂苦药,可我认为苦药利于病。有时生活会当头给你一棒,但不要灰心。我坚信让我一往无前的唯一力量就是我热爱我所做的一切。所以,一定得知道自己喜欢什么,选择爱人时如此,选择工作时同样如此。工作将是生活中的一大部分,让自己真正满意的唯一办法,是做自己认为是有意义的工作;做有意义的工作的唯一办法,是热爱自己的工作。你们如果还没有发现自己喜欢什么,那就不断地去寻找,不要急于做出决定。就像一切要凭著感觉去做的事情一样,一旦找到了自己喜欢的事,感觉就会告诉你。就像任何一种美妙的东西,历久弥新。所以说,要不断地寻找,直到找到自己喜欢的东西。不要半途而废。
My third story is about death.
When I was 7, I read a quote that went something like: “If you live each day as if it was your last, someday you’ll most certainly be right.” It made an impression on me, and since then, for the past 33 years, I have looked in the mirror every morning and asked myself: “If today were the last day of my life, would I want to do what I am about to do today?” And whenever the answer has been “No” for too many days in a row, I know I need to change something.
我的第三个故事与死亡有关。7 岁那年,我读到过这样一段话,大意是:“如果把每一天都当作生命的最后一天,总有一天你会如愿以偿。”我记住了这句话,从那时起,33 年过去了,我每天早晨都对著镜子自问: “假如今天是生命的最后一天,我还会去做今天要做的事吗?”如果一连许多天我的回答都是“不”,我知道自己应该有所改变了。
Remembering that I’ll be dead soon is the most important tool I’ve ever encountered to help me make the big choices in life. Because almost everything — all external expectations, all pride, all fear of embarrassment or failure - these things just fall away in the face of death, leaving only what is truly important. Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose. You are already naked. There is no reason not to follow your heart.
让我能够做出人生重大抉择的最主要办法是,记住生命随时都有可能结束。因为几乎所有的东西─所有对自身之外的希求、所有的尊严、所有对困窘和失败的恐惧─在死亡来临时都将不复存在,只剩下真正重要的东西。记住自己随时都会死去,这是我所知道的防止患得患失的最好方法。你已经一无所有了,还有什么理由不跟著自己的感觉走呢。
About a year ago I was diagnosed with cancer. I had a scan at 7:3 in the morning, and it clearly showed a tumor on my pancreas. I didn’t even know what a pancreas was. The doctors told me this was almost certainly a type of cancer that is incurable, and that I should expect to live no longer than three to six months. My doctor advised me to go home and get my affairs in order, which is doctor’s code for prepare to die. It means to try to tell your kids everything you thought you’d have the next years to tell them in just a few months. It means to make sure everything is buttoned up so that it will be as easy as possible for your family. It means to say your goodbyes.
大约一年前,我被诊断患了癌症。那天早上七点半,我做了一次扫描检查,结果清楚地表明我的胰腺上长了一个瘤子,可那时我连胰腺是什么还不知道呢!医生告诉我说,几乎可以确诊这是一种无法治愈的恶性肿瘤,我最多还能活 3 到 6 个月。医生建议我回去把一切都安排好,其实这是在暗示“准备后事”。也就是说,把今后十年要跟孩子们说的事情在这几个月内嘱咐完;也就是说,把一切都安排妥当,尽可能不给家人留麻烦;也就是说,去跟大家诀别。
I lived with that diagnosis all day. Later that evening I had a biopsy, where they stuck an endoscope down my throat, through my stomach and into my intestines, put a needle into my pancreas and got a few cells from the tumor. I was sedated, but my wife, who was there, told me that when they viewed the cells under a microscope the doctors started crying because it turned out to be a very rare form of pancreatic cancer that is curable with surgery. I had the surgery and I’m fine now.
那一整天里,我的脑子一直没离开这个诊断。到了晚上,我做了一次组织切片检查,他们把一个内窥镜通过喉咙穿过我的胃进入肠子,用针头在胰腺的瘤子上取了一些细胞组织。当时我用了麻醉剂,陪在一旁的妻子后来告诉我,医生在显微镜里看了细胞之后叫了起来,原来这是一种少见的可以通过外科手术治愈的恶性肿瘤。我做了手术,现在好了。
This was the closest I’ve been to facing death, and I hope its the closest I get for a few more decades. Having lived through it, I can now say this to you with a bit more certainty than when death was a useful but purely intellectual concept:
No one wants to die. Even people who want to go to heaven don’t want to die to get there. And yet death is the destination we all share. No one has ever escaped it. And that is as it should be, because Death is very likely the single best invention of Life. It is Life’s change agent. It clears out the old to make way for the new. Right now the new is you, but someday not too long from now, you will gradually become the old and be cleared away. Sorry to be so dramatic, but it is quite true.
这是我和死神离得最近的一次,我希望也是今后几十年里最近的一次。有了这次经历之后,现在我可以更加实在地和你们谈论死亡,而不是纯粹纸上谈兵,那就是: 谁都不愿意死。就是那些想进天堂的人也不愿意死后再进。然而,死亡是我们共同的归宿,没人能摆脱。我们注定会死,因为死亡很可能是生命最好的一项发明。它推进生命的变迁,旧的不去,新的不来。现在,你们就是新的,但在不久的将来,你们也会逐渐成为旧的,也会被淘汰。对不起,话说得太过分了,不过这是千真万确的。
Your time is limited, so don’t waste it living someone else’s life. Don’t be trapped by dogma — which is living with the results of other people’s thinking. Don’t let the noise of others’ opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.
你们的时间都有限,所以不要按照别人的意愿去活,这是浪费时间。不要囿于成见,那是在按照别人设想的结果而活。不要让别人观点的聒噪声淹没自己的心声。最主要的是,要有跟著自己感觉和直觉走的勇气。无论如何,感觉和直觉早就知道你到底想成为什么样的人,其他都是次要的。
When I was young, there was an amazing publication called The Whole Earth Catalog, which was one of the bibles of my generation. It was created by a fellow named Stewart Brand not far from here in Menlo Park, and he brought it to life with his poetic touch. This was in the late 96’s, before personal computers and desktop publishing, so it was all made with typewriters, scissors, and polaroid cameras. It was sort of like Google in paperback xxxx, 35 years before Google came along: it was idealistic, and overflowing with neat tools and great notions.
我年轻时有一本非常好的刊物,叫《全球概览》(The Whole Earth Catalog),这是我那代人的宝书之一,创办人名叫斯图尔特?布兰德(Stewart Brand),就住在离这儿不远的门洛帕克市。他用诗一般的语言把刊物办得生动活泼。那是 2 世纪 6 年代末,还没有个人电脑和桌面印刷系统,全*打字机、剪刀和宝丽莱照相机(Polaroid)。它就像一种纸质的 Google,却比 Google 早问世了 35 年。这份刊物太完美了,查阅手段齐备、构思不凡。
Stewart and his team put out several issues of The Whole Earth Catalog, and then when it had run its course, they put out a final issue. It was the mid-97s, and I was your age. On the back cover of their final issue was a photograph of an early morning country road, the kind you might find yourself hitchhiking on if you were so adventurous. Beneath it were the words: “Stay Hungry. Stay Foolish.” It was their farewell message as they signed off. Stay Hungry. Stay Foolish. And I have always wished that for myself. And now, as you graduate to begin anew, I wish that for you.
斯图尔特和他的同事们出了好几期《全球概览》,到最后办不下去时,他们出了最后一期。那是 2 世纪 7 年代中期,我也就是你们现在的年纪。最后一期的封底上是一张清晨乡间小路的照片,就是那种爱冒险的人等在那儿搭便车的那种小路。照片下面写道: 好学若饥、谦卑若愚。那是他们停刊前的告别辞。求知若渴,大智若愚。这也是我一直想做到的。眼下正值诸位大学毕业、开始新生活之际,我同样愿大家:
Stay Hungry. Stay Foolish.
好学若饥、谦卑若愚。
Thank you all very much.
谢谢大家。
凭什么拿年薪20万?》这个系列停了好久了,也没有什么反应,那就把结论给出了,故事就不写了吧,算是结了。
  艾小伟就业第六法则:找一个能帮你的导师。
  艾小伟就业第七法则:不要抱怨单位的问题,正是因为单位有问题才要你来的,问题是你的机会。
  艾小伟就业第八法则:时间不用并不会存起来,即使一件事今天没有报酬,只要是对单位或者别人有益的,就去做吧-其实这样的事,你总是能找到的。在做事中,你会培养更多的能力和积累更多的资源。
  艾小伟就业第九法则:超越竞争,向最高点看齐。创造没有竞争的空间,这一点有些象现在流行的《蓝海战略》,其实七八年前我就是这样做的了。而一个最高的要求标准,与最高的人打交道将给你和你的单位带了更大的价值。
  艾小伟就业第十法则:永远跟你的老板站在一起。世上成功的路只有两条,一条是做对事,一条是跟对人,如果你不能做一个做对事的人,那么做一个跟对人的人吧。
  把前面的法则也写在这里:
  艾小伟就业第一法则:如果连艾小伟那个猪头都能拿年薪20万,你也能。如果你觉得自己很笨,或者成绩很差,没特长,等等,都没关系,关键你要自信,要去做。
  艾小伟就业第二法则:大部分人最终要从事的都不是本专业,而且经理从来不是学校里教出来的。有一技之长更好,专业不对口也没什么关系。
  艾小伟就业第三法则:一切都是可以学的。有什么不会的,就学吧,哪怕第二天做,头天晚上学都来得及。记住,学校毕业不是结束,而是开始。
  艾小伟就业第四法则:不放弃就有机会。别放弃,放弃就完了。
  艾小伟就业第五法则:找工作首先是寻找一个发展的空间。
  以上这些,第一到九条都是我当时那样做的,第十条当时也在做,但没有那么明确,现在回头想的时候觉得应该明确的。应该说,这些都是经过实践的很成功的经验。
  在这个系列最初的时候,我说我和另一个部门经理的薪水有三四倍的差距,而那个差距的原因大部分在这十条之外,这个就不说了吧,因为,如果这算一个秘密的话,知道这个秘密的人应该达到分享这个秘密的级别。--而且,那个原因也是这十条的一个副产品。
  而以上十条,就算不到20万,每条1万,对刚出和要出校门的学生来说,十条做到了,年薪10万总是很轻松的了。就这样,把这个系列结了吧。



 
chiefsailor @ 2006-05-14 22:23

1. CREATE DATABASE database_name [WITH LOG IN “pathname”]

创建数据库。

database_name:数据库名称。

“pathname”:事务处理日志文件。

创建一database_name.dbs目录,存取权限由GRANT设定,无日志文件就不能使用

BEGIN WORK等事务语句(可用START DATABASE语句来改变)。

可选定当前数据库的日志文件。

如:select dirpath form systables where tabtype = “L”;

例:create databse customerdb with log in “/usr/john/log/customer.log”;

DATABASE databse-name [EXCLUSIVE]
选择数据库。

database_name:数据库名称。

EXCLUSIVE:独占状态。

存取当前目录和DBPATH中指定的目录下的数据库,事务中处理过程中不要使用此语句。

例:dtabase customerdb; 

3. CLOSE DATABASE

关闭当前数据库。

database_name:数据库名称。

此语句之后,只有下列语句合法:

CREATE DATABASE; DATABASE; DROP DATABSE; ROLLFORWARD DATABASE;

删除数据库前必须使用此语句。

例:close database;

4. DROP DATABASE database_name

删除指定数据库。

database_name:数据库名称。

用户是DBA或所有表的拥有者;删除所有文件,但不包括数据库目录;不允许删除当前数据库(须先关闭当前数据库);事务中处理过程中不能使用此语句,通过ROLLBACK WORK 也不可将数据库恢复。

例:drop databse customerdb;

5. CREATE [TEMP] TABLE table-name (column_name datatype [NOT NULL], …)

[IN “pathname”]

创建表或临时表。

table-name :表名称。

column_name:字段名称。

data-type:字段数据类型。

path-name:指定表的存放位置

TEMP用于指定建立临时表;表名要唯一,字段要唯一;有CONNECT权限的用户可建立临时表;创建的表缺省允许CONNECT用户存取,但不可以ALTER。

例:create table user

( c0 serial not null, c1 char (10),

c2 char(2),

c3 smallint,

c4 decimal(6,3),

c5 date

) in “usr/john/customer.dbs/user;

6. ALTER TABLE

ALTER TABLE table-name

{ADD (newcol_name newcol_type [BEFORE oldcol_name], …) | DROP (oldcol_name, …)

| MODIFY (oldcol_name newcol_type [NOT NULL], … )}, …

修改表结构。

table-name:表名称。

newcol_name:新字段名称

newcol_type:新字段类型

oldcol_name:老字段名称

可以使用单个或多个ADD子句、DROP子句、MODIFY子句,但某个字句失败,操作即中止;原字段是NULL,不允许MODIFY为NOT NULL,除非所有NULL字段中均非空,反之可以;ALTER使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句。

例:alter table user

add ( c6 char(20) before c5);

7. RENAME TABLE oldname TO newname

修改表名。

oldname:原名称。

newname:新名称。

RENAME使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句。

例:rename user to bbb;

8. DROP TABLE table-name

删除表。

table-name:表名称。

删除表意味着删除其中所有数据、各字段上的索引及对表的赋权、视图等;用户不能删除任何系统目录表;语句使用者是表拥有者或拥有DBA权限,事务中处理过程中不要使用此语句。

9. RENAME COLUMN table.oldcolumn, TO newcolumn

修改字段名。

table.oldcolumn:表名及原字段名称

newcolumn:新字段名称。

语句使用者是表的拥有者或拥有DBA权限或有ALTER权限的用户,事务中处理过程中不要使用此语句。

例:rename column user.c6 to c7;

10. CREATE VIEW view-name column-list

CREATE VIEW view-name column-list AS select_statement [WITH CHECK OPTION]

创建视图。

view-name:视图名称。

column-list:字段列表。

select_statement:SELECT语句。

以下语句不使用视图:ALTER TABLE,DROP INDEX,ALTER INDEX,LOCK TABLE,CREATE INDEX, RENAME TABLE;视图将延用基表的字段名,对表达式等虚字段和多表间字段重名必须指明标识其字段名;若对视图中某些字段命名,则所有字段都必须命名;视图中数据类型延用基表中的数据类型,虚字段起诀于表达式;不能使用ORDER BY和UNION子句;对视图中所有的字段要有SELECT权限;事务中处理过程中使用此语句,即使事务回滚,视图也将建立,不能恢复。

例:create view v_user as select * from user where c1 = “B1”;

11. DROP VIEW view-name

删除视图。

view-name:视图名称。

用户可删除自己建立的视图;视图的后代视图也被删除;事务中处理中不要使用此语句。

例:drop view v_user;

12. CREATE INDEX

CREATE [UNIQUE/DISTINCT] [CLUSTER] INDEX index_name ON table_name

([column_name ASC/DESC],…)

创建索引。

index_name:索引名称。

table_name:表名称。

column_name:字段名称。

UNIQUE/DISTINCT:唯一索引。

CLUSTER:使表的物理存放顺序按索引排列。

ASC/DESC:升序或降序,缺省升序。

语句执行时,将表的状态置为EXCLUSIVE;复合索引最多包含8个字段,所有字段长度和不得大于120字节;事务中处理过程中使用此语句,即使事务回滚,索引将建立,不能恢复。

例:create cluster index ix_user on user(c5);

13. ALTER INDEX index-name TO [NOT] CLUSTER

修改索引性质。

index-name:索引名称。

TO [NOT] CLUSTER:去掉或加上CLUSTER属性。

语句执行时,将表的状态置为EXCLUSIVE;事务中处理过程中使用此语句,即使事务回滚,索引性质将改变,不能恢复。

例:alter index ix_user to not cluster;

14. DROP INDEX index-name

删除索引。

index-name:索引名称。

语句使用者是索引的拥有者或拥有DBA权限,事务中处理过程中不要使用此语句,否则事务无法恢复。

例:drop index ix_user;

15. CREATE SYNONYM synonym FOR table-name

创建同义名。

synonym:同义名

table-name:表名称

数据库的创建者可以使用同义名;没有赋予同义名权限的用户不能使用同义名;同义名不能和表名相同;事务中处理过程中不要使用此语句。

例:create synonym user_alias for user;

16. DROP SYNONYM synonym

删除同义名。

synonym:同义名

可以删除自己建立的同义名;事务中处理过程中不要使用此语句,否则无法恢复。

例:drop synonym user_alias;

17. UPDATE STATISTICS [FOR TABLE table-name]

更新数据库的统计数字。

table-name:表名称

此语句仅作用于当前数据库;可提高查询效率;只有执行此语句,才改变统计数据。

例:update statistics for table user;

GRANT {DBA|RESOURCE|CONNECT} TO {PUBLIC|user-list}
授权命令。

PUBLIC|user-list:全部或指定的用户。

三种权限居且仅居其一,事务处理过程中不要执行GRANT语句。

例:grant resource to pulbic;

GRANT tab-privilege ON table-name TO {PUBLIC|user-list} [WITH GRANT OPTION]

授表级权限。

tab-privilege:表级权限。

table-name:表名称。

PUBLIC|user-list:全部或指定的用户。

[WITH GRANT OPTION]:表示被授权用户有否权限进行二次授权。

用户可以在自己建立表达式或被[WITH GRANT OPTION]准许的表中进行赋权;限定越多的权限优先级越高。

例:grant update(c1,c6) on user to dick with grant option;

附(INFORMIX的权限)

(1) 数据库的权限(控制对数据库的访问以及数据库中表的创建和删除)

DBA权限:全部权利,修改系统表,建立和删除表与索引、增加和恢复表数据,以及授予其他用户数据库权限等;

RESOURCE权限:允许对数据库表中的数据进行存取,建立永久性表以及索引。

CONNECT权限:只允许对数据库表中的数据进行存取,建立和删除视图与临时表。

(2)表级权限(对表的建立、修改、检索和更新等权限)

ALTER:更改权限

DELETE:删除权限

INDEX:索引权限

INSERT:插入权限

SELECT [(cols)]:指定字段或所有字段上的查询权限,不指明字段缺省为所有字段。

UPDATE [(cols)] :指定字段或所有字段上的更新权限,不指明字段缺省为所有字段。

ALL [PRIVILEGES]:以上所有表级权限

19. REVOKE {DBA|RESOURCE|CONNECT} FROM {PUBLIC|user-list}

收权命令。

PUBLIC|user-list:全部或指定的用户。

三种权限居且仅居其一,事务处理过程中不要执行GRANT语句。

例:revoke resource from john;

REVOKE tab-privilege ON table-name FROM {PUBLIC|user-list}

收表级权限。

tab-privilege:表级权限。

table-name:表名称。

PUBLIC|user-list:全部或指定的用户。

[WITH GRANT OPTION]:表示被授权用户有否权限进行二次授权。

用户只能取消由其本人赋予其他用户的表级存取权限;不能取消自己的权限,对SELECT和UPDATE作取消时,将取消
所有表中字段的SELECT 和UPDATE权限。

例;revoke update on user from dick;

LOCK TABLE table-name IN {SHARE|EXCLUSIVE} MODE
记录级加锁和表级加锁或文件加锁。

table-name:表名称。

SHARE:允许读表中数据,但不允许作任何修改

EXCLUSIVE:禁止其他任何形式访问表

每次只能对表琐定一次;事务处理过程中,BEGIN WORK后立即执行LOCK TABLE以取代记录级加锁,COMMIT WORK和
ROLLBACK WORK语句取消所有对表的加锁;若没有事务处理,锁将保持到用户退出或执行UNLOCK为止。

例:lock table user in exclusive mode;

UNLOCK TABLE table-name
取消记录级加锁和表级加锁或文件加锁。

table-name:表名称。

例:unlock user;

SET LOCK MODE TO [NOT] WAIT
改变锁定状态。

TO [NOT]:等待解锁,有可能被死锁或不等待并提示错误信息,表示此记录被锁,缺省值。

访问一个EXCLUSIVE状态下的记录,将返回一个错误。

START DATABSE db_name [WITH LOG IN “pathname”]
启动事务处理。

“pathname”:事务处理日志文件。

执行该语句前,需要先关闭当前数据库。

例;clost database;

start databse customer with log in “/usr/john/log/customer.log”;
BEGIN WORK
开始事务。例:begin work;

COMMIT WORK
提交(正常结束)事务。例:commit work;

ROLLBACK WORK
回滚(非正常结束)事务。例:rollback work;

SELECT
SELECT select_list FROM tab_name|view_name

WHERE condition

GROUP BY column_name

HAVING condition

ORDER BY column_list

INTO TEMP table_name

查询语句。

select_list:选择表或*

tab_name:表名称

view_name:视图名称。

condition:查询条件,可使用BETWEEN、IN、LIKE、IS NULL、LIKE、MATCHES、NOT、

AND、OR、=、!=或<>、>、 >= 、<=、<、ALL、ANY、SOME

column_name:分组字段名称

condition:群聚条件

column_list:排序字段列表,缺省ASC,可指定DSC;排序时,NULL值小于非零值。

table_name:临时表名称

例:略

附(常用函数)

(1)集合函数:

count(*)、

sum(数据项/表达式)、avg(数据项/表达式)、max(数据项/表达式)、min(数据项/表达式)

count(distinct 数据项/表达式)、sum(distinct数据项/表达式)、avg(distinct数据项/表达式)

(2)代数函数和三角函数

HEX(数据项/表达式)、ROUND(数据项/表达式)、TRUNC(数据项/表达式)、

TAN(数据项/表达式)、ABS(数据项/表达式)、MOD(被除数,除数)

(3)统计函数

标准差,stdev()、方差,variance()、范围,rang()

(4)时间函数

DAY(日期/时间表达式):返回数字型

MONTH(日期/时间表达式):返回整数

WEEKDAY(日期/时间表达式):0



 
chiefsailor @ 2006-05-14 22:20

注:下列语句部分是Mssql语句,不可以在access中使用。 

SQL分类:
DDL—数据定义语言(Create,Alter,Drop,DECLARE)
DML—数据操纵语言(Select,Delete,Update,Insert)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

首先,简要介绍基础语句:
1、说明:创建数据库
Create DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count(*) as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。


其次,大家来看一些不错的sql语句
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a )
select * from (Select a,b,c FROM a) T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

14、说明:前10条记录
select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、说明:随机取出10条数据
select top 10 * from tablename order by newid()

18、说明:随机选择记录
select newid()

19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'

21、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3

23、说明:初始化表table1
TRUNCATE TABLE table1

24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 

//转自:http://www.pkvs.com/asp/news.asp?id=470



 
chiefsailor @ 2006-05-13 19:21

1,狮子王thelionking
  迪斯尼的经典之作,我想很少有人没看过吧,这部1994年号称卡通版哈姆雷特的片子,塑造了很多精彩的角色,看到它就想起了小狮子辛巴,它的好朋友彭彭和丁满,我一直觉得卡通片中也有很多现实世界中的黑暗面,并不仅仅是给小孩子看的不需要思考的美好面,辛巴的父亲——慈爱伟大的老狮子,还有那些凶残狠毒的土狼,其实在现实中都有各自的对应物。除了作品本身精彩之外,它的主题曲也同样出色,我想大家都很熟了,就是由Eltonjohn演唱的canyoufeelthelovetonight,据说他是同性恋不知是不是误传?  

http://photocdn.sohu.com/20060510/Img243174827.jpg

2.再见萤火虫(又名萤火虫之墓)graveofthefireflies 
        宫崎骏的漫画大多是精品,在他的作品中那种田园风光,或是自然景色,以及可爱纯真的小女孩等等等等都是那么让人喜欢,感动。但是我今天要向大家强烈推荐这部1988年讲述二战中一对日本孤儿兄妹的作品。日本的战败不值得同情,但在战争中它们国家的普通老百姓也遭受了巨大的痛苦,诚田和节子的父亲在战争中牺牲,母亲也在空袭中死亡,兄妹俩在相互依赖相互扶持中生活,却无法改变死亡的结局,当妹妹节子因长期的营养不良死去后,身为哥哥的诚田也一天天走向死亡,影片的最后黑暗中满天的荧火虫快乐的飞舞着,节子拉着哥哥的手捧着心爱的糖果罐慢慢的走远… 
http://photocdn.sohu.com/20060510/Img243174832.jpg

3,虫虫特工队abug’slife
  这部同样由迪斯尼皮克斯推出的电脑动画描写一只蚂蚁为了改变自己部落长期被蚱蜢欺凌的局面,自告奋勇的去寻找救兵,但千辛万苦之后却找回了一群马戏团的下岗昆虫,结果它们只有依靠自己了。很搞笑的一部片子,有时候我真的佩服那些幕后人员,怎么能想出这么精彩的桥段,会发明自动收割机的蚂蚁,变魔术的螳螂和飞蛾,女性化的瓢虫,总而言之看过后心情狂好。说到蚂蚁,梦工厂第一部电脑动画《小蚁雄兵》也蛮不错的,就是制作的丑了点,颜色十分灰土,不过好在情节很吸引人,值得一看。
http://photocdn.sohu.com/20060510/Img243174837.jpg 

4,海底总动员findingnemo
  说实在的情节一般般,就是一只大鱼找小鱼的故事,但是很多小细节上很好笑,那只转个头就会失忆的雌鱼,长得比小丑鱼爸爸还壮,经常搞笑,还有那几只立誓和鱼类作朋友的鲨鱼,别太搞笑哦!最吸引我的就是那些五彩斑澜各种各样的海底鱼,以及美仑美奂的海底景色,太美妙了,说实在的,迪斯尼的动画在造型和景色上就是比梦工厂的漂亮,但梦工厂胜在情节够新。言归正传,这部片子是当年的暑期票房冠军,无数的大人小孩挤到电影院去看,好象还刷新了啥票房记录,总而言之很厉害就是啦
http://photocdn.sohu.com/20060510/Img243174843.jpg 

5,怪物史莱克shrek
  这部梦工厂出人头地攻战动画片市场的片子,颠覆了很多传统,比如公主不漂亮也不需要王子来救,而救她的居然是应该被王子砍杀的怪物,并且结尾公主为了配得上怪物,变得狂丑,我晕!很多人说这是近年来最好看的动画片的动画片,但我有点不适应,看惯了王子公主的画面,一时间还真接受不了这种搭配,更别说还有这种个性公主,和小鸟斗歌喉,把小鸟给唱爆了,还有吹气球,加上那只叽叽歪歪的驴子,也许以后的动画片就是这种趋势了,别啊……
http://node1.foto.ycstatic.com/200605/13/b/8077339.jpg 


6,花木兰mulan
  真是无奈,自己的古老传说在别人手中发扬光大了,郁闷啊!而且看看花木兰那长相,活脱就是一老外,如果换成中国古代版就顺眼多了,可惜中国的很多精品都被好莱坞,日本翻拍了,有的改的简直不成形了,这话题再说就一肚子伤心史了,还是打住吧。但撇开这些不提,这部动画片还是蛮好看的,至少我在看的时候还是很投入的,不知为什么好莱坞在片子中总喜欢加一个话多的角色,无论是电影还是卡通,这里也有一个负责搞笑的小龙,无需什么本事,只要惹人笑就行了,少了它还真少了很多乐趣。还有花木兰她奶奶也是一古灵精怪小老太婆。
http://photocdn.sohu.com/20060510/Img243174850.jpg 

7,风中奇缘ghostintheshell
  首先要推荐它的主题曲,thecolorofthewind十分十分的好听,有一条不成文的定律,就是大多数卡通片的主题曲都十分好听,而且经常请一些天王天后级人物合唱,平常很难得的搭配,比如埃及王子请来了惠特尼休斯顿和玛丽亚凯莉对唱的whenyoubelieve,百听不厌。又跑题了,这部片子带点种族色彩,据说当时还引起了点小小矛盾,故事说的是一位印第安女子和一位英国军官的爱情,英国殖民者为了寻找黄金,攻打印第安部落,两个相爱的人在两难的局面下选择了分别,有点悲伤。
http://photocdn.sohu.com/20060510/Img243174854.jpg

8,小姐与流氓ladyandthetramp
  这片子很早了,1955年的,我还没出生呢,而且当时动画技术也没现在这么发达,所以这片子透着一股子怀旧气氛,之所以把它列出来,是因为每次在看的时候,内心深处都有一种难以言喻的温馨,虽然它说的是两条狗的故事,而且情节极其简单,动画极其质朴,时间也是超短,但我很喜欢看,尤其是看到那条美美的淑女狗和流浪狗吃意大利面时,两人从两头同时吃一根面,吃啊吃啊就kiss了,好浪漫,这个场景后来好象被很多爱情片借鉴,只不过面条换成了可乐或是薯条。能把这片子看完并喜欢的人,我想一定和我一样是很感性的人,嘿嘿,所以把它推荐给双方都很感性的情侣。 
http://node0.foto.ycstatic.com/200605/13/2/8065922.jpg 

9,宝莲灯thebaolianlamp
  支持一下国货,虽然它缺点多多,不过我个人认为这也算是中国动画的一个大进步,所以我在看的时候一直在寻找它的闪光点,可惜少了点。但还算不错啦,而且它制作的人物造型比较讨我喜欢,画的小猴子狂可爱,孙悟空也很好玩,尤其是那句:“不打的你满脸桃花开,你还不知道花儿为什么这样红。”这句有意思,怎么没流传开呢,可惜。不过这片子也带有中国动画片的通病就是总要找机会教育人,说教一下,还好不是太明显。但是这片子之后,好象就没有后续行动了,没再出过相同水平有一定影响力的卡通片了,前段时间的梁山泊与祝英台好象是和台湾合作的,也还不错,但看起来中国的卡通要想振作不知何年何月。
http://photocdn.sohu.com/20060510/Img243174859.jpg 

10,小鸡快跑chickenrun
  一群为了自己而跑的小鸡,看不出公母,也看不出大小,粘土捏的,丑是丑了点,但再次证明了科技不是万能的,没有高科技电脑技术的动画片同样能吸引人,情节不复杂,就是一群即将被作成鸡肉馅饼的小鸡们,为了逃离凶狠鸡场老板娘的迫害,加上一只美国公鸡的帮助,成功越狱的故事。里面有句搞笑台词,一只英国老公鸡批评美国公鸡时说:不能太相信美国人,他们哪次不是到最后才参战?
http://photocdn.sohu.com/20060510/Img243174862.jpg 




 
日历
网志分类
· 所有网志
· 生活点滴
· 学习生涯
· 物语
· 我贫我掰
· C/C++
· 技术文档
· .NET
· JAVA
· Linux
· Network
· Database
精华文章
人生必看十大动画片
历届奥斯卡奖获奖名单回顾
帮你参悟人生十个故事
冷评热论央视记者
考研吧,悟空!
国内热门软件作者真人照片(多图)
C++程序设计之四书五经(上)
C++程序设计之四书五经(下)
C++资源之不完全导引(上)
C++资源之不完全导引(下)
最新博客地址
Chiefsailor的博客