Difference between revisions of "ZH/Documentation/BASIC Guide/Database Access"
Line 2: | Line 2: | ||
|ShowPrevNext=block | |ShowPrevNext=block | ||
|ShowPrevPage=block | |ShowPrevPage=block | ||
− | |PrevPage=Documentation/BASIC Guide/Data Sources | + | |PrevPage=ZH/Documentation/BASIC Guide/Data Sources |
− | |NextPage=Documentation/BASIC Guide/Dialogs | + | |NextPage=ZH/Documentation/BASIC Guide/Dialogs |
|base=block | |base=block | ||
}} | }} | ||
Line 152: | Line 152: | ||
{{PDL1}} | {{PDL1}} | ||
+ | {{InterWiki_Languages_BasicGuide|articletitle=Documentation/BASIC Guide/Database Access}} | ||
{{InterWiki_Languages_BasicGuide|articletitle=Documentation/BASIC Guide/Database Access}} | {{InterWiki_Languages_BasicGuide|articletitle=Documentation/BASIC Guide/Database Access}} |
Revision as of 22:06, 12 December 2008
要访问数据库,需要建立数据库连接。这是一个传输通道,它允许直接与数据库进行通信。与上一节中介绍的数据源不同,每次重新启动程序时都必须重新建立数据库连接。
Apache OpenOffice 提供了多种建立数据库连接的方法。以下示例说明了如何连接到现有数据源。
Dim DatabaseContext As Object Dim DataSource As Object Dim Connection As Object Dim InteractionHandler as Object DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext") DataSource = DatabaseContext.getByName("Customers") If Not DataSource.IsPasswordRequired Then Connection = DataSource.GetConnection("","") Else InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler") Connection = DataSource.ConnectWithCompletion(InteractionHandler) End If
该示例中使用的代码先检查数据库是否采用密码保护。如果没有密码保护,则使用 GetConnection 调用创建所需的数据库连接。命令行中的两个空字符串表示用户名和密码。
如果数据库采用密码保护,该示例将创建一个 InteractionHandler,然后使用 ConnectWithCompletion 方法打开数据库连接。InteractionHandler 确保 Apache OpenOffice 要求用户提供所需的登录数据。
表格迭代
在 Apache OpenOffice 中,通常使用 ResultSet 对象访问表格。ResultSet 是一种标记类型,它表示使用 SELECT 命令获取的大量结果中的当前数据集。
以下示例说明了如何使用 ResultSet 查询数据库表中的值。
Dim DatabaseContext As Object Dim DataSource As Object Dim Connection As Object Dim InteractionHandler as Object Dim Statement As Object Dim ResultSet As Object DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext") DataSource = DatabaseContext.getByName("Customers") If Not DataSource.IsPasswordRequired Then Connection = DataSource.GetConnection("","") Else InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler") Connection = DataSource.ConnectWithCompletion(InteractionHandler) End If Statement = Connection.createStatement() ResultSet = Statement.executeQuery("SELECT ""CustomerNumber"" FROM ""Customer""") If Not IsNull(ResultSet) Then While ResultSet.next MsgBox ResultSet.getString(1) Wend End If
在建立数据库连接后,该示例中使用的代码先使用 Connection.createObject 调用创建 Statement 对象。然后,该 Statement 对象使用 executeQuery 调用返回实际的 ResultSet。接下来,程序将检查 ResultSet 是否实际存在并使用循环遍历数据记录。所需的值(此示例中为 CustomerNumber 字段中的值)使用 getString 方法返回 ResultSet,参数 1 由此确定调用与第一列中的值有关。
用于检索值的特定于类型的方法
正如在上一节的示例中所看到的一样,Apache OpenOffice 提供了一个用于访问表格内容的 getString 方法。该方法以字符串形式提供结果。可以使用下面的 get 方法:
- getByte()
- 支持数字、字符和字符串的 SQL 数据类型
- getShort()
- 支持数字、字符和字符串的 SQL 数据类型
- getInt()
- 支持数字、字符和字符串的 SQL 数据类型
- getLong()
- 支持数字、字符和字符串的 SQL 数据类型
- getFloat()
- 支持数字、字符和字符串的 SQL 数据类型
- getDouble()
- 支持数字、字符和字符串的 SQL 数据类型
- getBoolean()
- 支持数字、字符和字符串的 SQL 数据类型
- getString()
- 支持所有 SQL 数据类型
- getBytes()
- 支持二进制值的 SQL 数据类型
- getDate()
- 支持数字、字符串、日期和时间戳的 SQL 数据类型
- getTime()
- 支持数字、字符串、日期和时间戳的 SQL 数据类型
- getTimestamp()
- 支持数字、字符串、日期和时间戳的 SQL 数据类型
- getCharacterStream()
- 支持数字、字符串和二进制值的 SQL 数据类型
- getUnicodeStream()
- 支持数字、字符串和二进制值的 SQL 数据类型
- getBinaryStream()
- 二进制值
- getObject()
- 支持所有 SQL 数据类型
在所有情况下,都应将列数作为要对其值进行查询的参数列出。
ResultSet 变体
通常,数据库访问的关键问题是速度快慢。Apache OpenOffice 提供了几种方法来优化 ResultSets,因而控制了访问速度。ResultSet 提供的函数越多,其实现通常就越复杂,因而函数速度也就越慢。
简单的 ResultSet 提供了最少的可用函数。它仅允许为要询问的值向前应用迭代。因此,不包含更详细的浏览选项,如修改值的可能性。
用于创建 ResultSet 的 Statement 对象提供了一些属性,它们允许改变 ResultSet 的函数:
- ResultSetConcurrency (const)
- 有关能否修改数据的规范(与 com.sun.star.sdbc.ResultSetConcurrency 一致)。
- ResultSetType (const)
- 有关 ResultSets 类型的规范(与 com.sun.star.sdbc.ResultSetType 一致)。
com.sun.star.sdbc.ResultSetConcurrency 中定义的值包括:
- UPDATABLE
- ResultSet 允许修改值
- READ_ONLY
- ResultSet 不允许修改
com.sun.star.sdbc.ResultSetConcurrency 常量组提供了以下规范:
- FORWARD_ONLY
- ResultSet 仅允许向前浏览
- SCROLL_INSENSITIVE
- ResultSet 允许任何类型的浏览,但不记录对原始数据所做的更改
- SCROLL_SENSITIVE
- ResultSet 允许任何类型的浏览,对原始数据所做的更改将影响 ResultSet
在使用 ResultSet's UPDATEABLE 和 SCROLL_SENSITIVE 属性时,ResultSet 的函数范围相当于 ADO 和 DAO 中的 Dynaset 类型的 Recordset。
ResultSet 中的浏览方法
如果 ResultSet 是 SCROLL_INSENSITIVE 或 SCROLL_SENSITIVE 类型,则它支持各种在数据存储中进行浏览的方法。主要方法包括:
- next()
- 浏览到下一个数据记录
- previous()
- 浏览到上一个数据记录
- first()
- 浏览到第一个数据记录
- last()
- 浏览到最后一个数据记录
- beforeFirst()
- 浏览到第一个数据记录之前
- afterLast()
- 浏览到最后一个数据记录之后
所有方法都返回一个布尔参数,该参数指定浏览是否成功。
为确定当前的光标位置,提供了以下测试方法,这些方法均返回一个布尔值:
- isBeforeFirst()
- ResultSet 位于第一个数据记录之前
- isAfterLast()
- ResultSet 位于最后一个数据记录之后
- isFirst()
- ResultSet 是第一个数据记录
- isLast()
- ResultSet 是最后一个数据记录
修改数据记录
如果使用 ResultSetConcurrency = UPDATEABLE 值创建了 ResultSet,则可以编辑其内容。这仅适用于 SQL 命令允许将数据重新写入到数据库的情况(按照原则)。例如,不适用于包含链接列或累积值的复杂 SQL 命令。
ResultSet 对象提供了用于修改值的 Update 方法,这些方法的结构方式与用于检索值的 get 方法相同。例如,updateString 方法允许写入字符串。
在进行修改后,必须使用 updateRow() 方法将值传送到数据库。必须在下一个浏览命令之前进行调用,否则,这些值将会丢失。
如果在修改期间出现错误,则可以使用 cancelRowUpdates() 方法撤消修改操作。此调用仅适用于未使用 updateRow() 将数据重新写入到数据库的情况。
Content on this page is licensed under the Public Documentation License (PDL). |