数据库范例
作为这篇文章的附带,这里有一个叫acIntSQL.mdb的数据库范例。
在acIntSQL中的任一处都是基于本文所提到的所有主题,并且它通过查询和范例的代码演示了我们所讨论的不同SQL语句。
在acIntSQL中所使用到的许多部分查询都是基于特定工作表中存在和包含的数据,或者是基于其它已经存在的数据库对象。如果你由于丢失数据而在运行一个查询产生故障,打开工作表重置窗体并单击工作表重置按键。这将会重新生产工作表和其中原始缺省数据。如果要手动通过工作表重置过程,你需要按照下面的顺序执行这些查询过程:
Drop Table Shipping
Drop Table Invoices
Drop Table Customers
Drop Table CreditLimit
Create Table Customers
Create Table Invoices
Create Table Shipping
Create Table CreditLimit
Populate Customers
Populate Invoices
Populate Shipping
Populate CreditLimit
查询
查询就是指存储在Access数据库中并可以随时调用的SQL 语句,也可以直接被Access 用户界面或Visual Basic® for Applications (VBA)编程语言调用。查询可以使用Access Query Designer来建立,Access Query Designer时一个可以很容易建立SQL语句的强大的可视化工具。或者你也可以通过直接在SQL视图窗口输入SQL语句来建立查询。
如同在"Microsoft Jet SQL for Access 2000基础篇"一文中所述, Access把数据库中所有面向数据的任务转化为SQL 语句。要演示这一点,让我们使用Access Query Designer来建立一个查询。
打开acIntSQL数据库。
(单击此处拷贝acIntSQL.mdb 数据库例子。)
确保tblCustomers 和 tblInvoices这两个表单已经创建并且其中包含有数据。
在数据库窗口中从Objects条中选择Queries选项。
在数据库窗口工具条里单击按键 New。
在New Query对话框中选择Design View并单击OK。
在Show Table对话框中选择tblCustomers并单击Add;接着选择tblInvoices 并单击Add;接着单击Close按键。
在tblCustomers 域名列表中选择Last Name 域并把它拖到设计表格中的第一个域中。
在tblInvoices 域名列表中选择InvoiceDate 和 Amount域并把它们拖到设计表格中。
在设计表格中InvoicwDate域的Sort属性里选择Ascending。
从Access菜单条中选择View并单击SQL View。这样就打开了SQL View 窗口和显示了在查询中Access正在使用的SQL语法。
注意 这个查询类似于存储在acIntSQL 数据库中的"Join - Inner"查询。
嵌入语句
嵌入SQL 语句就是指你在Visual Basic for Applications (VBA) 编程语言中使用SQL 语句。虽然深入讨论如何使用VBA超出了本文的范围,但如何使用程序来运行SQL 语句却是一件简单的工作。
在acIntSQL数据库中,有两个使用内部SQL语句的窗体需要通过Jet OLE DB provider 和 ADO来运行:就是演示数据定义语句的 Intermediate DDL 窗体,以及演示数据处理语句的Intermediate DML窗体。
中级DDL 语句
这个acIntSQL数据库有许多关于你可以用来管理你的数据库结构的SQL 语句的范例。有一部分数据定义语言 (DDL) 语句被以数据定义查询的方式存储。而其它的则在程序设计代码的内部作为内联SQL使用。如果你要使用这些DDL例子,你需要在运行它之前删除一些数据库对象。例如,如果你想运行创建当前数据类型的查询,你就先要确定当前数据表单不存在。如果不是,那么,这个查询就会返回一个信息告诉你这个表单已经存在。在运行任何DDL 例子之前,检查它所要创建或改变的数据库对象确定其已经被设定好,这样程序才能完全的运行。
在内联DDL 语句范例中,同样的建议仍然是适用的:检查并设定它们会影响的数据库对象以确保DDL 语句的顺利运行。
一般来说,内联DDL 语句只是通过简单设定一个ADO Connection对象来运行,并将SQL 语句传送给 Connection对象的运行程序。下面是来源于在中级DDL语句窗体的二进制数据类型的输入输出。
Private Sub cmdBinary_Click() Dim conDatabase As ADODB.Connection
Dim SQL As String
On Error GoTo Error_Handler
Set conDatabase = Application.CurrentProject.Connection
'注意: Fields 1 through 4 can be created through both
'SQL View and the Jet OLEDB Provider.
'Fields 5 and 6 can only be created through the
'Jet OLE DB provider.
SQL = "CREATE TABLE tblCodeBinaryDataTypes (" & _
"Field1_BINARY BINARY, " & _
"Field2_BINARY250 BINARY(250), " & _
"Field3_VARBINARY VARBINARY, " & _
"Field4_VARBINARY250 VARBINARY(250), " & _
"Field5_BVARYING BINARY VARYING, " & _
"Field6_BVARYING250 BINARY VARYING(250))"
conDatabase.Execute SQL
MsgBox "The BINARY datatypes table has been created!"
conDatabase.Close
Set conDatabase = Nothing
Exit Sub
Error_Handler:
MsgBox Err.Description, vbInformation
End Sub
运行过其中一个DDL 语句后,在设计视图中打开被影响的数据库查看产生了什么变动。如果DDL 语句影响了表单之间的关联,打开编辑关联窗口查看其变动。例如让我们检查一下在中级DDL语句窗体中的Alter Table w/ Fast Foreign Key输出指令和按键。
打开acIntSQL 数据库。
确定tblCustomers 和 tblInvoices 表单已经被创建。
在数据库窗口从Objects条中选择Forms。
在数据库窗口工具条中着重显示Intermediate DDL 语句的窗体并单击Design按键。
在Intermediate DDL 语句窗体中,鼠标右键点击Alter Table w/ Fast Foreign Key按键并从弹出菜单中选择 Build Event…。这操作将打开VBA开发环境以及包含着cmdFastKey_Click子过程的代码窗口。
检查被分配给 SQL变量的SQL 语句。
SQL = "ALTER TABLE tblInvoices " & _
"ADD CONSTRAINT FK_tblInvoices " & _
"FOREIGN KEY NO INDEX (CustomerID) REFERENCES " & _
"tblCustomers (CustomerID) " & _
"ON UPDATE CASCADE " & _
"ON DELETE CASCADE"
注意 DDL 语句改变了tblInvoices 表单并添加了牢固的外关键字限制。同时它也通过使用级联子句在tblInvoices 和 tblCustomers 之间建立了一个数据关联。
关闭VBA 开发环境。
关闭Intermediate DDL 语句窗体。
从Tools菜单中,选择Relationships…菜单项以打开关联窗口。
双击tblCustomers 和 tblInvoices 之间的关联链接以打开Edit Relationships对话框。
注意级联性更新和删除选项没有被设置。
关闭对话框。
当关联链接仍然显示时,按Delete键删除联接。
关闭关联窗口。
如果Intermediate DDL 语句在数据库窗口仍然显示,点击数据库窗口工具条中的Open按键。
点击Alter Table w/ Fast Foreign Key按键产生一个外关键字联系。
关闭Intermediate DDL 语句窗体。
当新的关系链接被创建后,使用前面提到的步骤打开Edit Relationships对话框。
注意级联性更新和删除选项已经被设置。
中级 DML 语句
这个acIntSQL数据库有许多关于数据处理语言 (DML) 语句的例子,在这些范例里你可以用它们来找到数据,并且它们中的大多数是以查询的形式实现的。仅有的以在线SQL形式实现的DML 语句则是基于中级DML 语句窗体的。窗体中的三个例子在LIKE子句中使用"_" 和 "%" 通配符,并使用SELECT INTO 语句在一个外部数据库中创建一个表单。
在acIntSQL 数据库中保存的两个查询是属于DML 语句内容却执行类似DDL的操作。其中的SELECT INTO 语句从已有的数据库中找到数据并用这些数据创建新的工作表。通过这些范例的学习,你将学会如何删除目标工作表,前提是这些工作表已经存在。
在中级DML语句的窗体中的Create Customers Database输出指令和按键展示了一个对SELECT INTO 语句的有趣应用。这是一个告诉你使用中级SQL 语句所能完成的各种事情的一个好的例子。下面就是关于输出命令和按键的子过程的代码:
Private Sub cmdCreateDB_Click()
Dim conCatalog As ADOX.Catalog
Dim conDatabase As ADODB.Connection
Dim SQL As String
Dim sDBName As String
On Error GoTo Error_Handler
'Initialize objects & variables.
Set conDatabase = Application.CurrentProject.Connection
Set conCatalog = New ADOX.Catalog
sDBName = "C:Customers.mdb"
'Create the Customers database.
conCatalog.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & sDBName
'Run the DML statement to build the Customers table.
SQL = "SELECT * INTO tblCustomers IN '" & sDBName & _
"'" & "FROM tblCustomers"
conDatabase.Execute SQL
MsgBox "The new CUSTOMERS database has been created " & _
"as " & sDBName & ".", vbInformation
conDatabase.Close
Set conDatabase = Nothing
Set conCatalog = Nothing
Exit Sub
Error_Handler:
MsgBox Err.Description, vbInformation
End Sub
如果客户数据库已经存在,那么代码将返回一个信息告诉你这个数据库无法被创建。让我们逐步的运行这个代码来看看它都做了什么。
坚持你的C:驱动器确定Customers.mdb文件不存在,如果存在就删除它。
打开acIntSQL 数据库。
确定tblCustomers数据库已经被创建并且此数据库已经装载了数据。
在数据库窗口从Objects条中选择Forms。
在数据库窗口工具条中着重显示Intermediate DM 语句的窗体并单击Open按键。
单击Create Customers Database按键创建新的数据库。
切换到资源管理器查看你的C盘驱动器内容。Customers.mdb 数据库文件应该已经被创建。
双击Customers.mdb数据库文件以打开另一个Access实例。
打开tblCustomers 数据库。注意它所包含的数据和 acIntSQL 数据库里的tblCustomers 所包含的数据相同。
这个产生新的数据库的代码范例是通过Jet OLE DB provider使用ADOX 对象库来创建Access数据库。对于ADOX 对象库的讨论已经超出了本文的范围。如果你想知道更多关于它的信息,在Access 2000 在线帮助中查找"Microsoft ActiveX Data Objects (ADO)"并打开其目录直到你看见"Microsoft ADO Extensions for DDL和 Security (ADOX) Programmer's Reference"。