Accesso ai database

From Apache OpenOffice Wiki
Jump to: navigation, search


Per accedere a un database è necessario un collegamento con il database, ovvero un canale di trasferimento che consente la comunicazione diretta con il database. A differenza delle sorgenti di dati presentate nella sezione precedente, il collegamento al database deve essere ristabilito ad ogni riavvio del programma.

Apache OpenOffice offre diversi modi di stabilire i collegamenti al database. Di seguito viene riportato un esempio del metodo basato su una sorgente di dati preesistente.

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

Il codice utilizzato nell'esempio controlla prima se il database è protetto da una password. In caso contrario, crea il collegamento al database richiesto utilizzando la chiamata GetConnection. Le due stringhe vuote nella riga di comando rappresentano il nome utente e la password.

Se il database è protetto da password, l'esempio crea un InteractionHandler e apre il collegamento al database mediante il metodo ConnectWithCompletion. L'InteractionHandler assicura che Apache OpenOffice richieda all'utente i dati di login necessari.

Iterazione delle tabelle

Per accedere a una tabella in Apache OpenOffice si procede generalmente dall'oggetto ResultSet. Un ResultSet è un tipo di marcatore che indica un gruppo corrente di dati all'interno di un volume di risultati ottenuti utilizzando il comando SELECT.

L'esempio mostra come utilizzare un ResultSet per ricercare i valori da una tabella del database.

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

Una volta stabilito il collegamento al database, il codice utilizzato nell'esempio utilizza prima la chiamata Connection.createObject per creare un oggetto Statement. L'oggetto Statement usa quindi la chiamata executeQuery per restituire il valore effettivo di ResultSet. Il programma controlla ora se ResultSet esiste effettivamente e vaglia i record di dati utilizzando un ciclo. I valori richiesti (nell'esempio, quelli dal campo CustomerNumber) restituiscono il ResultSet utilizzando il metodo getString mentre il parametro 1 determina che la chiamata è relativa ai valori della prima colonna.

Documentation note.png L'oggetto ResultSet di SDBC è paragonabile all'oggetto Recordset di DAO e ADO, dato che anch'esso fornisce un accesso iterativo a un database.
Documentation note.png In Apache OpenOffice si accede di fatto ai database tramite un oggetto ResultSet, che riflette il contenuto di una tabella o il risultato di un comando SQL-SELECT. In precedenza, l'oggetto ResultSet forniva i metodi residenti nell'oggetto Application per lo spostamento all'interno dei dati (ad esempio DataNextRecord).

Metodi specifici del tipo per richiamare i valori

Come illustrato dall'esempio della sezione precedente, Apache OpenOffice fornisce un metodo getString per accedere ai contenuti delle tabelle. Il risultato di questo metodo assume la forma di una stringa. Sono disponibili i seguenti metodi get:

getByte()
Supporta i tipi di dati SQL per numeri, caratteri e stringhe.
getShort()
Supporta i tipi di dati SQL per numeri, caratteri e stringhe.
getInt()
Supporta i tipi di dati SQL per numeri, caratteri e stringhe.
getLong()
Supporta i tipi di dati SQL per numeri, caratteri e stringhe.
getFloat()
Supporta i tipi di dati SQL per numeri, caratteri e stringhe.
getDouble()
Supporta i tipi di dati SQL per numeri, caratteri e stringhe.
getBoolean()
Supporta i tipi di dati SQL per numeri, caratteri e stringhe.
getString()
Supporta tutti i tipi di dati SQL.
getBytes()
Supporta i tipi di dati SQL per i valori binari.
getDate()
Supporta i tipi di dati SQL per numeri, stringhe, data e contrassegno dell'ora.
getTime()
Supporta i tipi di dati SQL per numeri, stringhe, data e contrassegno dell'ora.
getTimestamp()
Supporta i tipi di dati SQL per numeri, stringhe, data e contrassegno dell'ora.
getCharacterStream()
Supporta i tipi di dati SQL per numeri, stringhe e valori binari.
getUnicodeStream()
Supporta i tipi di dati SQL per numeri, stringhe e valori binari.
getBinaryStream()
Valori binari.
getObject()
Supporta tutti i tipi di dati SQL.

In tutti i casi, il numero di colonne dovrebbe essere elencato come parametro di cui ricercare i valori.

Le varianti ResultSet

La velocità è spesso un fattore critico per l'accesso ai database. Apache OpenOffice offre pertanto diversi modi per ottimizzare ResultSets e controllare quindi la velocità di accesso. Maggiore è il numero di funzioni fornito da ResultSet, più complessa sarà l'implementazione e di conseguenza più lente saranno le funzioni.

Un ResultSet, fornisce la gamma minima di funzioni disponibili. Consente di applicare l'iterazione solo in avanti e per i valori oggetto dell'interrogazione. Opzioni di navigazione più estese, quali la possibilità di modificare i valori, non sono pertanto incluse.

L'oggetto Statement utilizzato per creare il ResultSet fornisce alcune proprietà che consentono di incidere sulle funzioni del ResultSet:

ResultSetConcurrency (const)
Specifiche sulla possibilità di modificare o meno i dati (specifiche conformi a com.sun.star.sdbc.ResultSetConcurrency).
ResultSetType (const)
Specifiche riguardanti il tipo di ResultSets (specifiche conformi a com.sun.star.sdbc.ResultSetType).

I valori definiti in com.sun.star.sdbc.ResultSetConcurrency sono:

UPDATABLE
ResultSet consente di modificare i valori.
READ_ONLY
ResultSet non consente modifiche.

Il gruppo di costanti com.sun.star.sdbc.ResultSetConcurrency fornisce le seguenti specifiche:

FORWARD_ONLY
ResultSet consente solo lo spostamento in avanti.
SCROLL_INSENSITIVE
ResultSet consente qualsiasi tipo di spostamento, tuttavia le modifiche ai dati originali non sono registrate.
SCROLL_SENSITIVE
ResultSet consente qualsiasi tipo di spostamento; le modifiche ai dati originali incidono su ResultSet
Documentation note.png Un ResultSet contenente le proprietà READ_ONLY e SCROLL_INSENSITIVE corrisponde a un gruppo di record del tipo Snapshot in ADO e DAO.

Quando si utilizzano le proprietà ResultSet's UPDATEABLE e SCROLL_SENSITIVE, la portata della funzione di un ResultSet è paragonabile a un Dynaset di tipo Recordset di ADO e DAO.

Metodi per lo spostamento nei ResultSets

Se un ResultSet è di tipo SCROLL_INSENSITIVE o SCROLL_SENSITIVE supporta una serie completa di metodi di spostamento nel gruppo di dati. I metodi principali sono i seguenti:

next()
Spostamento al record di dati successivo.
previous()
Spostamento al record di dati precedente.
first()
Spostamento al primo record di dati.
last()
Spostamento all'ultimo record di dati.
beforeFirst()
Spostamento a prima del primo record di dati.
afterLast()
Spostamento a dopo l'ultimo record di dati.

Tutti i metodi restituiscono un parametro booleano (logico) che specifica se lo spostamento ha avuto successo.

Per determinare la posizione corrente del cursore, sono disponibili i seguenti metodi di test, che restituiscono tutti un valore logico:

isBeforeFirst()
ResultSet è prima del primo record di dati.
isAfterLast()
ResultSet è dopo l'ultimo record di dati.
isFirst()
ResultSet è il primo record di dati.
isLast()
ResultSet è l'ultimo record di dati.

Modifica dei record di dati

Se è stato creato un ResultSet con il valore ResultSetConcurrency = UPDATEABLE, il suo contenuto può essere modificato. Ciò è applicabile solo finché il comando SQL consente di riscrivere i dati nel database (dipende dal principio). Non è ad esempio possibile con i comandi SQL complessi con colonne collegate o valori accumulati.

L'oggetto ResultSet fornisce i metodi Update per la modifica dei valori, che sono strutturati nello stesso modo dei metodi get per il richiamo dei valori. Il metodo updateString, ad esempio, consente di scrivere una stringa.

Dopo la modifica, i valori devono essere trasferiti nel database utilizzando il metodo updateRow(). La chiamata dovrà aver luogo prima del comando di navigazione successivo, altrimenti i valori andranno persi.

Se viene commesso un errore durante le modifiche, è possibile procedere all'annullamento utilizzando il metodo cancelRowUpdates(). Questa chiamata è disponibile solo se i dati non sono stati sovrascritti nel database mediante updateRow().

Content on this page is licensed under the Public Documentation License (PDL).


Personal tools