什么叫活动服务器组件(Active Server Compontents)?组件是基于Activex技术的代码片断,通过指定接口提供指定的一组服务,组件供给客户端(Clients)在运行时候请求的对象。你可以理解成组件是一种程序,通过调用这种程序,你可以实现你在ASP程序中无法实现或者很难实现的功能,组件是一种很好的代码重用方法。 我们可以运用Active Server Pages设计制作动态、交互的Web页面,但是一旦你开始着手工作,参与一些实际工作的时候,你会发现asp在某些方面功能不强,甚至不借助服务器端组件就很难实现某些功能,例如:数据库操作(我们通常使用ADO,ADO就是一个组件),邮件功能,文件系统操作,图形功能...但是幸运的是我们可以找到很多组件来提高ASP编程应用能力,在下面的内容我们将系统的介绍有关的组件,在下一章里面我们还将详细介绍如何亲自动手编写组件。 服务器组件和ASP内置对象应用程序(Application)、会话(Session)、请求(Request)、响应(Response)和服务器对象不同,不能直接使用,而必须首先被实例化。 CreateObject函数创建一个对象并返回一个对对象的引用。这个函数的语法如下: 其中application是应用程序的名字,className是这种对象的名字。一个application可以由一个或者多个对象组成。他们可以在内部之间相互调用的。 例如 Set myConnection = Server.Createobject("AdoDB.Recordset") 注意: 不能这样创建的Asp内建对象的实例,如下面的例子将导致一个错误
你可以就通过在你的ASP脚本中使用活动服务器端组件,创建动态,交互的Web页面 |存取数据库| 附 用odbc连接数据库: odbc中提供三种dsn,它们的区别很简单:用户dsn只能用于本用户。系统dsn和文件dsn的区别只在于连接信息的存放位置不同:系统dsn存放在odbc储存区里,而文件dsn则放在一个文本文件中。 在asp中使用它们时,写法如下: A.链接sql server: 用系统dsn: connstr="DSN=dsnname;UID=xx;PWD=xxx;DATABASE=dbname" 用文件dsn: connstr="FILEDSN=xx;UID=xx;PWD=xxx;DATABASE=dbname" 还可以用连接字符串(从而不用再建立dsn): connstr="DRIVER={SQL SERVER};SERVER=servername;UID=xx;PWD=xxx" B.链接access: 用系统dsn: connstr="DSN=dsnname" (或者为:connstr="DSN=dsnname;UID=xx;PWD=xxx") 用文件dsn: connstr="FILEDSN=xx" 还可以用连接字符串(从而不用再建立dsn): connstr="DRIVER={Microsoft Access Driver};DBQ=d:/abc/abc.mdb" 缺陷: ODBC含有大量的低级的调用,因此开发ODBC应用程序还比较困难. 开发者不得不将大量的精力花在底层的数据库通信中,而不能专注于他们所要处理的数据. OLE DB OLE DB 由三个组件构成:数据使用者(例如,一个应用程序);包含并公开数据的数据提供程序以及处理并传输数据的服务组件(例如,查询处理器、游标引擎)。OLE DB 是一个针对 SQL 数据源和非 SQL 数据源(例如,邮件和目录)进行操作的 API。 OLE DB 为 C 和 C++ 程序员及使用其他包含 C 样式函数调用语言的程序员提供绑定。有一些语言(例如 VB 和 VBScript)不提供指针数据类型(地址变量)。因此,这些语言不能使用 C 样式绑定,而且不能直接调用 OLE DB。 这里有microsoft,数据访问技术的演变 在ASP中,用来存取数据库的对象统称ADO对象(Active Data Objects) ADO包括的七个对象: ● Command:定义对数据源进行操作的命令; ● Connection:建立一个数据源的连接; ● Error:提供数据访问错误的细节; ● Field:表示一般数据类型的字段; ● Parameter:表示Command对象的参数; ● Property:表示由数据源定义ADO对象的动态特性; ● Recordset:数据库命令结果集对象。 主要对象有三:Connection、Recordset和Command,其中Connection负责打开或连接数据库,Recordset负责存取数据表,Command负责对数据库执行行动查询(Action Query)命令和执行SQL Server的Stored Procedure。只依靠这三个对象还是无法存取数据库的,还必须具有数据库存取的驱动程序:OLE DB驱动程序和ODBC驱动程序。对于任何一种数据库都必须有相对应的OLE DB驱动程序和ODBC驱动程序,ADO对象才能对数据库进行存取。
● 创建数据库链接 ● 创建数据对象 ● 操作数据库 ● 关闭数据对象和链接 附end |创建数据库链接| 连接各数据库可以使用驱动程序,也可以使用数据源(dns方式),不过我建议大家使用驱动程序,因为使用驱动程序非常方便、简单,而使用数据源比较麻烦。下表有一定基础的朋友应该可以看懂.我们常用的数据库都不会有密码,所以下面的验证方面的参数可以省略. 但一个链接的完成最起码应该有两个内容:驱动程序及数据库位置 (dns方式生成的文件就包含了这两个内容). |数据库链接实例:| 1. 我们在一般情况下使用Access的数据库比较多,在这里我建议大家连接Access数据库使用下面的方法: dim conn 有许多初学者在遇到数据库连接时总是会出问题,然而使用上面的驱动程序只要你的数据库路径选对了就不会出问题了。 2. 1.建立MdbRecordset对象。MDB数据库是一个完整的数据库,内部可能含有若干个数据表,在此函数中,Connection的作用是连接数据库,Recordset的作用是打开数据表。 Function CreateMdbRecordset(数据库文件名, 数据表名或Select语句 ) Dim conn,Provider,DBPath ’建立Connection 对象 Set conn = Server.CreateObject(“ADODB.Connection”) Provider=“Provider=Microsoft.Jet.OLEDB.4.0;” DBPath = “Data Source=” & Server.MapPath(“数据库文件名”) ’打开数据库 conn.Open Provider & DBPath Set CreateMdbRecordset = Server.CreateObject(“ADODB.Recordset”) ’打开数据表 CreateMdbRecordset.Open “数据表名”, conn, 2, 2 End Function 2. 建立带密码的MDB数据库的Recordset对象。它的建立方式与建立不带密码的MDB数据库的Recordset对象类似,只是多了一个密码参数,即在与数据库连接时,必须给出密码信息。 Function CreateSecuredMdbRecordset( 数据库文件名, 数据表名或Select语句,password ) Dim conn,Provider,DBPath ’建立Connection 对象 Set conn = Server.CreateObject(“ADODB.Connection”) Provider = “Provider=Microsof.Jet.OLEDB.4.0;” DBPath = “Data Source=”& Server.MapPath(“数据库文件名”) ’连接数据库,注意要带有密码参数 conn.Open Provider & DBPath&“Jet OLEDB:Database Password=”&assword Set CreateSecuredMdbRecordset = Server. CreateObject(“ADODB.Recordset”) ’打开数据表 CreateSecuredMdbRecordset.Open “数据表名”, conn, 2, 2 End Function 附: Rs.open sql,conn,A,B 的A、B各代表什么? RS.OPEN SQL,CONN,A,B A: ADOPENFORWARDONLY(=0) 只读,且当前数据记录只能向下移动 ADOPENSTATIC(=3) 只读,当前数据记录可自由移动 ADOPENKEYSET(=1) 可读写,当前数据记录可自由移动 ADOPENDYNAMIC(=2) 可读写,当前数据记录可自由移动,可看到新增记录 B: ADLOCKREADONLY(=1) 默认值,用来打开只读记录 ADLOCKPESSIMISTIC(=2) 悲观锁定 ADLOCKOPTIMISTIC(=3) 乐观锁定 ADLOCKBATCHOPTIMISTIC(=4) 批次乐观锁定 PS: 乐观锁定:完全依靠数据库来管理锁的工作。 悲观锁定:应用程序自己管理数据或对象上的锁处理
(下面介绍recordeset的时候有更详细的解释). 附end
|SQL常用命令使用方法:| (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]" sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 in ('值1','值2','值3')" sql="select * from 数据表 where 字段名 between 值1 and 值2" (2) 更新数据记录: sql="update 数据表 set 字段名=字段值 where 条件表达式" sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" (3) 删除数据记录: sql="delete from 数据表 where 条件表达式" sql="delete from 数据表" (将数据表所有记录删除) (4) 添加数据记录: sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)" sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) (5) 数据记录统计函数: AVG(字段名) 得出一个表格栏平均值 COUNT(*¦字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个表格栏最小的值 SUM(字段名) 把数据栏的值相加 引用以上函数的方法: sql="select sum(字段名) as 别名 from 数据表 where 条件表达式" set rs=conn.excute(sql) 用 rs("别名") 获取统的计值,其它函数运用同上。 (5) 数据表的建立和删除: CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… ) 例:CREATE TABLE tab01(name varchar(50),datetime default now()) DROP TABLE 数据表名称 (永久性删除一个数据表) 附另一资料,sql基本语句. 掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。 练掌握SQL是数据库用户的宝贵财 富。在本文中,我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。 在我们开始之前,先使用CREATE TABLE语句来创建一个表(如图1所示)。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句—数据操作语言(DML)语句进行处理。 SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。 INSERT语句 用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句: INSERT INTO EMPLOYEES VALUES ('Smith','John','1980-06-10', 'Los Angles',16,45000); 通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。 我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。 如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。 回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。 同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。 对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd),但是在系统中可以进行定义,以接受其他的格式。当然,2000年临近,请你最好还是使用四位来表示年份。 既然你已经理解了INSERT语句是怎样工作的了,让我们转到EMPLOYEES表中的其他部分: INSERT INTO EMPLOYEES VALUES ('Bunyan','Paul','1970-07-04', 'Boston',12,70000); INSERT INTO EMPLOYEES VALUES ('John','Adams','1992-01-21', 'Boston',20,100000); INSERT INTO EMPLOYEES VALUES ('Smith','Pocahontas','1976-04-06', 'Los Angles',12,100000); INSERT INTO EMPLOYEES VALUES ('Smith','Bessie','1940-05-02', 'Boston',5,200000); INSERT INTO EMPLOYEES VALUES ('Jones','Davy','1970-10-10', 'Boston',8,45000); INSERT INTO EMPLOYEES VALUES ('Jones','Indiana','1992-02-01', 'Chicago',NULL,NULL); 在最后一项中,我们不知道Jones先生的工薪级别和年薪,所以我们输入NULL(不要引号)。NULL是SQL中的一种特殊情况,我们以后将进行详细的讨论。现在我们只需认为NULL表示一种未知的值。 有时,像我们刚才所讨论的情况,我们可能希望对某一些而不是全部的列进行赋值。除了对要省略的列输入NULL外,还可以采用另外一种INSERT语句,如下: INSERT INTO EMPLOYEES( FIRST_NAME, LAST_NAME, HIRE_DATE, BRANCH_OFFICE) VALUE( 'Indiana','Jones', '1992-02-01','Indianapolis'); 这样,我们先在表名之后列出一系列列名。未列出的列中将自动填入缺省值,如果没有设置缺省值则填入NULL。请注意我们改变了列的顺序,而值的顺序要对应新的列的顺序。如果该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空),SQL操作将失败。 让我们来看一看上述INSERT语句的语法图: INSERT INTO table [(column { ,column})] VALUES (columnvalue [{,columnvalue}]); 和前一篇文章中一样,我们用方括号来表示可选项,大括号表示可以重复任意次数的项(不能在实际的SQL语句中使用这些特殊字符)。VALUE子句和可选的列名列表中必须使用圆括号。 SELECT语句 SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以SELECT语句在SQL中是工作量最大的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。 SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中。在直接SQL(direct SQL)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他SQL语句来将结果放到一个已知名称的表中。 SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算“选择”(或称“限制”),但实际上它也可以完成其他两种关系运算—“投影”和“连接”,SELECT语句还可以完成聚合计算并对数据进行排序。 SELECT语句最简单的语法如下: SELECT columns FROM tables; 当我们以这种形式执行一条SELECT语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。 让我们看一下使用图1中EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子中使用这些结果)。 假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询: SELECT BRANCH_OFFICE FROM EMPLOYEES; 以上SELECT语句的执行将产生如图2中表2所示的结果。 由于我们在SELECT语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)。要消除结果中的重复行,只要在SELECT语句中加上DISTINCT子句: SELECT DISTINCT BRANCH_OFFICE FROM EMPLOYEES; 这次查询的结果如表3所示。 现在已经消除了重复的行,但结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果: SELECT DISTINCT BRANCH_OFFICE FROM EMPLOYEES ORDER BY BRANCH_OFFICE ASC; 这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序,即使它们并不显示出来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排列,那么可以用关键字DESC。 同样我们应该指出ORDER BY子句只将临时表中的结果进行排序;并不影响原来的表。 假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的语句: SELECT BRANCH_OFFICE,FIRST_NAME, LAST_NAME,SALARY,HIRE_DATE FROM EMPLOYEES ORDER BY SALARY DESC, HIRE_DATE DESC; 这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表5所示。 将一个很长的表中的所有列名写出来是一件相当麻烦的事,所以SQL允许在选择表中所有的列时使用*号: SELECT * FROM EMPLOYEES; 这次查询返回整个EMPLOYEES表,如表1所示。 下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。): SELECT [DISTINCT] (column [{, columns}])| * FROM table [ {, table}] [ORDER BY column [ASC] | DESC [ {, column [ASC] | DESC }]]; 定义选择标准 在我们目前所介绍的SELECT语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行: SELECT columns FROM tables [WHERE predicates]; WHERE子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(predicate)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在SQL语句中断言通常通过比较来表示。例如,假如你需要查询所有姓为Jones的职员,则可以使用以下SELECT语句: SELECT * FROM EMPLOYEES WHERE LAST_NAME = 'Jones'; LAST_NAME = 'Jones'部分就是断言。在执行该语句时,SQL将每一行的LAST_NAME列与“Jones”进行比较。如果某一职员的姓为“Jones”,即断言成立,该职员的信息将被包括到结果表中(见表6)。 使用最多的六种比较 我们上例中的断言包括一种基于“等值”的比较(LAST_NAME = 'Jones'),但是SQL断言还可以包含其他几种类型的比较。其中最常用的为: 等于 = 不等于 <> 小于 < 大于 > 小于或等于 <= 大于或等于 >= 下面给出了不是基于等值比较的一个例子: SELECT * FROM EMPLOYEES WHERE SALARY > 50000; 这一查询将返回年薪高于$50,000.00的职员(参见表7)。 逻辑连接符 有时我们需要定义一条不止一种断言的SELECT语句。举例来说,如果你仅仅想查看Davy Jones的信息的话,表6中的结果将是不正确的。为了进一步定义一个WHERE子句,用户可以使用逻辑连接符AND,OR和NOT。为了只得到职员Davy Jones的记录,用户可以输入如下语句: SELECT * FROM EMPLOYEES WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy'; 在本例中,我们通过逻辑连接符AND将两个断言连接起来。只有两个断言都满足时整个表达式才会满足。如果用户需要定义一个SELECT语句来使得当其中任何一项成立就满足条件时,可以使用OR连接符: SELECT * FROM EMPLOYEES WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith'; 有时定义一个断言的最好方法是通过相反的描述来说明。如果你想要查看除了Boston办事处的职员以外的其他所有职员的信息时,你可以进行如下的查询: SELECT * FROM EMPLOYEES WHERE NOT(BRANCH_OFFICE = 'Boston'); 关键字NOT后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某一职员所在部门的办事处在Boston,括号内的表达式返回true,但是NOT操作符将该值取反,所以该行将不被选中。 断言可以与其他的断言嵌套使用。为了保证它们以正确的顺序进行求值,可以用括号将它们括起来: SELECT * FROM EMPLOYEES WHERE (LAST_NAME = 'Jones' AND FIRST_NAME = 'Indiana') OR (LAST_NAME = 'Smith' AND FIRST_NAME = 'Bessie'); SQL沿用数学上标准的表达式求值的约定—圆括号内的表达式将最先进行求值,其他表达式将从左到右进行求值。 以上对逻辑连接符进行了说明,在对下面的内容进行说明之前,我们再一次对SELECT语句的语法进行更新: SELECT [DISTINCT] (column [{, column } ] )| * FROM table [ { , table} ] [ORDER BY column [ASC] | [DESC [{ , column [ASC] | [DESC } ] ] WHERE predicate [ { logical-connector predicate } ]; NULL和三值逻辑 在SQL中NULL是一个复杂的话题,关于NULL的详细描述更适合于在SQL的高级教程而不是现在的入门教程中进行介绍。但由于NULL需要进行特殊处理,并且你也很可能会遇到它,所以我们还是简略地进行一下说明。 首先,在断言中进行NULL判断时需要特殊的语法。例如,如果用户需要显示所有年薪未知的职员的全部信息,用户可以使用如下SELECT语句: SELECT * FROM EMPLOYEES WHERE SALARY IS NULL; 相反,如果用户需要所有已知年薪数据的职员的信息,你可以使用以下语句: SELECT * FROM EMPLOYEES WHERE SALARY IS NOT NULL; 请注意我们在列名之后使用了关键字IS NULL或IS NOT NULL,而不是标准的比较形式:COLUMN = NULL、COLUMN <> NULL或是逻辑操作符NOT(NULL)。 这种形式相当简单。但当你不明确地测试NULL(而它们确实存在)时,事情会变得很混乱。 例如,回过头来看我们图1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等级或年薪值都是未知的。这两个列都包含NULL。可以想象运行如下的查询: SELECT * FROM EMPLOYEES WHERE GRADE <= SALARY; 此时,Indiana Jones应该出现在结果表中。因为NULL都是相等的,所以可以想象它们是能够通过GRADE小于等于SALARY的检查的。这其实是一个毫无疑义的查询,但是并没有关系。SQL允许进行这样的比较,只要两个列都是数字类型的。然而,Indiana Jones并没有出现在查询的结果中,为什么? 正如我们早先提到过的,NULL表示未知的值(而不是象某些人所想象的那样表示一个为NULL的值)。对于SQL来说意味着这个值是未知的,而只要这个值为未知,就不能将其与其他值比较(即使其他值也是NULL)。所以SQL允许除了在true 和false之外还有第三种类型的真值,称之为“非确定”(unknown)值。 如果比较的两边都是NULL,整个断言就被认为是非确定的。将一个非确定断言取反或使用AND或OR与其他断言进行合并之后,其结果仍是非确定的。由于结果表中只包括断言值为“真”的行,所以NULL不可能满足该检查。从而需要使用特殊的操作符IS NULL和IS NOT NULL。 UPDATE语句 UPDATE语句允许用户在已知的表中对现有的行进行修改。 例如,我们刚刚发现Indiana Jones的等级为16,工资为$40,000.00,我们可以通过下面的SQL语句对数据库进行更新(并清除那些烦人的NULL)。 UPDATE EMPLOYEES SET GRADE = 16, SALARY = 40000 WHERE FIRST_NAME = 'Indiana' AND LAST_NAME = 'Jones'; 上面的例子说明了一个单行更新,但是UPDATE语句可以对多行进行操作。满足WHERE条件的所有行都将被更新。如果,你想让Boston办事处中的所有职员搬到New York,你可以使用如下语句: UPDATE EMPLOYEES SET BRANCH_OFFICE = 'New York' WHERE BRANCH_OFFICE = 'Boston'; 如果忽略WHERE子句,表中所有行中的部门值都将被更新为'New York'。 UPDATE语句的语法流图如下面所示: UPDATE table SET column = value [{, column = value}] [ WHERE predicate [ { logical-connector predicate}]]; DELETE语句 DELETE语句用来删除已知表中的行。如同UPDATE语句中一样,所有满足WHERE子句中条件的行都将被删除。由于SQL中没有UNDO语句或是“你确认删除吗?”之类的警告,在执行这条语句时千万要小心。如果决定取消Los Angeles办事处并解雇办事处的所有职员,这一卑鄙的工作可以由以下这条语句来实现: DELETE FROM EMPLOYEES WHERE BRANCH_OFFICE = 'Los Angeles'; 如同UPDATE语句中一样,省略WHERE子句将使得操作施加到表中所有的行。 DELETE语句的语法流图如下面所示: DELETE FROM table [WHERE predicate [ { logical-connector predicate} ] ]; 现在我们完成了数据操作语言(DML)的主要语句的介绍。我们并没有对SQL能完成的所有功能进行说明。SQL还提供了许多的功能,如求平均值、求和以及其他对表中数据的计算,此外SQL还能完成从多个表中进行查询(多表查询,或称之为连接)的工作。这种语言还允许你使用GRANT和REVOKE命令控制使用者的数据访问权限. 附.end 记录集对象的方法: rs.movenext 将记录指针从当前的位置向下移一行 rs.moveprevious 将记录指针从当前的位置向上移一行 rs.movefirst 将记录指针移到数据表第一行 rs.movelast 将记录指针移到数据表最后一行 rs.absoluteposition=N 将记录指针移到数据表第N行 rs.absolutepage=N 将记录指针移到第N页的第一行 rs.pagesize=N 设置每页为N条记录 rs.pagecount 根据 pagesize 的设置返回总页数 rs.recordcount 返回记录总数 rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否 rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否 rs.delete 删除当前记录,但记录指针不会向下移动 rs.addnew 添加记录到数据表末端 rs.update 更新数据表记录 Recordset对象方法 Open方法 recordset.Open Source,ActiveConnection,CursorType,LockType,OptionsSource Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个StoredProcedure。假如省略这个参数,系统则采用Recordset对象的Source属性。 ActiveConnection Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。 另: CursorType Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下: -------------------------------------------------------------- 常数 常数值 说明 -------------------------------------------------------------- adOpenForwardOnly 0 缺省值,启动一个只能向前移动的游标(Forward Only)。 adOpenKeyset 1 启动一个Keyset类型的游标。 adOpenDynamic 2 启动一个Dynamic类型的游标。 adOpenStatic 3 启动一个Static类型的游标。
以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。 Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic -------------------------------------------------------------- AbsolutePage 不支持 不支持 可读写 可读写 AbsolutePosition 不支持 不支持 可读写 可读写 ActiveConnection 可读写 可读写 可读写 可读写 BOF 只读 只读 只读 只读 Bookmark 不支持 不支持 可读写 可读写 CacheSize 可读写 可读写 可读写 可读写 CursorLocation 可读写 可读写 可读写 可读写 CursorType 可读写 可读写 可读写 可读写 EditMode 只读 只读 只读 只读 EOF 只读 只读 只读 只读 Filter 可读写 可读写 可读写 可读写 LockType 可读写 可读写 可读写 可读写 MarshalOptions 可读写 可读写 可读写 可读写 MaxRecords 可读写 可读写 可读写 可读写 PageCount 不支持 不支持 只读 只读 PageSize 可读写 可读写 可读写 可读写 RecordCount 不支持 不支持 只读 只读 Source 可读写 可读写 可读写 可读写 State 只读 只读 只读 只读 Status 只读 只读 只读 只读 AddNew 支持 支持 支持 支持 CancelBatch 支持 支持 支持 支持 CancelUpdate 支持 支持 支持 支持 Clone 不支持 不支持 Close 支持 支持 支持 支持 Delete 支持 支持 支持 支持 GetRows 支持 支持 支持 支持 Move 不支持 支持 支持 支持 MoveFirst 支持 支持 支持 支持 MoveLast 不支持 支持 支持 支持 MoveNext 支持 支持 支持 支持 MovePrevious 不支持 支持 支持 支持 NextRecordset 支持 支持 支持 支持 Open 支持 支持 支持 支持 Requery 支持 支持 支持 支持 Resync 不支持 不支持 支持 支持 Supports 支持 支持 支持 支持 Update 支持 支持 支持 支持 UpdateBatch 支持 支持 支持 支持
Recordset对象Open方法的LockType参数表示要采用的Lock类型,如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下: ------------------------------------------------------------- 常数 常数值 说明 -------------------------------------------------------------- adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法 adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。 adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。 adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、删、改的操作。 结论是查询时使用2,1;其它时候用2,2就可以了. 注意:本文内容大部分来自互联网. ctiam进行了简单的处理.ctiam将不断更新补充内容.这只是个框架.转载请写明本文来自互联网.供学习研究使用,不得用于商业用途.
题目:asp数据库操作大全. | ||
dw8新功能体验 [网站网页]
今天又看起css.郁闷之余想起了dw8有个css可视的特性.于是下了装. 关于dw8可以参考以下文档: 代码栏试用: http://www.blueidea.com/tech/web/2005/2815_2.asp 图文快报: http://www.blueidea.com/news/soft/2005/2630.asp 新功能总结: http://www.blueidea.com/news/soft/2005/2612.asp 官方产品页: http://www.macromedia.com/software/dreamweaver 官方的新功演示: http://www.macromedia.com/software/dreamweaver/productinfo/features/ 好好看了一下官方新功能展示. 根据官方的新功能演示所说,dw8的最重要三大新功能: Best practices: Guides and zoom tool Code callapse Coding toolbar Efficiency: Css layout visualization Unified css panel Xml accessibility Integration: Video integration 辅助线和放大镜的功能我觉得很一般. 手写代码现在很爽:代码可以折叠,还有一个toolbar.toolbar功能很实用.这个toolbar用来实现代码折叠功能外还可以注释掉和不注释一大堆代码(期望很久);代码自动封闭功能也有了一个改进,改进虽小却也实用非常.. Css布局可视化似乎是想实现表格布局一样的效果.你可以看见一个div的padding margin,你可以通过颜色来区分不同的div(标签显示起来怪怪的),但你把鼠标置于div上时你可以了解这个层的布局信息.相当酷的功能.我玩得爱不释手.哈哈,层啊万恶的层布局啊 现在可以观看不同媒体下css的效果.这个功能看起来也不错.在pda开发方面应该非常有用:(郁闷啊pda中文的美丽显示效果我还没解决呢) 在插入flash videa时候老是提示文件名非法.难道不能使用swf,要用fla文件不成.看了一下还不明白,只是知道要使用flash video还挺麻烦的. 不过不得不承认那个功能条实在太太太太太漂亮了. | ||
jmail快速上手2 [网站网页]
原来成功过 | ||
jmail快速上手 [网站网页]
part1
在 最近的jmail版本是4.4. jmail4.3以上版本因为使用了所谓的新架构而致使发送邮件的使用message对象 smtpmail对象仍然可以使用.但message对象可以支持smtp服务器的验证. part2:
jmail到底有什么用? (如果你这都不知道那么就不用看下文了,浪费时间) 所以我们都需要学会用jmail发邮件. 我在网上找到的发送邮件代码,结合自己的使用修改一下: Set jmail = Server.CreateObject("JMAIL.Message") '建立发送邮件的对象 jmail.silent = true '屏蔽错误,我本人很不喜欢因为这样的话发不出邮件都不知道. '我不知道为什么很多人都喜欢这个. jmail.Charset = "GB2312" '邮件的文字编码为国标 jmail.ContentType = "text/html" '邮件的格式为HTML格式 jmail.Priority = 3 '优先顺序,1 为最快,5 为最慢, 3 为默认值 '//下面几行要根据需要修改 '********想一下平时你发信是怎么填写的 jmail.AddRecipient "Email@mail.com" '邮件收件人的地址,注意:没有等号!.可重复添加多个:"地址1","地址2",….. jmail.Subject = "Mail Subject" '邮件的标题 jmail.Body = "Mail Body" '邮件内容
'**********发件人身份和验证 jmail.From = "Email From for Sender" '发件人的E-MAIL地址 jmail.MailServerUserName = "UserName of Email" '登录邮件服务器所需的用户名 jmail.MailServerPassword = "Password of Email" '登录邮件服务器所需的密码 '邮件的内容 jmail.Send("服务器地址") '执行邮件发送(通过邮件服务器地址) '************* 'smtp验证的另一个形式:直接使用jmail.send(用户名:密码@服务器地址) '******************************** jmail.Close() '关闭对象
jmail应该是相当好玩的东西.可惜我无论每次运行代码的结果都是 jmail.Message 错误 '8000ffff' The message was undeliverable. All servers failed to receive the message 经过查证,我确信不是代码的问题.不过我也不知道这是什么问题 -_-!!相当郁闷. 以后再玩附件抄送邮件合并之类的东西吧. part3:
在DVBBS7.0Sp2中利用JMail发送邮件的解决方法 用Jmail发送邮件,经过一整天的摸索,终于成功了,能够自由的向内网和外网发送邮件。 原来的症状是用自己写的ASP程序发送Jmail邮件可以成功,但是利用动网的JMail就是只能发到局域网,无法发送到外网。 解决的办法是修改inc/Email.asp中的Jmail部分,我自己加了一点注释。
Sub Jmail(Email,Topic,Mailbody) On Error Resume Next Dim JMail Set JMail = Server.CreateObject("JMail.Message") JMail.silent=true JMail.Logging = True JMail.Charset = "gb2312" If Not(Dvbbs.Forum_info(12) = "" Or Dvbbs.Forum_info(13) = "") Then JMail.MailServerUserName = Dvbbs.Forum_info(12) '您的邮件服务器登录名 JMail.MailServerPassword = Dvbbs.Forum_info(13) '登录密码 End If JMail.ContentType = "text/html" JMail.Priority = 1 JMail.From = Dvbbs.Forum_info(5) JMail.FromName = Dvbbs.Forum_info(0) JMail.AddRecipient Email JMail.Subject = Topic JMail.Body = Mailbody JMail.Send (Dvbbs.Forum_info(4)) Set JMail = Nothing SendMail = "OK" If Err Then SendMail = "False" End Sub 改正的方法很简单,只要修改红色部分的地方就可以了。 Sub Jmail(Email,Topic,Mailbody) On Error Resume Next Dim JMail Set JMail = Server.CreateObject("JMail.Message") JMail.silent=true JMail.Logging = True JMail.Charset = "gb2312" If Not(Dvbbs.Forum_info(12) = "" Or Dvbbs.Forum_info(13) = "") Then '不为空的时候 JMail.MailServerUserName = Dvbbs.Forum_info(12) '您的邮件服务器登录名 (邮局中任何一个Email用户) JMail.MailServerPassword = Dvbbs.Forum_info(13) '登录密码 End If JMail.ContentType = "text/html" '为网页格式邮件 JMail.Priority = 1 '优先级为高 JMail.From = AAA@BBB.COM '发件人Email,必须是你登录邮件服务器的邮箱 JMail.FromName = Dvbbs.Forum_info(0) '发件人姓名 JMail.AddRecipient Email '收件人邮箱 JMail.Subject = Topic '邮件主题 JMail.Body = Mailbody '邮件正文 JMail.Send (Dvbbs.Forum_info(4)) '发送者smtp服务器地址(企业邮局地址,例如SMTP.BBB.COM,域名IP必须是邮件服务器IP) Set JMail = Nothing SendMail = "OK" End Sub 源文档 <http://vip.zccn.net/help/help_dvbbs_jmail_error.asp> 累死人了~~~~~~~~~~~~~~~ 现在早上快六点.困 | ||
css笔记 [网站网页]
我试图写的是小说,但不知怎么我写了一份指南。 但是本文中有些概念属本人发明而且有些说法不太严谨。 文档是用word写的,臃肿代码很多,且太长了,无法用blogbus发布。 如需要请下载此文档。(.doc格式) 很遗憾。 | ||
VBScript常用函数 [网站网页]
函数,何为函数。呵呵,我到现在也没有清晰的概念。然而函数的英文是function,从意会的角度上讲,函数即function不用神伤。 有趣的是,写函数时,vb的函数返回值不用return而是函数名=xx。为什么有趣呢,因为我只学过c语言,所以,有趣。。有趣。 以下是函数编程中常见的函数: 1,数学函数 <1>int和fix取整函数 整数,WHOLE NUMBER,Any of the set of numbers including zero and all negative and positive multiples of 1. 掉书袋。 int,fix都是删除小数,返回剩下的整数。但对于负数,int返回小于原数的第一个负数,而fix则返回大于的第一个负数。举例,对于-9.9,int返回-10,而fix返回-9。 也许可理解为,fix是修剪int是取整。 <2>round四舍五入 四舍五可能不入。当舍入位为5时,函数将其转换为最近的偶数。比如: round(2.345,2)=2.34 round(3.455.2)=3.46 <3>sqr平方根 不用废话 <4>eval,计算并返回指定表达式的值 eval是javascript的函数,但被vb支持。甚至参数可以包含命令,这些命令也可以被执行。例如: eval(alert("hi,world")) <5>rnd,生产随机数 返回一个小于1大于0地随机数。参数决定rnd生成随机数的方式。参数小于零,每次产生相同的随机数。参数等于零,产生于上次相同的随机数。参数大于0或缺省,参数与上次不同随机数。 要产生指定范围随机数,可使用公式: int((upperbound-lowbound+1)*rnd+lowbound) 为使得每次产生的随机数不重复,rnd前应用randomize初始化生成器。 2,字符串处理函数 无非是产生删除截取统计查找替换。 <1>产生,删除 space产生空格 string(重复数,字符),产生重复字符。 ltrim,rtrim,trim删除左边右边两边的空格 <2>截取left,right,mid 其实也有删除的功能。 left(字符串,截取个数) right(字符串,截取个数) mid(字符串,截取开始位置,截取个数) <3>统计len 返回个数 <4>查找instr instr(起始位置,字符串1,字符串2,比较方式) 比较方式即是是否打开大小写匹配。 1表示不区分大小写。0或缺省表示区分。其实质不过是文本方式,二进制方式的比较。 <5>替换replace replace(字符串,匹配字符串,替换字符串[,比较方式,起始位置,替换位置]) replace(txt, " " , " ") 用 替换中文空格。 3,转换函数 <1>asc,返回ASCII值;chr,返回字符 <2>val,将数字字符转化为数字;str,将数字转化为字符 <3>货币格式转化FormatCurrency,数值转换FormatNumber,数值转化百分比数FormatPercnet FormatCurrency(货币,[小数数位,前导符]) 小数数位,前导符为-1均表示使用本地计算机内的设置。 <4>九个强制类型转化函数 cbool,cbyte,cdate,cint,clng,csng,cdbl,ccur,cstr 通常,可以使用子类型数据转换函数书写代码,以显示某些操作的结果应当被表达为特定的数据类型,而非默认的数据类型。 其实就是将结果转换为特定数据类型。 <5>hex和oct,返回16,8进制字符。似乎在关于颜色代码中常见hex。至于oct,好像我还没看过。 4,测试函数IsEmpty,IsNull,IsNumeric 注意,逻辑型字符在中文环境中以真或假输出。 5,日期时间函数 <1>,时间日期 now,返回当前系统时间日期。 date,返回当前系统日期。 time,返回当前系统时间。 日期分量:year(),month(),day() 时间分量:hour(),minute(),second() <2> MonthName(指定月份数值,[是否简写]),返回月份名称,中文环境以中文表示(其实都是取决于控制面板的设置) WeekDay,WeekDayName:wekday返回星期数,(0-7);weekDayName以星期数返回星期名 <3>dateAdd和DateDiff函数 dateadd(间隔设置值,时间间隔数,原始日期) datediff(间隔设置值,时间1,时间2) 比如:datediff("d",#2005-5-2#,date) 其中间隔设置值如下
..end 这篇东东昨天开始写大部分。很郁闷的是昨天忘了保存,以致现在要全部重新。郁闷,相当郁闷。 今天天气变得好恐怖。睡到清晨的时候突然狂风大作,大量大量的空气涌进宿舍,声音巨大,然后夹杂雨水,居然打在脸上。冰冰凉凉相当舒服。要不是声音太恐怖,这个清晨应该很完美。心跳加速。怀疑遇到龙卷风。翻身伸手拉上半截玻璃门。 继续睡。 第一次有这个可怕状况。但也许是睡意过分渲染。 这里一切很好。还有一个月多就要和宿舍和学校说再见。 时光里光线如水。 | ||||||||||||||||||||||||
request对象之form集合_asp [网站网页]
用于获得post方法取得的数据 用法为:retdata=request.form("表单界面对象名")[index|count] 其中
for each循环: 另有for...next循环: | ||
『转贴』SQL 和 Recordset 的小知识 [网站网页]
性质:转贴 来源:不祥 题目:SQL 和 Recordset 的小知识 1. ASP与Access数据库连接: dim conn,mdbfile mdbfile=server.mappath("数据库名称.mdb") set conn=server.createobject("adodb.connection") conn.open "driver={microsoft access driver(*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile 2. ASP与SQL数据库连接: dim conn set conn=server.createobject("ADODB.connection") con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称 建立记录集对象: |