Prendendo spunto da una discussione, ma anche da un mio problema personale proprio su questo argomento, ho pensato che fosse opportuno fissare un paio di appunti e di precisazioni, in particolare sull’uso del Provider JET 4.0 per l’accesso ai database in formato Access 2007 e sul problema del sistema operativo Windows Vista a 64 bit.
Partiamo dal caso dei 64 bit. Come molti sapranno, Vista è distribuito in due edizioni: a 32 bit, che è la piattaforma che molti di noi sono abituati ad utilizzare da molto tempo, e a 64 bit. Prossimamente, le nuove versioni di Windows arriveranno esclusivamente a 64 bit e quindi ci dobbiamo abituare a convivere con questa nuova piattaforma, con le sue particolarità.
Il problema deriva dal fatto che Windows Vista a 64 bit non supporta JET 4.0, in quanto questo provider dati è fornito solo a 32 bit.
Le alternative per risolvere questo problema sono sostanzialmente due:
- evitare di utilizzare Access e orientarsi direttamente all’uso di SQL Server Express, Compact o edizioni superiori (consigliato!);
- compilare il progetto Visual Basic 2008 o Visual C# 2008 con il solo supporto per la piattaforma x86 (cioè a 32 bit).
Per questa seconda possibilità, dobbiamo eseguire i seguenti passi:
- fare click con il pulsante destro del mouse sul nome del progetto e scegliere “Proprietà”;
- passare alla scheda “Compilazione”;
- fare click sul pulsante “Opzioni di compilazione avanzate”;
- nella combo “CPU di destinazione” selezionare “x86″, anziché “AnyCPU”.
A questo punto potremo eseguire l’applicazione anche su Vista a 64 bit, tenendo però conto che la nostra applicazione non sarà compilata a 64 bit ma bensì a 32 bit. Questo potrebbe comportare qualche problema nel futuro, se Microsoft deciderà prima o poi di chiudere il supporto ai 32 bit sui sistemi operativi a 64 bit.
Vediamo ora come si utilizza il provider JET 4.0 per Access: in particolare le stringhe di connessione ai database Access cambiano a seconda che utilizziamo Access 2003 o Access 2007:
' Access 2003:
Dim stringaconn As String = _
"Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & _
"c:\test\prova2.mdb"
' Access 2007:
Dim stringaconn As String = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=c:\test\prova2.accdb;" & _
"Persist Security Info=False;"
Per maggiori dettagli sulle stringhe di connessione di ciascun provider dati (anche non-Access), date un’occhiata al sito www.connectionstrings.com.
Scriviamo quindi il programma finale per inserire un record in una tabella Access (2003 o 2007):
- creiamo un nuovo progetto in Visual Basic 2008;
- nel form predefinito aggiungiamo due TextBox di nome txtCognome e txtNome, nonché un pulsante per eseguire il frammento di codice;
- inserire il seguente codice a livello di form (di nome Form1):
Imports System.Data.OleDb
Public Class Form1
Private Sub cmdInserisci_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdInserisci.Click
' Access 2003:
'Dim stringaconn As String = _
' "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & _
' "c:\test\prova2.mdb"
' Access 2007:
Dim stringaconn As String = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=c:\test\prova2.accdb;" & _
"Persist Security Info=False;"
Dim objconn As New OleDbConnection(stringaconn)
objconn.Open()
Dim stringasql As String = _
"Insert into prova2(Cognome,Nome) " & _
"values(@cognome, @nome)"
Dim objcomm As New OleDbCommand(stringasql, objconn)
objconn = New OleDbConnection(stringaconn)
objconn.Open()
objcomm = New OleDbCommand(stringasql, objconn)
objcomm.Parameters.Add(New OleDbParameter("@cognome", _
Me.txtCognome.Text))
objcomm.Parameters.Add(New OleDbParameter("@nome", _
Me.txtNome.Text))
Try
Dim righeAggiornate As Integer = objcomm.ExecuteNonQuery
If righeAggiornate = 1 Then MessageBox.Show("tutto bene")
Catch ex As Exception
MessageBox.Show(ex.Message & _
Environment.NewLine & ex.StackTrace, "Errore")
Finally
objconn.Close()
Me.txtCognome.Text = ""
Me.txtNome.Text = ""
Me.txtCognome.Focus()
End Try
End Sub
End Class
Naturalmente, per utilizzare alternativamente Access 2003 o Access 2007, è sufficiente commentare/decommentare la definizione della stringa di connessione opportuna.