martedì 5 giugno 2007

Gestione del DataBinding con Oggetto Ole con Access e Visual Studio 2005

Gestire il datatabinding su Access è veramente un gioco da ragazzi :))


Si comincia con generare un nuovo progetto Windows Forms, si aggiunge un database Access, si apre il wizard si sceglie la tabella.
Se non ci sono problemi nella definizione della tabella come la PK mancante con pochissimi click si ottiene un dataset e un tableadapter perfettamente configurati.

Per il mio esempio ho utilizzato il database Northwind e, al suo interno  la tabella Employees,  Nortwind è liberamente scaricabile, il link per il download è presente tra i Riferimenti in fondo a questo post. 

E' necessario poi compilare il progetto per veder comparire nella toolbar il DataSet tipizzato NwindDataSet e il TableAdapter EmployeesTableAdapter.
Posizioniamo i due controlli sul form, da me rinominati  dsNwind e employeeTbAdapter e successivamente i campi della tabella selezionandoli dai "data sources" con esclusione dell'immagine che dovrà apparire in un picturebox posizionato appositamente dalla toolbar.

Passaggio difficile: intercettare l'evento di cambiamento di posizione del binding, per questo è necessario aggiungere e gestire un nuovo evento BindingPositionChanged:

this.employeesBindingSource.PositionChanged += new EventHandler(employeesBindingSource_PositionChanged);

Ed ovviamente il relativo gestore:


void employeesBindingSource_PositionChanged(object sender, EventArgs e)
{
// Prendiamo il codice
int employeeId = (int)dsNwind.Employees.Rows[employeesBindingSource.Position]["EmployeeID"];

// Creiamo una connessione rubacchiando i parametri dalla connessione "ufficiale"
System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection();
cn.ConnectionString
= employeesTbAdapter.Connection.ConnectionString;

// Generiamo un command per recuperare l'immagine

OleDbCommand cm
= new OleDbCommand("SELECT Photo FROM Employees WHERE EmployeeID = ?",cn);
cm.Parameters.Add(
new OleDbParameter("EmployeeID", employeeId));
try
{
// Recuperiamo l'immagine dal database
cn.Open();
Byte[] immagine
= (Byte[])cm.ExecuteScalar();
// Scriviamo lo stream rimuovendo i 78 caratteri di offset che access mette automaticamente.
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
ms.Write(immagine, OFFSET, immagine.Length
- OFFSET);
// Load the image into the PictureBox from the stream.
employeePicture.Image = Image.FromStream(ms);
ms.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message
+ Environment.NewLine + ex.StackTrace);
}
finally
{
if (cn.State == ConnectionState.Open)
cn.Close();
}

}



Come si può notare è utilizzato ExecuteScalar che restituisce il blob sotto forma di array di bytes.
Non si tratta di una immagine immediatamente utilizzabile perchè contiene 78 caratteri di intestazione che devono essere rimossi.
A questo proposito utilizziamo  MemoryStream.Write passandogli come argomento l'immagine, la posizione iniziale ed il numero di bytes.


Riferimenti:


Download Access Northwind
Esempio VB.NET
Esempio C#

Nessun commento: