数据库访问

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo
Book.png


要访问数据库,需要建立数据库连接。这是一个传输通道,它允许直接与数据库进行通信。与上一节中介绍的数据源不同,每次重新启动程序时都必须重新建立数据库连接。

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 由此确定调用与第一列中的值有关。

Documentation note.png SDBC 中的 ResultSet 对象相当于 DAO 和 ADO 中的 Recordset 对象,因为它也提供了对数据库的迭代访问。
Documentation note.png 在 Apache OpenOffice 中,数据库实际是通过 ResultSet 对象访问的。它反映了表格内容或 SQL-SELECT 命令结果。过去,ResultSet 对象在 Application 对象中提供了用于浏览数据的驻留方法,例如,DataNextRecord

用于检索值的特定于类型的方法

正如在上一节的示例中所看到的一样,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
Documentation note.png 包含 READ_ONLYSCROLL_INSENSITIVE 属性的 ResultSet 对应于 ADO 和 DAO 中的 Snapshot 类型的记录集。

在使用 ResultSet's UPDATEABLESCROLL_SENSITIVE 属性时,ResultSet 的函数范围相当于 ADO 和 DAO 中的 Dynaset 类型的 Recordset

ResultSet 中的浏览方法

如果 ResultSetSCROLL_INSENSITIVESCROLL_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).
Personal tools