Vediamo se riesco a decifrare il codice per inserire un record nella tabella del database.
L'ho scritto.
Imports System.Data.OleDb
Public Class Form1
Dim con As New OleDb.OleDbConnection
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
con.ConnectionString = "Provider=microsoft.jet.oleDB.4.0;" &
"data source=C:\Users\Antonello\Documents\tavoloDB.mdb"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "INSERT INTO Tabella (nome,cognome) VALUES('BINGO','BONGO')"
cmd.ExecuteNonQuery()
con.Close()
End Sub
End Class
Ora distruggo il mandala e lo ricostruisco una prima volta.
Ecco la mia ricostruzione:
Imports System.Data.OleDb
Public Class Form1
Dim con As New OleDb.OleDbConnection
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
con.ConnectionString = "Provider=microsoft.jet.oleDB.4.0;" &
"data source=C:\Users\Antonello\Documents\tavoloDB.mdb"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "INSERT INTO Tabella(nome,cognome) VALUES('PINCO', 'PALLINO')"
cmd.ExecuteNonQuery()
con.Close()
End Sub
End Class
In rosso, la riga che ho dimenticato, ottenendo il risultato "connessione non inizializzata".
Ripeto il Mandala:
Imports System.Data.OleDb
Public Class Form1
Dim con As New OleDb.OleDbConnection
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
con.ConnectionString = "Provider=microsoft.jet.oleDB.4.0;" &
"data source=C:\users\antonello\documents\tavoloDB.mdb"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "INSERT INTO Tabella(nome,cognome) VALUES('TIZIO','CAIO')"
cmd.ExecuteNonQuery()
con.Close()
End Sub
End Class
Questa volta me la sono cavata solo con un errore di sintassi SQL nel CommandText (VALUE al posto di VALUES).
Ora provo a cambiare il comando SQL per vedere se posso updatare piuttosto che inserire un nuovo dato.
Ecco:
Imports System.Data.OleDb
Public Class Form1
Dim con As New OleDb.OleDbConnection
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
con.ConnectionString = "Provider=microsoft.jet.oleDB.4.0;" &
"data source=C:\users\antonello\documents\tavoloDB.mdb"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "UPDATE Tabella2 SET nome = 'ABDULLAH'," &
"cognome ='AKBAR' WHERE id=2;"
cmd.ExecuteNonQuery()
con.Close()
End Sub
End Class
Ho dovuto creare una nuova tabella con il contatore chiamato id perché con l'underscore _id ottenevo un messaggio di errore nella clausola WHERE. Dunque in Access l'underscore non è ammesso, diversamente da quanto accade in Java Android dove è consigliabile.
Questo codice ha funzionato!
Ora su questa tabella di database:
id nome cognome
1 MARIO ROSSI
2 ABDULLAH AKBAR
3 GIUSEPPE VERDI
4 CICCIO PAGNOTTA
5 JOE FETECCHIA
faccio un esercizio: aggiungere PIPPO CAROGNA e sostituire il nome arabo con un nome greco.
Vai!
Ho provato:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "INSERT INTO Tabella2(nome, cognome) VALUES('PIPPO','CAROGNA')"
cmd.ExecuteNonQuery()
cmd.CommandText = "UPDATE Tabella SET nome='MIKIS',cognome='PARALIRIGORIS'" &
"WHERE id=2"
cmd.ExecuteNonQuery()
con.Close()
End Sub
ma ottengo errore. Il primo comando me lo esegue, quindi probabilmente il problema sta nel secondo comando. Forse sbaglio qualcosa nell'esecuzione in serie di più comandi.
Ecco, forse ho capito: devo dichiarare come New anche il secondo comando.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "INSERT INTO Tabella2(nome, cognome) VALUES('PIPPO','CAROGNA')"
cmd.ExecuteNonQuery()
Dim cmd2 As New OleDb.OleDbCommand
cmd2.Connection = con
cmd2.CommandText = "UPDATE Tabella2 SET nome='MIKIS',cognome='PARALIRIGORIS'" &
" WHERE id=2"
cmd2.ExecuteNonQuery()
con.Close()
End Sub
Ho trovato questa soluzione. Non capisco perché non posso usare la variabile cmd per i due comandi...
Comunque la tabella è cambiata:
id nome cognome
1 MARIO ROSSI
2 MIKIS PARALIRIGORIS
3 GIUSEPPE VERDI
4 CICCIO PAGNOTTA
5 JOE FETECCHIA
12 PIPPO CAROGNA
Rimetto un altro nome al numero 2, cancello l'ultimo record (il fatto che riporta l'id = 12 testimonia i vari tentativi con ripetute cancellazioni del record che era stato aggiunto), e riprovo.
Provo così:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "INSERT INTO Tabella2(nome, cognome) VALUES('PIPPO','CAROGNA')"
cmd.ExecuteNonQuery()
cmd = New OleDb.OleDbCommand
cmd.CommandText = "UPDATE Tabella2 SET nome='GIULIO',cognome='CESARE'" &
" WHERE id=2"
cmd.ExecuteNonQuery()
con.Close()
...e ottengo l'errore
La proprietà connection non è stata inizializzata.
Allora la inizializzo.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "INSERT INTO Tabella2(nome, cognome) VALUES('PIPPO','CAROGNA')"
cmd.ExecuteNonQuery()
cmd = New OleDb.OleDbCommand
cmd.Connection = con
cmd.CommandText = "UPDATE Tabella2 SET nome='GIULIO',cognome='CESARE'" &
" WHERE id=2"
cmd.ExecuteNonQuery()
con.Close()
End Sub
Non ho avuto messaggi di errore.
Ora vediamo la tabella:
id nome cognome
1 MARIO ROSSI
2 GIULIO CESARE
3 GIUSEPPE VERDI
4 CICCIO PAGNOTTA
5 JOE FETECCHIA
13 PIPPO CAROGNA
14 PIPPO CAROGNA
Perfetto! La duplicazione di PIPPO CAROGNA è dovuta al fatto che ho dimenticato di eliminare il record aggiunto quando l'esecuzione è stata interrotta per il primo errore.
Ho dimenticato una clausola WHERE nell'UPDATE, e mi ha updatato tutti i records con un solo valore. Cancello manualmente e ricostruisco la tabella a mano (gli ID sono tutti sbagliati).
Ecco la nuova tabella:
id nome cognome
16 MARIO ROSSI
17 GIULIO CESARE
18 GIUSEPPE VERDI
19 CICCIO PAGNOTTA
20 JOE FETECCHIA
21 PIPPO CAROGNA
Ora vediamo con questo codice:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Not con.State = ConnectionState.Open Then
con.Open()
End If
Dim cmd As New OleDb.OleDbCommand("INSERT INTO Tabella2(nome,cognome) VALUES('ANTONIO','CICCETTI')", con)
Dim cmd2 As New OleDb.OleDbCommand("UPDATE Tabella2 SET nome='YOUSSEF',cognome='KHANZIR'" &
" WHERE id=17", con)
cmd.ExecuteNonQuery()
cmd2.ExecuteNonQuery()
con.Close()
End Sub
Vediamo...
id nome cognome
16 MARIO ROSSI
17 YOUSSEF KHANZIR
18 GIUSEPPE VERDI
19 CICCIO PAGNOTTA
20 JOE FETECCHIA
21 PIPPO CAROGNA
23 ANTONIO CICCETTI
Ho dovuto cambiare da 2 a 17 per via del casino che ho combinato con gli ID cancellando e riscrivendo manualmente.