PDA

View Full Version : Visual Studio 2017 - Problema SELECT


AndreB82
29-03-2019, 16:11
Ciao a tutti,
sto realizzando un programmino in cui vorrei alimentare due tabelle. Nella prima ad ogni inserimento di un record in una Form si viene a creare un record. Nella seconda invece è necessario controllare l'esistenza di un preciso codice e poi o aggiornare il corrispondente record o altrimenti inserirne uno nuovo.

Ho iniziato a lavorare al codice, non ricevo alcun errore di debug, ma al momento di eseguire il record non viene mai aggiunto nella tabella, ma il codice salta direttamente al "Catch ex As Exception".

Vi riporto il codice di seguito. Qualcuno può aiutarmi?

Grazie,
Andrea


Imports System.Data.OleDb
Public Class Form4
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim connString As String
Dim ricerca As String
Dim drGiocatore As OleDbDataReader
Dim myConnection As OleDbConnection = New OleDbConnection

'Connessione e trasmissione dati a DB
connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " & Application.StartupPath & "\DBGiocatori.accdb"
myConnection.ConnectionString = connString
myConnection.Open()
Dim str As String
str = "INSERT INTO [Tbl_Partite]([Nome_Giocatore],[Cognome_Giocatore],[Anno_di_nascita],[Luogo_di_nascita],[Codice_giocatore],[Statura],[Coordinazione],[Voto_Coordinazione],[Velocità],[Voto_Velocità], [Resistenza],[Voto_Resistenza], [Forza],[Voto_Forza]VALUES(@NGio,@CGio,@AnnoNasc,@LuogoNasc,@CodGio, @Stat,@Coord,@VCoord,@Vel,@VVel,@Res,@VRes,@For,@VFor)"
ricerca = "SELECT [Codice_giocatore] FROM [Tbl_Giocatore] WHERE [Codice_giocatore] = @CodGio"
Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
Dim objcomm As OleDbCommand = New OleDbCommand(ricerca, myConnection)
cmd.Parameters.Add(New OleDbParameter("@NGio", CType(TextBox4.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@CGio", CType(TextBox5.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@AnnoNasc", CType(TextBox6.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@LuogoNasc", CType(TextBox7.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@CodGio", CType(TextBox57.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@Stat", CType(TextBox16.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@Coord", CType(TextBox17.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@VCoord", CType(TextBox53.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@Vel", CType(TextBox19.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@VVel", CType(TextBox55.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@Res", CType(TextBox18.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@VRes", CType(TextBox54.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@For", CType(TextBox20.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@VFor", CType(TextBox56.Text, String)))

Try
cmd.ExecuteNonQuery()
MsgBox(TextBox5.Text & " - correttamente salvato")
drGiocatore = objcomm.ExecuteReader()
drGiocatore.Read()

If drGiocatore.HasRows = True Then
MsgBox("Trovato")
ElseIf drGiocatore.HasRows = False Then
MsgBox("Non trovato")
End If

myConnection.Close()


TextBox16.Text = ""
TextBox17.Text = ""
TextBox18.Text = ""
TextBox19.Text = ""
TextBox20.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox53.Text = ""
TextBox54.Text = ""
TextBox55.Text = ""
TextBox56.Text = ""
TextBox57.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""

Catch ex As Exception
Dim nuovoCod As String
nuovoCod = "INSERT INTO [Tbl_Partite]([Codice_Giocatore],[Nome_Giocatore],[Cognome_Giocatore]) VALUES (@CodGio,@NGio,@CGio)"
MsgBox("Nuovo record inserito nella tabella Giocatori")
End Try

Form3.Show()

Dim visible3 As Object = Form3.Visible

If visible3 Then
Me.Hide()
End If

End Sub
End Class

sottovento
30-03-2019, 04:45
str = "INSERT INTO [Tbl_Partite]([Nome_Giocatore],[Cognome_Giocatore],[Anno_di_nascita],[Luogo_di_nascita],[Codice_giocatore],[Statura],[Coordinazione],[Voto_Coordinazione],[Velocità],[Voto_Velocità], [Resistenza],[Voto_Resistenza], [Forza],[Voto_Forza]VALUES(@NGio,@CGio,@AnnoNasc,@LuogoNasc,@CodGio, @Stat,@Coord,@VCoord,@Vel,@VVel,@Res,@VRes,@For,@VFor)"


Non hai chiuso la parentesi tonda prima di VALUES

AndreB82
30-03-2019, 12:12
Grazie mille sottovento.
Quel problema è un problema di copiatura del codice, in realtà su Visual Studio quel controllo funziona benissimo e il programma inserisce il nuovo record in quella tabella.

Il mio problema è la verifica se il parametro @CodGio esista già nell'altra tabella e nel caso esiste si faccia l'update dei valori, mentre nel caso non esiste il programma lo inserisca.

Probabilmente sbaglio la sequenza degli eventi. Potete aiutarmi?

Grazie,
A.

CopyL3ft
30-03-2019, 17:56
Provando ad eseguire il codice, l'eccezione recita "Nessun valore specificato per alcuni parametri necessari".
Infatti controllando il codice, per il comando objcomm, che fa capo alla select "ricerca", non viene aggiunto il parametro.
Basta fare
objcomm.Parameters.Add(New OleDbParameter("@CodGio", CType(TextBox57.Text, String)))

prima di eseguire il comando, e funziona.

AndreB82
31-03-2019, 00:29
Grazie mille CopyL3ft!
Funziona con le modifiche che riporto di seguito.

Ho però il seguente problema ora: eseguendo in debug il codice ogni volta mi va a sovrascrivere sia il record sulla tabella Partite che sulla tabella Giocatori.
Il programma è composto di una Form di inserimento dati (Form 3) e, al seguito della pressione sul tasto "Salva" di una Form (la 4) in cui viene eseguito proprio il codice sotto dopo che i dati sono stati copiati dalla Form 3. Preciso che non posso salvare direttamente dalla Form 3 perchè in questa importo i dati da file excel e i comandi Imports System.Data.OleDb
e Imports Microsoft.Office.Interop mi danno errore se inseriti nella stessa Form.

Sapete dirmi come mai questo comportamento? E' normale dato che sono in modalità Debug?

Grazie,
A.


Imports System.Data.OleDb
Public Class Form4
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim connString As String
Dim ricerca As String
Dim drGiocatore As OleDbDataReader
Dim myConnection As OleDbConnection = New OleDbConnection

'Connessione e trasmissione dati a DB
connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " & Application.StartupPath & "\DBGiocatori.accdb"
myConnection.ConnectionString = connString
myConnection.Open()
Dim str As String
str = "INSERT INTO [Tbl_Partite]([Nome_Giocatore],[Cognome_Giocatore],[Anno_di_nascita],[Luogo_di_nascita],[Codice_giocatore],[Statura],[Coordinazione],[Voto_Coordinazione],[Velocità],[Voto_Velocità], [Resistenza],[Voto_Resistenza], [Forza],[Voto_Forza]VALUES(@NGio,@CGio,@AnnoNasc,@LuogoNasc,@CodGio, @Stat,@Coord,@VCoord,@Vel,@VVel,@Res,@VRes,@For,@VFor)"
ricerca = "SELECT [Codice_giocatore] FROM [Tbl_Giocatore] WHERE [Codice_giocatore] = @CodGio"
Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
Dim objcomm As OleDbCommand = New OleDbCommand(ricerca, myConnection)
cmd.Parameters.Add(New OleDbParameter("@NGio", CType(TextBox4.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@CGio", CType(TextBox5.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@AnnoNasc", CType(TextBox6.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@LuogoNasc", CType(TextBox7.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@CodGio", CType(TextBox57.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@Stat", CType(TextBox16.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@Coord", CType(TextBox17.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@VCoord", CType(TextBox53.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@Vel", CType(TextBox19.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@VVel", CType(TextBox55.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@Res", CType(TextBox18.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@VRes", CType(TextBox54.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@For", CType(TextBox20.Text, String)))
cmd.Parameters.Add(New OleDbParameter("@VFor", CType(TextBox56.Text, String)))
objcomm.Parameters.Add(New OleDbParameter("@CodGio", CType(TextBox57.Text, String)))

Try
cmd.ExecuteNonQuery()
MsgBox(TextBox5.Text & " - correttamente salvato")
drGiocatore = objcomm.ExecuteReader()
drGiocatore.Read()

If drGiocatore.HasRows = True Then
MsgBox("Trovato")
ElseIf drGiocatore.HasRows = False Then
nuovoCod = "INSERT INTO [Tbl_Giocatore]([Codice_Giocatore],[Nome_Giocatore],[Cognome_Giocatore]) VALUES (@CodGio,@NGio,@CGio)"
Dim inscod As OleDbCommand = New OleDbCommand(nuovoCod, myConnection)
inscod.Parameters.Add(New OleDbParameter("@CodGio", CType(TextBox57.Text, String)))
inscod.Parameters.Add(New OleDbParameter("@NGio", CType(TextBox4.Text, String)))
inscod.Parameters.Add(New OleDbParameter("@CGio", CType(TextBox5.Text, String)))
inscod.ExecuteNonQuery()
MsgBox("Nuovo record inserito nella tabella Giocatori")
End If

myConnection.Close()


TextBox16.Text = ""
TextBox17.Text = ""
TextBox18.Text = ""
TextBox19.Text = ""
TextBox20.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox53.Text = ""
TextBox54.Text = ""
TextBox55.Text = ""
TextBox56.Text = ""
TextBox57.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""

Catch ex As Exception
MessageBox.Show(ex.Message + " " & Environment.NewLine & " " & ex.StackTrace)
End Try

Form3.Show()

Dim visible3 As Object = Form3.Visible

If visible3 Then
Me.Hide()
End If

End Sub
End Class