关于作者

用户名:ilove611
笔名:ilove611
地区: 山东-潍坊
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:23
评论个数:7
留言条数:4




Powered by BlogDriver 2.1

ilove611的博客

 

欢迎访问ilove611的博客

文章

“以前进行的程序安装创建了挂起的文件操作。运行程序之前,必须重新起动计算机。”的解决办法

安装SQL 2000数据库和补丁时,如果出现“以前进行的程序安装创建了挂起的文件操作。运行程序之前,必须重新起动计算机。”的提示,这时往往重启无用,解决办法如下:

点击“开始菜单”->“运行”,输入:regedit, 点击确定按钮进入注册表,然后到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中,删除PendingFileRenameOperations,然后重新安装即可。

- 作者: ilove611 2006年07月11日, 星期二 22:16  回复(0) |  引用(1) 加入博采

SQL模糊查询
   SQL模糊查询的语法为
    “SELECT column FROM table WHERE column LIKE 'pattern'”。
    
    SQL提供了四种匹配模式:
    1. % 表示任意0个或多个字符。如下语句:
        SELECT * FROM user WHERE name LIKE '%三%'
    将会把name为“张三”,“三脚猫”,“唐三藏”等等有“三”的全找出来;
    
    2. _ 表示任意单个字符。语句:
        SELECT * FROM user WHERE name LIKE '_三_'
    只找出“唐三藏”这样name为三个字且中间一个字是“三”的;
        SELECT * FROM user WHERE name LIKE '三__'
    只找出“三脚猫”这样name为三个字且第一个字是“三”的;
    
    3. [ ] 表示括号内所列字符中的一个(似与正则表达式)。语句:
        SELECT * FROM user WHERE name LIKE '[张李王]三'
    将找出“张三”、“李三”、“王三”(而不是“张李王三”);
        
    如 [ ] 内有一系列字符(01234、abcde之的)则可略写为“0-4”、“a-e”
        SELECT * FROM user WHERE name LIKE '老[1-9]'
    将找出“老1”、“老2”、……、“老9”;
    如要找“-”字符请将其放在首位:'张三[-1-9]'
    
    4. [^ ] 表示不在括号所列之内的单个字符。语句:
        SELECT * FROM user WHERE name LIKE '[^张李王]三'
    将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
        SELECT * FROM user WHERE name LIKE '老[^1-4]'
    将排除“老1”到“老4”寻找“老5”、“老6”、……、“老9”。
    
    !最后是重点!
    由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”、“'”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:
    
    function sqlencode(str)
     str=replace(str,"'","''")
     str=replace(str,"[","[[]") '此句一定要在最先
     str=replace(str,"_","[_]")
     str=replace(str,"%","[%]")
     sqlencode=str
    end function
    
    在查询前将待查字符串先经该函数处理即可

- 作者: ilove611 2006年04月29日, 星期六 16:36  回复(0) |  引用(1) 加入博采

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子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(pedicate)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在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命令控制使用者的数据访问权限。

- 作者: ilove611 2006年04月28日, 星期五 16:11  回复(0) |  引用(1) 加入博采

ADO三大对象的属性、方法、事件及常数

Connection对象

属性

属性名称 数据类型和用途
Attributes 可读写Long类型,通过两个常数之和指定是否使用保留事务(retainning transactions)。常数adXactCommitRetaining表示调用CommitTrans方法时启动一个新事务;常数adXactAbortRetaning表示调用RollbackTrans方法时启动一个新事务。默认值为0,表示不使用保留事务。
CommandTimeout 可读写Long类型,指定中止某个相关Command对象的Execute调用之前必须等待的时间。默认值为30秒。
ConnectionString 可读写String类型,提供数据提供者或服务提供者打开到数据源的连接所需要的特定信息
ConnectionTimeout 可读写Long类型,指定中止一个失败的Connection.Open方法调用之前必须等待的时间,默认值为15秒。
CursorLocation 可读写Long类型,确定是使用客户端(adUseClient)游标引擎,还是使用服务器端(adUseServer)游标引擎。默认值是adUseServer。
DefaultDatabase 可读写String类型,如果ConnectString中未指定数据库名称,就使用这里所指定的名称,对SQL Server而言,其值通常是pubs
IsolationLevel 可读写Long类型,指定和其他并发事务交互时的行为或事务。见IsolationLevel常数
Mode Long类型,指定对Connection的读写权限。见Mode常数
Provider 可读写String类型,如果ConnectionString中未指定OLE DB数据或服务提供者的名称,就使用这时指定的名称。默认值是MSDASQL(Microsoft OLE DB Provider for ODBC)。
State 可读写Long类型,指定连接是处于打开状态,还是处于关闭状态或中间状态。见State常数
Version 只读String类型,返回ADO版本号。

注意:上面所列出的大多数可读写的属性,只有当连接处于关闭状态时才是可写的。

只有当用户为Connection对象用BeginTrans...CommitTrans...RollbackTrans方法定义了不遗余力,事务隔离程度的指定才真正有效。如果有多个数据库用户同时执行事务,那么应用程序中必须指定如何响应运行中的其他事务。

方法

方法 用途
BeginTrans 初始化一个事务;其后必须有CommitTrans和/或RollbackTrans相呼应
Close 关闭连接
CommitTrans 提交一个事务,以完成对数据源的永久改变(要求使用之前必须调用了BeginTrans方法)
Execute 人SELECT SQL语句返回一个forward-only Recordset对象,也用来执行那些不返回Recordset语句,如INSERT、UPDATE、DELETE查询或DDL语句
Open 用连接字符串来打开一个连接
OpenSchema 返回一个Recordset对象以提供数据源的结构信息(metadata)
RollbackTrans 取消一个事务,恢复对数据源做的临时性改变(要求使用之前必须调用了BeginTrans方法)

注:只有Execute、Open和OpenSchema三个方法才能接受变元参数。Execute的语法为:
cnnName.Execute strCommand,[lngRowsAffected[,lngOptions]]
strCommand的值可以是SQL语句、表名、存储过程名,也可以是数据提供者所能接受的任意字符串。为了提高性能,最好为lngOptions参数指定合适的值(详见lngOptions参数用到的常数),以使提供者解释语句时不用再去判定其类型。可选参数lngRowsAffected将返回INSERT、UPDATE或DELETE查询执行以后所影响的数目。这些查询会返回一个关闭的Recordset对象。一个SELECT查询将返回lngRowsAffected值为0并且返回带有一行或多行内容的打开的forward-only Recordset。

事件

事件名称 触发时机
BeginTransComplete BeginTrans方法执行以后。
Private Sub cnnName_BeginTransComplet(ByVal TransactionLevel As Long,ByVal pError As ADODB.Error,adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)
CommitTransComplete CommitTrans方法执行以后
Private Sub Connection1_CommitTransComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection) 
ConnectComplete 成功建立到数据源的Connection之后
Private Sub Connection1_ConnectComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection) 
Disconnect Connection关闭之后
Private Sub Connection1_Disconnect(adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection) 
ExecuteComplete 完成Connection.Execute或Command.Execute之时
Private Sub Connection1_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection) 
InfoMessage 一个Error对象被添加到ADODB.Connectio.Error集合之时
Private Sub Connection1_InfoMessage(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection) 
RollbackTransComplete RollbackTrans方法执行之后
Private Sub Connection1_RollbackTransComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection) 
WillConnect 即将调用Connection.Open方法之时
Private Sub Connection1_WillConnect(ConnectionString As String, UserID As String, Password As String, Options As Long, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection) 
WillExecute 即将调用Connection.Execute或Command.Execute方法之时
Private Sub Connection1_WillExecute(Source As String, CursorType As ADODB.CursorTypeEnum, LockType As ADODB.LockTypeEnum, Options As Long, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection) 

注:其中的adStatus参数所用到的常数的名称和含义详见adStatus所用的常数

常数

IsolationLevel常数

常数 含义
adXactCursorStability 只允许读其他事务已提交的改变(默认值)
adXactBrowse 允许读其他事务未提交的改变
adXactChaos 本事务不会覆盖其他位于更高隔离程度的事务所做的改变
adXactIsolated 所有事务相互独立
adXactReadCommitted 等同于adXactCursorStability
adXactReadUncommitted 等同于adXactBrowse
adXactRepeatableRead 禁止读其他事务的改变
adXactSerializable 等同于adXactIsolated
adXactUnspecified 不能确定提供者的事务隔离程度

Mode常数

常数 含义
adModeUnknown 未指定数据源的连接许可权(默认值)
adModeRead 连接是只读的
adModeReadWrite 连接是可读写的
adModeShareDenyNone 不拒绝其他用户的读写访问(Jet OLE DB Provider的默认值)
adModeShareDenyRead 拒绝其他用户打开到数据源的读连接
adModeShareDenyWrite 拒绝其他用户打开到数据源的写连接
adModeShareExclusive 以独占方式打开数据源
adModeWrite 连接是只写的

State常数

常数 含义
adStateClosed Connection(或其他对象)是关闭的(默认值)
adStateConnecting 正在连接数据源的状态
adStateExecuting Connection或Command对象的Execute方法已被调用
adStateFetching 返回行(row)到Recordset对象
adStateOpen Connection(或其他对象)是打开的(活动的)

Execute方法中lngOption参数用到的常数

Command类型常数 含义
adCmdUnknown Command类型未定(默认值),由数据提供者去判别Command语法
adCmdFile Command是和对象类型相应的文件名称
adCmdStoredProc Command是存储过程名称
adCmdTable Command是能产生内部SELECT * FROM TableName查询的表名称
adCmdTableDirect Command是能直接从表中获取行内容的表名称
adCmdText Command是一条SQL语句

ADODB事件处理子过程参数adStatus所用的常数

常数 含义
adStatusCancel 操作被用户取消
adStatusCnatDeny 操作不能拒绝其他用户对数据源的访问
adStatusErrorsOccurred 操作导致错误并已送到Errors集合中
adStatusOK 操作成功
adStatusUnWantedEvent 操作过程中一个未预料到的事件被激活

Command对象

Command对象的主要目的是执行参数化的存储过程。其形式要么是临时准备(prepared),要么是持久的预编译(precompiled)过的SQL语句。如果想(存储)一个或多个查询以供在同一Connection上多次执行,Command对象也是很有用的。当想创建Recordset时,一种高效的方法是绕过Command对象而采用Recordset.Open方法。

属性

属性名称 数据类型和用途
ActiveConnection 指针类型,指向Command所关联的Connection对象。对于现存的已打开连接,可使用Set cmmName.ActiveConnection=cnnName。另外,也可以不用相关Connection对象名称而使用有效的连接字符串去创建一个新的连接。默认值为Null。 
CommandText 可读写String类型。为ActiveConnection指定一条SQL语句、表名、存储过程名或提供者能接受的任意字符串。CommandType属性的值决定了CommandText属性值的格式。默认值为空字符串:""
CommandTimeout 可读写Long类型,指定中止一个Command.Execute调用前必须等待的时间。这时的值优先于Connection.ComandTimeout中的设定值。默认值为30秒。
CommandType 可读写Long类型,指定数据提供者该如何解释CommandText属性值。CommandType等效于Connection.Execute方法中的可选参数lngOption。详见CommandType所用到的常数。默认值为adCmdUnkown.
Name 可读写String类型,指定Command的名称。
Prepared 可读写Boolean类型,判断数据源是否把CommandText中的SQL语句编译为prepared statement(一种临时性存储过程)。prepared statement仅存活于Command的ActiveConnection生命周期中。许多客户/服务器RDBMS,包括SQL SERVER,都支持prepared statement。如果数据源不支持prepared statement,则把该属性设为True,将导致一个自陷错误。
State 可读写Long类型,指定Commnad状态。见State常数。

注意:最好每次都为CommandType指定的一个合适的常数值,否则会降低系统运行的效率。

方法

方法 用途
Createparameter 在执行该方法之前,必须首先声明一个ADODB.Parameter对象。调用语法为:
cmmName.CreateParameter [strName[,lngType[,lngDirection[,lngSize[,varValue]]]]]
Execute 调用语法同Connection.Execute大致相同。

常数

State常数

常数 含义
adStateClosed Connection(或其他对象)是关闭的(默认值)
adStateConnecting 正在连接数据源的状态
adStateExecuting Connection或Command对象的Execute方法已被调用
adStateFetching 返回行(row)到Recordset对象
adStateOpen Connection(或其他对象)是打开的(活动的)

CommandType所用到的常数

Command类型常数 含义
adCmdUnknown Command类型未定(默认值),由数据提供者去判别Command语法
adCmdFile Command是和对象类型相应的文件名称
adCmdStoredProc Command是存储过程名称
adCmdTable Command是能产生内部SELECT * FROM TableName查询的表名称
adCmdTableDirect Command是能直接从表中获取行内容的表名称
adCmdText Command是一条SQL语句

Recordset对象

属性

属性名称 数据类型和用途
AbsolutePage 可读写Long类型,要么是设置或返回当前记录所处的页面序号,要么是一个PositionEnum常数,见AbsolutePage用到的常数。在获取或设置AbsolutePage的值之前,必须先设定PageSize的值。AbsolutePage是从1开始计数的。如果当前记录位于第一页时,AbsolutePage的返回值为1,对AbsolutePage设置将使当前记录指针指向指定页的第一条记录。
AbsolutePosition* 可读写的Long类型(从1开始计数),设置或返回当前记录年处的位置。AbsolutePosition的最大取值是RecordCount属性的值。
ActiveCommand 可读写的String类型,Recordset所关联的先前打开的Command对象名称
ActiveConnection 指针类型,指向Recordset所关联的先前打开的Connection对象,或指向一条完整有效的ConnectionString串值。

BOF* 只读Boolean类型,若为True,表明记录指针已位于Recordset第一条记录之前,并且没有了当前记录
Bookmark* 可读写Variant类型,返回对特定记录的引用或使用一个Bookmark值使记录指针指向特定记录
CacheSize* 可读写Long类型,指定本地Cache中所存的记录条数,最小(默认值)为1。若增加了CacheSize的值,则在流动Recordset以获取更多记录时,能减少与服务器的通信次数。
CursorLocation 可读写Long类型,指定可流动游标的位置,即CursorType是位于客户端还是位于服务器端,见CursorLocation用到的常数。默认值是使用OLE DB数据源提供的游标。 
CusrsorType* 可读写Long类型,指定Recordset游标的类型,见CursorType用到的常数,默认值是forward-only游标
DataMember 指针类型,指向关联的DataEnvironment.Command对象
DataSource 指针类型,指向关联的DataEnvironment.Connection对象
EditMode* 只读Long类型,返回Recordset的编辑状态,见EditMode用到的常数
EOF* 只读Boolean类型,若为True,表明记录指针已超出Recordset的最后一条记录,并且没有了当前记录。
Filter* 可读写Variant类型,要么是一条件表达式(一条有效的SQL WHERE子句但又不出现保留字WHERE),要么是指向特定记录的Bookmark数组,要么是一个Filter常数,详见Filter用到的常数。 
LockType* 可读写Long类型,指定打开Recordset所使用的记录锁定方法。默认值是只读,对应于forward-only游标的只读特性。见LockType属性用到的常数。
MarshalOptions 可读写Long类型,指定客户端改动后,应返回哪个记录集合,此属性仅适合于不常见的ADOR.Recordset对象,此对象是RDS.ADOR.Recordset对象成员之一。
MaxRecords* 可读写Long类型,指定SELECT查询或存储过程返回的最大记录条数,默认值为0,即全部返回
PageCount 只读Long类型,返回Recordset所有的页数,必须设定了PageSize的值,PageCount的返回值才是真正有意义的。如果Recordset不支持PageCount属性,则返回值为-1
PageSize 可读写Long类型,设置或返回一个逻辑页所包含的记录条数。使用逻辑页可把大的Recordset分解为多个易处理的小部分。通常的做法是把PageSize设为DataGrid、MsFlexGrid或层次型的FlexGrid控件所能显示的记录条数。PageSize和锁定Jet(2k)或锁定SQL Server(6.5版及更早版本,2k;7.0版,8k)数据库时用到的表页面大小无关 
PersistFormat 可读写Long类型,设置或返回由调用Save方法所创建的Recordset文件的格式。当前仅有一个值adPersistADTG(默认格式:Advanced Data TableGram)
RecordCount* 只读Long类型,如果Recordset支持近似定位或支持书签,则返回带可流动游标的Recordset所含有的记录数;如果不支持,必须使用MoveLast方法以取得确实覆盖了所有记录的准确的RecordCount数值。如果forward-only类型Recordset有一条或多条记录,Recordset返回-1(True),任何类型的空的Recordset都将返回0(False)
Sort* 可读写String类型,包含一条不含保留字ORDER BY的SQL ORDERY BY子句,用以指定Recordset的排序方式
Source* 可读写String类型,可以是SQL语句、表名、存储过程名或相关Command对象名。如果提供了Command对象名,则Source将返回Command.CommandText的值。利用Open方法的参数lngOptions可以指定提供给Source值的类型 
State 可读写Long类型,为对象状态常数之一。见State常数
Status 只读Long类型,表明对Recordset进行批处理或其他多记录(bulk)操作后的状态。见Status属性用到的常数

注意:上表所列属性是ADODB.Recordset对象的标准属性,即那些被关系数据库的大多数通用OLE DB数据提供者所支持的属性。带星号的属性表示它与DAO.Recordset或rdoResultset对象的相应属性完全一样或很接近。

方法

方法 用途
AddNew* 向可更新的Recordset添加一条新记录。调用语法为rstName.AddNew[{varField|avarFields},{varValue|avarValuese}],其中varField是单个字段名,avarFields是字段名数组。varValue是单个字段值,avarValue是由avarFields指定字段的值所组成的数组。调用Update方法则把新记录加到数据库的表中。如果向主关键字不是第一个字段的Recordset中添加记录,则必须在AddNew方法中指定主关键字的名称和值
Cancel 取消异步查询的执行,中止存储过程或复合SQL语句创建多个Recordset,调用语法为rstName.Cancel
CancelBatch* 取消LockEdit值为BatchOptimistic的Recordset的即将生效的批量更新操作,调用语法为:rstName.CancelBatch [lngAffectRecords],可选参数lngAffectRecords的取值见lngAffectRecords用到的常数
Clone 复制一个带有独立记录指针的Recordset对象,调用语法为:Set rstDupe=rstName.Clone()
Close 关闭Recordset对象,以后可以重新设Recordset的属性并使用Open方法来再度访问Recordset 。调用语法为:rstName.Close
Delete* 如果Recordset的LockEdit属性值未设为adLockBatchOptimistic,立刻从Recordset和相应表中删除当前记录 
Find 寻找满足指定条件的记录。调用语法为:rstName.Find strCriteria [,lngSkipRecords, lngSearchDirection [,lngStart]],其中strCriteria是不含WHERE关键字的SQL WHERE子句,可选参数lngSkipRecords是应用Find前所跳过的记录数目,lngDirection指定查找方向(adSearchForward,和adSearchBackward,其中adSearchForward是默认值),可选参数lngStart指定了从哪儿开始查找,其值要么是一个Bookmark值,要么是Bookmark常数,见varStart参数用到的Bookmark常数。 
GetRows 返回一个二维Variant数组(行、列),调用语法为avarname=rstName.GetRows(lngRows [,varStart[,{strFieldName|lngFieldIndex|avarFieldNames|avarFieldIndexes}]],其中lngRows是返回记录行数,varStart指定从哪儿开始查找,其值要么是一个Bookmark值,要么是Bookmark常数,见varStart参数用到的Bookmark常数。第三个参数可以是单个列(字段)的名称或索引,也可以是多个列名称或索引组成的Variant数组。如果不指定第三个参数,GetRows返回Recordset中所有列。 
GetString 默认情况下,返回指定数目记录的String串值,记录间由返回代码分隔。记录内由tab分隔。调用语法为: strClip=rstname.GetString(lngRows,[, strCloumnDelimiter[,strRowDelimiter,[strNullExpr]]])。其中lngRows为返回记录行数,strColumnDelimiter为可选的列分隔符(vbTab是默认值),strRowDelimiter是可选的行分隔符(vbCr是默认值),strNullExpr是可选参数,用于碰到Null值时的替代值(默认值是空字符串)。GetString的主要用途是通过把控件的Clip属性设为strClip来处理MSFlexGrid或MSHFlexGrid控件
Move* 从当前记录移动记录指针。调用语法:rstName.Move lngNumRecords [, varStart],其中lngNumRecords是要跳过的记录数,可选选参数varStart指定从哪开始移动。其值要么是一个Bookmark值,要么是Bookmark常数,见varStart参数用到的Bookmark常数。
MoveFirst* 移动记录指针到第一条记录,调用语法为:rstName.MoveFirst
MoveLast* 移动记录指针到最后一条记录,调用语法为:rstName.MoveLast
MoveNext 移动记录指针到下一条记录,调用语法为:rstName.MoveNext。它是能用于forward-only Recordset的唯一Move方法
MovePrevious* 移动记录指针到前一条记录,调用语法为:rstName.MovePrevious
NextRecordset 返回另外的Recordset,它通常由能产生多个Recordset的复合SQL语句(如SELECT * FROM orders;SELECT * FROM customers)或存储过程来创建。调用语法为Next=rstName.NextRecordset [(lngRecordsAffected)],其中可选参数lngRecordsAffected指定返回到rstNext中去的记录数目。如果已不存在Recordset,rstNext被设为Nothing 
Open 在一个活动Command或Connection对象上打开一个Recordset,调用语法为:rstName.Open [varSource [, varActiveConnection [, lngCursorType [, lngLockType [, lngOptions]]]]]。这些参数都是可选的,
Requery 重新从表中获取Recordset的内容,等效于Close后再Open。它是一个资源集中型操作。语法为:rstName.Requery
Resync* 重新从表中获取部分Recordset内容。调用语法为rstName.Resync [lngAffectRecords],其中lngAffectRecords的取值见lngAffectRecords用到的常数。如果把该参数设为adAffectCurrent或adAffectGroup,则比adAffectAll(默认值)所耗的资源要少。 
Save 创建包含Recordset永久性拷贝的文件。调用语法为rstName.Save strFileName。其中strFileName为路径和文件名。通常用.rst作为文件的扩展名。
Supports 如果数据提供者支持指定的游标相关的方法,则返回True,否则返回为False。调用语法为Supported=rstname.Supports (lngCursorOptions).关于lngCursorOptions,见Supports方法用到的常数。
Update* 使对Recordset的修改对底层数据源中的表生效。对于批量操作,Update方法只使修改对本地(Cached)Recordset生效。调用语法为rstName.Update
UpdateBatch* 合对指量类型的Recordset(LockType属性值为adBatchOptimistic,CursorType属性值为adOpenKeyset或adOpenStatic)所做的修改对底层数据源中的表生效。调用语法为rstName.UpdateBatch [lngAffectRecords],其中lngAffectRecords的取值见lngAffectrecords用到的常数。 

注:ADODB.Recordset对象不支持Edit方法。为了改变ADODB.Recordset对象当前记录的一个或多个字段的值,可以先使用rstName.Fields(n).Value=varValue把相应字段的值改为所需要的值,而后执行rstName.Update即可。

事件

事件名称 触发时机
EndOfRecordset 记录指针试图移到最后一条记录之外时
FieldchangeComplete 字段值的改变完成之后 
MoveComplete Move或Move...方法执行之后
RecordsChangeComplete 对单个记录编辑完成以后
RecordsetChangeComplete 缓存中的改变对底层表生效之后
WillChangField 对字段值改变之前
WillChangeRecord 对单个记录改变之前
WillChangeRecordset 缓存中的改变对底层表生效之前
WillMove Move或Move...方法执行之前

注:事件处理模块的函数头几乎都用到了adReason参数。该参数的取值见adReason参数用到的常数。

常数

AbsolutePage属性用到的常数

常数 含义
adPosUnknown 数据提供者不支持页面,Recordset为空,或数据提供者不能确定页码。
adPosBOF 记录指针定位于文件开头(BOF属性值为True)
adPosEOF 记录指针定位于文件结尾(EOF属性值为True)

CursorLocation属性用到的常数

常数 含义
adUseClient 使用客户端游标库提供的游标。ADODB.Recordset要求客户端游标
adUseServer 使用数据源提供的游标,通常(但非绝对)位于服务器上(默认值)

CursorType属性用到的常数

常数 含义
adOpenForwardonly 提供单向移动游标和只读Recordset(默认值)
adOpenDynamic 提供可滚动游标,可显示其他用户对Recordset所做的改动(包括添加新记录)
adOpenKeyset 提供可滚动游标,只隐藏其他用户所做的改动,类似于dynaset类型的DAO.Recordset
adOpenStatic 提供一个位于Recordset静态拷贝上的可滚动游标,类似于snapshot类型的DAO.Recordset,但多了可更新特性

EditMode属性用到的常数

常数 含义
adEditNone 无正在进行的编辑操作(默认值)
adEditAdd 临时添加一条记录,但尚未存入数据库的表中
adEditInProgress 当前记录中的数据已经改动,但尚未存入数据库的表中

Filter属性用到的常数

常数 含义
adFilterNone 除去已有的过滤器,显示Recordset中的所有记录(等效于把Filter属性置为空串,默认值)
adfilterAffectedRecords 只显示上次CancelBatch、Delete、Resync或UpdateBatch方法执行后所影响的记录
adFilterFetchedRecords 只当前Cache中的记录,记录条数由CacheSize来确定
adFilterPendingRecords 只显示已改动但尚未被数据源处理的记录(仅适用于批量更新模式)

LockType属性用到的常数

常数 含义
adLockRecordOnly 指定只读访问(默认值)
adLockBatchOptimistic 使用批量更新模式而不是默认的立即更新模式
adLockOptimistic 使用乐观锁(仅在更新过程中才锁定记录或页面)
adLockPessimistic 使用悲观锁(编辑或更新整个过程中均锁定记录或页面)

State常数

常数 含义
adStateClosed Connection(或其他对象)是关闭的(默认值)
adStateConnecting 正在连接数据源的状态
adStateExecuting Connection或Command对象的Execute方法已被调用
adStateFetching 返回行(row)到Recordset对象
adStateOpen Connection(或其他对象)是打开的(活动的)

Status属性用到的常数(仅适用于Batch或Bulk Recordset操作)

常数 含义
adRecOK 成功更新
adRecNew 成功添加
adRecModified 成功修改
adRecDeleted 成功删除
adRecUnmodified 无改动
adRecInvalid 未保存:Bookmark属性无效
adRecMultipleChanges 未保存:保存会影响其他记录
adRecPendingChanges 未保存:记录引用了一个等待插入操作
adRecCanceled 未保存:操作被取消
adRecCantRelease 未保存:现有记录值阻止了保存
adRecConcurrencyViolation 未保存:乐观并发锁发生了问题
adRecIntegrityViolation 未保存:操作会影响一致性
adRecMaxChangesExceeded 未保存:存在太多的等待改动
adRecObjectOpen 未保存:打开存贮对象发生冲突
adRecOutofMemory 未保存:内存不足
adRecPermissionDenied 未保存:用户权限不够
adRecSchemaViolation 未保存:记录的结构不符合数据库中的定义
adRecDBDeleted 未保存或删除:记录已被删除

lngAffectRecords参数用到的常数

Command类型常数 含义
adAffectAll 包括Recordset对象的所有记录,那些被Filter属性过滤隐藏的记录也计算在内(默认值)
adAffectCurrent 只包括当前记录
adAffectGroup 只包括那些符合当前Filter条件的记录

varStart参数用到的Bookmark常数

常数 含义
adBookmarkCurrent 从当前记录开始(默认值)
adBookmarkFirst 从第一条记录开始
adBookmarkLast 从最后一条记录开始



Supports方法用到的常数

常数 含义
adAddNew 调用AddNew方法
adApproxPosition 设置和得到Absoluteposition和AbsolutePage属性值
adBookmark 设置和得到Bookmark属性值
adDelete 调用Delete方法
adHoldRecords 获取另外的记录或改变获取记录指针的位置,但不提交未确定的改变
adMovePrevious 调用GetRows,Move,MoveFirst和MovePrevious方法(表明是一个双向可滚动游标)
adResync 调用Resync方法
adUpdate 调用Update方法
adUpdateBatch 调用UpdateBatch和CancelBatch方法



adReason参数用到的常数

常数 含义
AdRsnAddNew 调用了AddNew方法
AdRsnClose 调用了Close方法
AdRsnDelete 调用了Delete方法
AdRsnFirstChange 第一次对记录字段值做了修改
AdRsnMove 调用了Move方法
AdRsnMoveFirst 调用了MoveFirst方法
AdRsnMoveLast 调用了MoveLast方法
AdRsnMovePrevious 调用了MovePrevious方法
AdRsnRequery 调用了Requery方法
AdRsnResync 调用了Resync方法
AdRsnUndoAddNew AddNew操作被用户取消
AdRsnUndoDelete Delete操作被用户取消
AdRsnUndoUpdate Update操作被用户取消
AdRsnUpdate 调用了Update方法

- 作者: ilove611 2006年04月28日, 星期五 16:02  回复(0) |  引用(1) 加入博采

SQL的基本操作(3.表的相关操作)
SQL的基本操作(3.表的相关操作) 

1.创建表
(1)用Create Table 命令创建表
语法:
Create Table tabl_name
({
}column_name As computed_column_expression
}
}[,...n]
)
[On {fiegroup | Default}]
[Textimage_On {fiegroup | Default}]

例子:
打开cust数据库,创建一个表,该表包含了学生的有关信息,即有学号、姓名、性别、出生日期、籍贯、联系电话、住址和备注信息。
Use cust
Create Table students
(
number int not null,
name varchar(10) not null,
sex char(2) null,
birthday datetime null,
hometown varchar(30) null,
telphone_no varchar(12) null,
address varchar(30) null,
others varchar(50) null
)
在这个表中number表示学生代号,数据类型为int,不允许为空;name表示学生姓名,数据类型为varchar,长度为10,不允许为空;sex表示学生的性别,数据类型为char,长度为2,允许为空;birthday表示学生的出生日期,数据类型为datetime,允许为空;hometown表示学生的籍贯,数据类型为varchar,长度为30,允许为空;telephone_no表示学生的联系电脑,数据类型为varchar,长度为12,允许为空;address表示学生的住址,数据类型为varchar,长度为30,允许为空;others表示学生的备注信息,长度为50,允许为空。

2.修改表的结构
(1)使用T-SQL语句增加和删除一个新列
语法:
Alter Table table
{
ADO
{[]
|colun_name As computed_column_expression
|[]
}[,...n]
|Drop
{Column column
}[,...n]
}

例子:打开cust数据库,修改其中的表students的结构,增加一个新字段,字段名为ying,数据类型是varchar,长度是10,没有默认值,充许为空。
Use cust
Alter Table students Add ying varchar(10) null

打开cust数据库,修改其中的表students的结构,删除一个字段,字段名为ying。
Use cust
Alter Table students Drop Column ying 

3.向表中插入数据
(1)用 Insert 语句
语法如下:
Insert [Into]
{table_name|view_name}[(column_list)]
{Values|values_list|select_statement}
注意:在插入数据时,字符数据和日期数据要使用引号引起来。
例子:
Use cust
Insert Into students
Values (11,"影子","男","1999-12-12","湖北","83779805","武汉市桥口区","VB爱好者")
打开cust数据库,向students表中插入数据

(2)用Default 选项
在插入数据时,可以使用Default选项。Default选项有两种形式,一种形式是Default Values,另一种是Default。
Default Values 形式为表中的某一行的所有列插入默认值。使用这种形式的前提条件是表中的所有列必须是这四种类型之一:Identity属性,Timestamp数据类型,允许为Null,或者有一个指定的默认值。否则,会错误信息。
例子:
Use cust
Insert Into students Default Values
这个例子会出现错误,因为students表的number字段是设置为不允许为空的。

Default 形式是为表中的某一列插入默认值。要插入的该列必须具备一定的条件,即该列要么是Timestamp 数据类型,要么是允许为Null,要么是有一个指定的默认值,否则,会出现错误信息。
例子:
Use cust
Insert Into students Values(11,"影子",Default,Default,Default,Default,Default,Default)
由天前2个字段不能为空,所以要赋值,否则会出现错误,而后面的6个字段允许为空,因此可以调用Default默认。

(3)插入部分数据
在使用Insert语句插入数据是,还可以插入部分数据,也就是可以为每一行的指定的部分列插入数据。在插入部分数据时,应该注意以下三个问题:
☆在 Insert 子句中,指定要插入数据的列名。
☆在 Values 子句中,列出与列名对应的数据。列名的顺序和数据的顺序应该完全对应。
☆在 Insert 子句中,没有列出的列应该至少具有这四种类型之一:Identtty 属性,Timestamp 数据类型,允许为 Null,或者有一个指定的默认值。否则,会出现错误信息。
例子:
Use cust
Insert Into students (number,name)
Values (110,"影子")
打开cust数据库,向students表中插入一行数据
注意:如用下例语句将发生错误,因为name字段是不允许为空的(在创建数据库时设定的)
Insert Into students (number)
Values (110)

(4)用 Select 语句插入多条数据
Insert 语句插入数据的特点是每一次只能插入一行数据。相反,Select 也可以用在 Insert 语句中,并且可以一次插入多条数据。使用 Select 语句插入数据的语法形式如下:
Insert table_name
Select column_list
From table_list
Where search_conditions
在使用 Select 语句插入数据时,应该注意下面几点:
☆在 Insert 语句中使用 Select 时,他们参考的表既可以是相同的,也可以是不同的。
☆要插入数据的表必须已经存在。
☆要插入数据的表必须和 Select 的结果集兼容。兼容的含义是列的数量和顺序必须相同,列的数据类型或者相同,或者SQL Server 可以自动转换。
例子:
Use cust
Insert students
Select number,name,sex,birthday,hometown,telphone_no,address,others
From students
注意:
Select 后面的字段要输完整,这个例子是自己向自己插入多条数据(自己向自己插入是被允许的)
补充:
你还可以“From students”后面加上“Where name="影子"”,只插入name等于影子的记录,可以用And 和 Or 加上多个条件。

(5)使用 Select Into 插入数据到一个新表中
带有 Into 子句的 Select 语句允许用户定义一个新表并且把数据插入到新表中。这种方法不同于前面讲述的那些方法。在前面的那些方法中,一个共同的特点,是在数据输入之前表已经存在。而使用 Select Into 插入数据的方法,是在插入数据的过程中建立新表。
Select Into 语句的语法如下:
Select select_list
Into new_table_name
From table_list
Where search_conditions
在使用 Select Into 插入数据时,要注意下面几点:
☆在某个数据库中使用 Select Into 插入数据时,设置该数据库的 Select Into/Bulk Copy 为真。
☆新表不能存在,否则会产生错误信息。
☆新表中的列和行是基于查询结果集
☆要插入的数据不记录在日志中。
☆在select_list 中出现的列应该使用别名,否则,新表中的列没有列名。没列名的表只能通过 Select * From new_table_name 的形式查询。因此,应该为列起个别名。
☆这种方法多用在对列进行各种计算的情况。
例子:
Select number,name
Into newcust1
From students
创建新的表newcust1,插入students表中的number和name字段的所有数据。
补充:如果要插入所有字段的记录,则“Select *”,也可在“From students”后加条件,方法和上个例子一样。

(6)用 UPdate 语句修改表中的数据
Update 语句用来修改表中已存在的数据。Update 语句既可以一次修改一行数据,也可以一次修改许多行,甚至可以一次修改表中的全部数据。Update 语句使用 Where 子句指定要修改的行,使用 Set 子句给出新的数据。新数据可以是常量,也可以是指定的表达式,还可以是使用 From 子句来自其他表的数据。
Update 语句的语法如下:
Update {table_name|view_name}
Set {column_list}=expression [,. . .]
[Where clause]
在使用 Update 语句时,如果没有使用 Where 子句,那么就对表中所有的行进行修改。如果使用Update 语句修改数据时与数据完整性约束有冲突,那么修改就不会发生,整个修改事务全部滚回。例如,这种冲突可能是所输入的值是错误的数据类型,或者所输入的值违背了在该列定义的规则约束,等等。
例子:
Use cust
Update students
Set name=name+"007"
Where number>100
打开cust数据库,修改students表,使number>100的数据的name的值全部加"007"。

4.用 Delete 语句删除表中的数据
当数据库中的数据不需要的进修可以删除。一般情况下,删除数据使用 Delete 语句。Delete 语句可以一次从一个表中删除一条或者多条数据行。
Delete 语句的语法如下:
Delete [From] table_name
Where search_conditions
在 Delete 语句中如果使用了 Where 子句,那么就从指定的表中删除满足 Where 子句条件的数据行。
例子:
Use cust
Delete students
Where number>100
删除 students中,number>100的数据
补充:
如果在 Delete 语句中没有指定 Where 子句,那么就将表中所有的记录全部删除,即 Delete students 语句删除表中的全部记录。
在删除表中的全部数据时,还可以使用 Truncate Table 语句。Truncate Table 语句和 Delete 语句都可以将表中的全部数据删除,但是,两条语句又有不同的特点。当用户使用 Delete 语句删除数据时,被删除的数据要记录在日志中。并不将对数据的变化记录在日志中。因此,使用 Truncate Table students 语句删除记的速度快于使用 Delete students 语句删除表中记录的速度。

5.用 Drop Table 命令删除表
当数据库中的表不需要时可以删除。删除表可以使用 Drop Table 语句。删除表就是删除表的定义以及表的全部数据、索引、触发器、约束和指定该表的许可。当删除表时,基于表的视图不能被删除,必须使用 Drop View 语句删除视图。
Drop Table 语句的语法如下:
Drop Table table_name
例子:
Use cust
Drop Table students
删除cust数据库中的students表。
补充:
不能使用 Drop Table 语句删除正在被约束参考的表,必须首先要么删除外键约束,要么删除参考表。表的所有者可以删除表。当删除表是时,绑定在该表上的规则或者默认则失掉了绑定,该表的约束或者触发器则自动被删除。如果重新创建表,必须重新绑定相应的规则和默认、重新创建触发器和增加必要的约束。另外,系统表不能删除。
删除表的许可属于表的所有者。然而,数据所有者(DBO)、系统管理员(SA)和DLL管理员可以删除数据库中的任何对象。

- 作者: ilove611 2006年04月28日, 星期五 15:59  回复(0) |  引用(1) 加入博采

关闭所有的数据库连接
关闭所有的数据连接
如果在代码中使用了数据控件如 DAO, RDO, 或 ADO, 在退出时应该关闭所有打开的 recordset, database,和 workspace 。 虽然对象能自动注销, 但是数据连接不会马上断开, 可能会导致一些内存不能被系统重新分配。
下面的代码可以关闭所有打开的 DAO workspace, 并释放所占的内存。
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
'
Dim ws As Workspace
Dim db As Database
Dim rs As Recordset
'
For Each ws In Workspaces
For Each db In ws.Databases
For Each rs In db.Recordsets
rs.Close
Set rs = Nothing
Next
db.Close
Set db = Nothing
Next
ws.Close
Set ws = Nothing
Next
'
End Sub

- 作者: ilove611 2006年04月28日, 星期五 15:56  回复(0) |  引用(1) 加入博采

ListView控件
VB高级控件,高级之处在于它使用了对象的方式组织内容。
要使用ListView控件,需要加入组件:
Microsoft Windows Common Controls 6.0
Windows资源管理器的右半部分,就是一个ListView控件。


作用
列出并列关系的对象及对象属性。


ListView控件的对象层次结构
ListView -整个控件
ColumnHeaders -标题行
ColumnHeader -标题列
ListItems -对象行集合
ListItem -对象行
ListSubItems -对象属性集合
ListSubItem -对象属性
注意:SubItems和ListSubItems的区别:SubItems是一个String数组;ListSubItems是一个集合。


属性
View:设置ListView的外观
Sorted:设置ListView中的对象集合是否排序。
SortKey:设置以第几项排序。从零开始。
SelectedItem:返回选中的对象的引用。


事件
AfterLabelEdit:编辑ListItem对象的标签时被触发。
BeforeLabelEdit:编辑ListItem对象的标签后出发。
ColumnClick:单击列标题时触发。参数中可以获得被单击的列对象。通常用于排序。
ItemClick:单击某行或某ListItem时触发。参数中可以获得被单击的ListItem对象。


方法
FindItem:搜索ListItem对象。
参数:
string:搜索字符串。
value:在ListItem的哪部分中搜索(LvwText、LvwSubItem、LvwTag);index:开始搜索的位置。
match:匹配方式。
HitTest:检索位于特定坐标处的ListItem对象。

- 作者: ilove611 2006年04月28日, 星期五 14:30  回复(0) |  引用(1) 加入博采

vb窗口中平铺背景图片的方法

Windows   95的墙纸可以平铺一副图片,如何在VB中实现类似的功能?  
  VB里面有个方法(Method)叫PaintPicture,可以用来拷贝图片到新的位置。我们就  
  利用这个方法把一副小小的图片(可以是BMP,WMF,GIF,JPG)填满整个窗体,实现平铺  
  图片的功能。  
  具体步骤如下:  
  1)   在VB中新建一个标准EXE工程;  
  2)   定义Image1,设置Image1的Picture属性,读取图片文件。  
  3)   在Form_Paint()事件中编写程序如下:

Private Sub Form_Paint()
    Dim X As Integer, Y As Integer
    Dim ImgWidth     As Integer
    Dim ImgHeight     As Integer
    Dim FrmWidth     As Integer
    Dim FrmHeight     As Integer
nbsp;   '初始化
    ImgWidth = Image1.Width
    ImgHeight = Image1.Height
    FrmWidth = Me.Width
    FrmHeight = Me.Height
    '开始平铺
    For X = 0 To FrmWidth Step ImgWidth
        For Y = 0 To FrmHeight Step ImgHeight
            PaintPicture Image1, X, Y
        Next Y
    Next X

End Sub

- 作者: ilove611 2006年04月28日, 星期五 10:22  回复(0) |  引用(1) 加入博采

制图和打印

1、制图

所需控件:CommonDialog

代码如下:

Private Sub mnu_File_Export_Click()
    '输出当前map1中的图
    CommonDlgFileExport.CancelError = True
    On Error GoTo Errhandler
   
    '保存图像
    CommonDlgFileExport.Filter = "jpg(*.jpg)|*.jpg"
    CommonDlgFileExport.DefaultExt = "jpg"
    CommonDlgFileExport.DialogTitle = "保存"
    CommonDlgFileExport.FileName = "地图"
    CommonDlgFileExport.ShowSave
       
    Map1.ExportMapToJpeg CommonDlgFileExport.FileName, , True, , moAllSymbologyScaled
    Exit Sub
   
    '取消保存
Errhandler:
    Exit Sub
   
End Sub

2、打印

Private Sub mnu_File_Print_Click()
    On Error GoTo Errhandler
    Map1.PrintMap "MapInPaf", "", False
    Exit Sub
Errhandler:
    MsgBox Err.Description + ",程序停止。"
    Exit Sub
   
End Sub

- 作者: ilove611 2006年04月9日, 星期日 14:06  回复(0) |  引用(1) 加入博采

往Map中加载图层的方法
摘要:简单的加载图层的方法 查看全文

- 作者: ilove611 2006年04月9日, 星期日 10:12  回复(0) |  引用(1) 加入博采