VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB 5.0数据库设计技术讲座(5)
发表评论(0)作者:倪秉书, 平台:VB6.0+Win98, 阅读:10109, 日期:2000-10-01
SQL在VB中的使用及访问远程数据库
VB 5.0数据库设计技术讲座(5)
(作者:倪秉书 2000年06月09日 15:58)


  SQL在VB数据库中的使用

  在VB中要想灵活地操作数据库,完成各种复杂操作,就需要掌握结构化查询语言SQL语言。比如在Data控件中,如果数据源是来自两个或两个以上的表时,就要使用SQL。SQL语言的操作根据其功能分为:数据查询语言(DQL)、数据操作语言(DML)、数据定义语言(DDL)以及数据控制语言(DCL)。

  1.数据查询语言(DQL)

  数据查询负责从表中提取数据并把它交给应用程序,格式如下:

  SELECT (字段列表) FROM (表格清单) WHERE (表达式)

  仍以前面的Myfile库为例,要得到“张清源”的电话,可以使用下面的查询:

  SELECT 电话 FROM Phone WHERE 姓名=“张清源”

  SELECT语句的第一部分指名要选取的列,可以包括用逗号分开的一系列字段列表。如果要选择表中的所有字段,可以用星号(*)代替要输入的字段名,比如:

  SELECT * FROM Phone

  SELECT语句的第二部分指明要从哪些表中查询数据。在此例中,要查询的表名只有一个Phone,SQL允许从一个或多个表中查询数据,表间用点号分隔。比如:

  SELECT 姓名,作品 FROM Phone,Article WHERE Phone.序号=Address.序号

  表达式根据需要也可以使用程序设计语言中使用的逻辑运算符NOT、AND和OR。

  2.数据操作语言(DDL)

  (1)插入记录(Insert或Insert into):允许在表中添加新记录,比如:

  INSERT INTO Phone(姓名,电话,地址) VALUES (′张三′,′3433514′,′福建福州′)

  在第一个括号中指定一个或多个要被插入数据的字段名称,在第二个括号中给出对应的实际值,用逗号隔开多个字段名。这个语句把三个字符串“张三”、“3433514”、“福建福州”分别插入表Phone的姓名、电话和地址字段中,形成一个新的记录。

  如果在用INSERT添加一条新记录时,有一个或多个字段没有提供字段值时,系统一般会插入一个缺省值或一个空值:

  SELECT * INTO Phone2 FROM Phone

  可以有选择地从一个表向另一个表插入多条记录,上例表示把Phone表中的所有记录都插入Phone2中。

  (2) 删除记录(Delete):从表中删除一个或多个记录,一般后跟WHERE 子句,用来选择要删除的记录。

  例如,下面的这个DELETE语句只删除姓名字段的值为“张三”的记录:

  DELETE Phone WHERE 姓名=′张三′

  如果不给出WHERE 子句,表中的所有记录都将被删除。

  (3)更新记录(Update):修改表中已经存在的一条或多条记录,UPDATE语句也可以使用WHERE子句来选择更新特定的记录:

  UPDATE 〈表名〉 SET 〈字段1=值1,字段2=值2,...〉 [WHERE 表达式]

  UPDATE Phone SET 姓名=′李四′WHERE 电话=′3433215′

  如果不提供WHERE子句,表中的所有记录都将被更新,这在成批修改诸如价格等字段是很有用的。

  3.数据定义语言(DDL)

  DDL允许创建或修改表、列和索引,但不能创建数据库,要创建数据库要用CreateDatabase方法。数据定义语言语句包括:

  (1)创建新表(Create Table)和删除表,比如:

  CREATE TABLE Phone2(姓名 CHAR(15),工资 INT)

  DROP TABLE Phone2

  (2)修改表,即在表中增加或删除列的操作(Alter table):比如,

  ALTER TABLE Phone2 ADD COLUMN 备注 TEXT

  ALTER TABLE Phone DROP COLUMN 备注

  (3)在表中建立索引(Create Index)和删除索引(Drop Index)

  CREATE INDEX NameIndex ON Phone2(姓名)

  DROP I

  ODBC方式访问远程数据库

  网络上的许多应用,比如IDC(Internet数据库连接器)、ASP(Active 服务器页)以及Microsoft DBWeb(一种Internet服务器应用编程接口)等需要访问远程数据库时,要通过ODBC (Open DataBase Connectivity)即开放式数据库连接来进行。

  1. 配置ODBC

  ODBC通过DSA(Data Source Administrator)程序来管理,它负责在ODBC注册表中创建一个指定的项。而在程序中调用ODBC时,ODBC驱动程序管理器激活正在使用的相应数据库的驱动程序。

  要在ODBC注册表中创建一数据源项,打开Windows中的“控制面板”,选择“32位ODBC”,来安装和配置特定数据源所需要的驱动程序(图1)。


  图1 ODBC数据源管理器



  在打开的“ODBC数据源管理器”中,可以看到“用户DSN”、“系统DSN”、“文件DSN”、“ODBC驱动程序”等几个选项卡,其中前面三个选项卡描述了DSN的三种类型:

  (1)用户DSN→用户DSN选项卡:用户DSN代表计算机的本地数据库,只能应用在当前机器上,由当前的一个用户使用,并且只对用户可见。

  (2)系统DSN→系统DSN选项卡:储存了如何与数据提供者连接的信息,当前计算机上的所有用户都可以使用系统DSN,它并不仅限于单个用户。

  (3)文件DSN→文件DSN选项卡:文件DSN可以由所有安装了相同驱动程序的用户共享。这些数据源不只限于某一用户或单一计算机专用。当要建立一个与Web服务器一起使用的数据源时,我们应该建立一个文件数据源,建立这样的文件数据源后,连接信息存储在一个实际的文件中,不止一个用户可以访问这个文件。并且通过复制扩展名为.DSN的文件,可以轻易地把应用从一个机器移植到另一个机器。由于以上原因,本讲中的示例使用文件DSN。

  要登记注册一个数据源,可根据实际访问的需要点击相应的选项卡,比如“文件DSN”选项卡,点击“添加”按钮,选择第一个“Microsoft Access Driver(*.mdb)”表示要访问的是Access数据库;接下来键入一个要创建的数据源名称,比如“AccessODBC”,点击“下一步”和“完成”;最后在数据库对话框内点击“选取”,选择需要访问的数据库,此时如果点击“高级”按钮,还可对数据源增加用户号(UID)和密码(PWD),系统默认的用户号为admin,密码为空。最后按“确定”退出,在列表中就可以看到我们所创建的数据源了。

  有了以上的注册,我们在应用程序中就可通过ODBC访问数据库了,通过ODBC访问远程服务器的数据库有三种方法:使用Jet数据库引擎、通过ODBC使用ODBC API绕过Jet引擎直接到达数据源或者使用远程数据对象(RDO)。

  2.通过Jet引擎访问数据源

  如果使用ODBC数据源时,不用给出物理数据库文件名,而是向ODBC驱动程序发出一个引用信息,当一个库改变时,只要在“控制面板”中重新配置ODBC即可,而不必改变应用程序的代码。例如:

  ODBCConnect="ODBC;DSN=AccessODBC;UID=admin;PWD="

  在例子中,创建一个ODBCConnect变量,它包含保存在注册表中的数据源名称,还有用户ID和口令。

  然后,把连接串作为参数传递给OpenDatabase的方法就可完成连接了。

  SET DBDatabase=Opendatabase("", ,false,ODBCConnect)

  也可以把ODBC单独指定为连接串来连接ODBC数据源。例如:

  Set DBDatabase=openDatabase("",true,ture,"ODBC;")

  在上例中因未指明DSN、UID以及PWD,Windows会显示选择数据源对话框,要求提供这些信息。

  3.使用ODBC API访问数据源

  ODBC API是一组函数,它的连接是通过四个句柄来引用的,它允许直接访问ODBC数据库,而不需要Jet引擎的内部操作。通过ODBC API访问数据库的速度比使用Jet快许多倍,但ODBC API需要进行许多程序设计和测试的工作,所以通常不采用这种方法访问数据库。

  4.使用远程数据对象(RDO)访问数据源

  为了克服Jet引擎太慢而ODBC API又太复杂的弊端,VB5引入了远程数据对象(RDO),对访问远程数据库进行了优化,它可以象使用DAO一样轻松地访问数据库,还可使应用程序在较低档的工作站上运行。RDO有许多基本的对象和方法,在DAO中都有直接等价或在概念上等价的对象和方法见表1。

表1 RDO与DAO比较? 对象名
DAO中等价的概念
作用说明

RDOEngine
DBEngine
代表一个远程数据源

RDOEnvironment
WorkSpace
定义一个与ODBC数据源相连接

RDOConnection
Database
代表与远程数据源的物理连接

RDOQuery
QueryDef
用来封装一个查询定义

RDOResultSet
RecordSet
封装执行查询后返回的数据