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#

Print | posted on giovedì 11 ottobre 2007 18:35

Feedback

# Binding su PicturBox con Oggetto OLE di Access - MasterDrive.it

Left by Pingback/TrackBack at 06/06/2007 02:33
Gravatar Binding su PicturBox con Oggetto OLE di Access - MasterDrive.it

# re: Gestione del DataBinding con Oggetto Ole con Access e Visual Studio 2005

Left by Matteo Neri at 06/06/2007 14:40
Gravatar Buon Post ora mi guardo il codice vb.net

# Archiviare File in un Database (access, sql...) - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 11/10/2007 18:36
Gravatar Archiviare File in un Database (access, sql...) - MasterDrive.it - Information Technology Developers Community

Your comment:





 
Please add 4 and 4 and type the answer here:

Copyright © Luciano Bastianello

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski