Imports MySql.Data.MySqlClient
Imports DataSet_Tipizzati.AuthorViewer
Public Class Form1
Private WithEvents avAuthor As New AuthorViewer
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim Conn As New MySqlConnection("server=localhost;database=appdata;user=root;password=miapassword;")
Dim Adapter As New MySqlDataAdapter
Conn.Open()
'carica le tabelle nel dataset. Le tabelle sono ora
'accessibili mediante omonime proprietà
'dataset tipizzato
Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Songs;", Conn)
Adapter.Fill(AppDataSet.Songs)
Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Authors;", Conn)
Adapter.Fill(AppDataSet.Authors)
Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Albums;", Conn)
Adapter.Fill(AppDataSet.Albums)
Conn.Close()
End Sub
Private Sub lb_songs_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lb_songs.SelectedIndexChanged
If lb_songs.SelectedIndex < 0 Then
Exit Sub
End If
'Trova la riga con ID specificato. Il tipo SongRow è stato
'definito dall'IDE durante la creazione del dataset tipizzato.
Dim S As AppDataSet.SongsRow = AppDataSet.Songs.FindByID(lb_songs.SelectedValue)
lbName.Text = S.Title
tabAuthor.Tag = Nothing
'Anche il metodo IsAuthorNull è stato definito dall'IDE.
'In generale, per ogni proprietà per cui non è stata
'specificata la clausola NOT NULL, l'IDE crea un metodo per
'verificare se quel dato attributo contiene un valore
'nullo. Equivale a chamare S.IsNull(3).
If Not S.IsAuthorNull() Then
'Ottiene un array che contiene tutte le righe della
'tabella Authors che soddisfano la relazione definita
'tra Songs e Authors. Dato che la chiave esterna della tabella figlio era un ID,
'la relazione, pur essendo tericamente uno-a-molti, è in realtà uno-a-uno. Perciò, se questo array
'ha almeno un elemento, ne avrà solo uno.
Dim Authors() As AppDataSet.AuthorsRow = S.GetAuthorsRows()
'Come IsNull, questo metodo equivale a chiamare
'S.GetChildRows("Songs_Authors")
'Imposta la proprietà Author del controllo avAuthor,
'che non è altro che un'istanza di AuthorViewer,
'il controllo utente crato ad hoc
If Authors.Length > 0 Then
Dim Author As AppDataSet.AuthorsRow = Authors(0)
avAuthor.Author = Author
Else
avAuthor.Author = Nothing
End If
End If
tabAlbum.Tag = Nothing
If Not S.IsAlbumNull Then
Dim Albums() As AppDataSet.AlbumsRow = S.GetAlbumsRows
If Albums.Length > 0 Then
Dim Album As AppDataSet.AlbumsRow = Albums(0)
lbAlbumName.Text = Album.Name
If Not Album.IsYearNull Then
lbYear.Text = Album.Year
Else
lbYear.Text = ""
End If
If Not Album.IsImageNull Then
imgAlbum.Image = Image.FromFile(Album.Image)
Else
imgAlbum.Image = Nothing
End If
If Not Album.IsDescriptionNull Then
tbAlbumDescription.Text = Album.Description
Else
tbAlbumDescription.Text = ""
End If
tabAlbum.Tag = Album.ID
End If
End If
End Sub
Private Sub btSearch_Click(sender As System.Object, e As System.EventArgs) Handles btSearch.Click
If Not String.IsNullOrEmpty(tbSearch.Text) Then
'la proprietà Filter di un binding source è come
'una condizione SQL. In questo caso cerchiamo tutte le
'canzoni il cui titolo contenga la stringa specificata
SongsBindingSource.Filter = String.Format("title like '%{0}%'", tbSearch.Text)
Else
SongsBindingSource.Filter = ""
End If
End Sub
Private Sub avAuthor_AuthorAdded(sender As Object, e As System.EventArgs) Handles avAuthor.AuthorAdded
If lb_songs.SelectedIndex < 0 Then
Exit Sub
End If
Dim S As AppDataSet.SongsRow = AppDataSet.Songs.FindByID(lb_songs.SelectedValue)
'imposta il campo Author della canzone corrente
S.Author = avAuthor.Author.ID
End Sub
Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Dim Conn As New MySqlConnection("server=localhost;database=appdata;user=root;password=miapassword;")
Dim Adapter As New MySqlDataAdapter
'Un oggetto di tipo CommandBuilder genera automaticamente
'tutti le istruzioni update, INSERT IGNORE e delete che servono
'a un adapter per funzionare. Tali istruzioni vengono
'generate relativamente alla tabella dalla quale si stanno
'caricando i dati
Dim Builder As MySqlCommandBuilder
Conn.Open()
Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Songs;", Conn)
Builder = New MySqlCommandBuilder(Adapter)
Adapter.Update(AppDataSet.Songs)
Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Authors;", Conn)
Builder = New MySqlCommandBuilder(Adapter)
Adapter.Update(AppDataSet.Authors)
Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Albums;", Conn)
Builder = New MySqlCommandBuilder(Adapter)
Adapter.Update(AppDataSet.Albums)
Conn.Close()
End Sub
End Class