PDA

View Full Version : [VB] Query con variabile


Lu Pier
10-03-2011, 13:55
Salve,
con Visual Studio sto creando una semplice applicazione ma ho un problema con una query.

Ho creato questo con il "Generatore di query" :
SELECT ID, [data inizio_fase], fase, periodo_durata, [output], verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id
FROM sviluppo
WHERE (fr_id = 2)

ma vorrei che il 2 fosse sostituito con una variabile globale che ho cosi dichiarato in un modulo:
Module Module1
Public key As Integer
End Module

Qualcuno sa come aiutarmi?

jackk87
10-03-2011, 14:04
Ciao presumo che sia VB.NET con DB access se mi sbaglio correggimi..la prossima volta specifica il linguaggio e il db che usi comunque da vb.net puoi eseguire la query così:

Dim sql as string

sql="SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"WHERE fr_id = " & key

Lu Pier
10-03-2011, 14:10
Ciao presumo che sia VB.NET con DB access se mi sbaglio correggimi..la prossima volta specifica il linguaggio e il db che usi comunque da vb.net puoi eseguire la query così:

Dim sql as string

sql="SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"WHERE fr_id = " & key


Ora provo.

P.S. Hai ragione, è VB.NET con DB Access.

Lu Pier
10-03-2011, 14:31
Mettendo un punto di interruzione ho visto che la query è corretta ma senza il generatore di query non so come popolare le textbox.

jackk87
10-03-2011, 14:34
Mettendo un punto di interruzione ho visto che la query è corretta ma senza il generatore di query non so come popolare le textbox.

spiega quello che vuoi fare dalla tua applicazione e posta un pò di codice che utilizzi altrimenti nn posso aiutarti

Lu Pier
10-03-2011, 14:43
C è poco codice visto che ho fatto la connessione al database access tramite il Wizard di Visual Studio.

Questo è il form

http://img222.imageshack.us/img222/1311/catturapp.jpg

Voglio popolare le textbox alla pressione del tasto in alto "Query"

jackk87
10-03-2011, 14:55
non ho mai utilizzato il wizard di visual studio di solito faccio tutto da codice in questo modo:

Module Module1
'Percorso del DataBase
Dim PercorsoDB As String = "dati.mdb"

'Stringa di Connessione
Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & PercorsoDB

'Connessione alla stringa
Dim Cn As New OleDbConnection(ConnString)
End Module



dim sql as string

sql="SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"WHERE fr_id = " & key

Cn.Open()
Dim cmd As New OleDbCommand(sql, Cn)

Dim dr As OleDbDataReader = cmd.ExecuteReader
dr.Read()
textbox1.Text = dr.Item("id")
texbox2.text= dr.Item("data inizio_fase")
...
texbox3.text=dr.item("fr_id")
dr.Close()

Cn.Close()

Lu Pier
10-03-2011, 15:04
non ho mai utilizzato il wizard di visual studio di solito faccio tutto da codice in questo modo:

Module Module1
'Percorso del DataBase
Dim PercorsoDB As String = "dati.mdb"

'Stringa di Connessione
Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & PercorsoDB

'Connessione alla stringa
Dim Cn As New OleDbConnection(ConnString)
End Module



dim sql as string

sql="SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"WHERE fr_id = " & key

Cn.Open()
Dim cmd As New OleDbCommand(sql, Cn)

Dim dr As OleDbDataReader = cmd.ExecuteReader
dr.Read()
textbox1.Text = dr.Item("id")
texbox2.text= dr.Item("data inizio_fase")
...
texbox3.text=dr.item("fr_id")
dr.Close()

Cn.Close()


Ho fatto una prova veloce con una textbox è funziona!
Ti ringrazio però ho dichiarato le variabile nel modulo come "public" e non come "dim" perchè diversamente non funzionava.

jackk87
10-03-2011, 19:20
Ho fatto una prova veloce con una textbox è funziona!
Ti ringrazio però ho dichiarato le variabile nel modulo come "public" e non come "dim" perchè diversamente non funzionava.

Se intendi quelle nel modulo si è stata una mia distrazione :doh:

Lu Pier
11-03-2011, 08:04
Se intendi quelle nel modulo si è stata una mia distrazione :doh:

e se la query generasse più risultati come li gestisco?

jackk87
11-03-2011, 10:53
e se la query generasse più risultati come li gestisco?

Semplice utilizzi un ciclo while così però poi devi modificare il codice su dove inserire i dati:

dim sql as string

sql="SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"WHERE fr_id = " & key

Cn.Open()
Dim cmd As New OleDbCommand(sql, Cn)

Dim dr As OleDbDataReader = cmd.ExecuteReader

WHILE dr.Read()
textbox1.Text = dr.Item("id")
texbox2.text= dr.Item("data inizio_fase")
...
texbox3.text=dr.item("fr_id")
END WHILE
dr.Close()

Cn.Close()

Lu Pier
12-03-2011, 09:35
WHILE dr.Read()
textbox1.Text = dr.Item("id")
texbox2.text= dr.Item("data inizio_fase")
...
texbox3.text=dr.item("fr_id")
END WHILE
dr.Close()

Cn.Close()


ovviamente così scrive più risultati nella stessa textbox.
Conviene usare un datagrid giusto?

jackk87
12-03-2011, 09:59
ovviamente così scrive più risultati nella stessa textbox.
Conviene usare un datagrid giusto?

Ovviamente si devi adattarlo alle tue esigenze poi se vuoi visualizzare tutti i risultati in una tabella tipo access utilizza un datagridview dove per popolarlo utilizzi questo codice:

Eseguo il Binding tra il DataGridView e il DataSet "DS" ( o DataTable che sia ), precedentemente "fillato" con apposito Adapter "DA" :

Codice:

DA.Fill(DS)
DataGridView1.DataSource = DS.Tables(0)


Puoi gestire le operazioni dal DataGridView impostando le proprietà Me.DataGridView1.AllowUserToAddRows = True e Me.DataGridView1.AllowUserToDeleteRows = True.

A questo punto puoi inserire un pulsante unico di "Applica Modifiche", che contiene tutta la gestione di tutte le possibili azioni che un utente può fare su una o anche più righe contemporaneamente, mediante un OleDbCommandBuilder, che esiste proprio per questo :



Private Sub cmd_applica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_applica.Click

If DS.HasChanges() Then
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")
End If

End Sub


E il gioco è fatto : gestisce tutto in un colpo solo ed evita virtualmente ogni problema di refresh e salvataggio nel DB.

Lu Pier
12-03-2011, 10:06
Lunedì quando torno a lavoro provo, per ora non posso che ringraziarti per il grande aiuto che mi stai dando.

Lu Pier
14-03-2011, 11:51
Eseguo il Binding tra il DataGridView e il DataSet "DS" ( o DataTable che sia ), precedentemente "fillato" con apposito Adapter "DA" :

Codice:

DA.Fill(DS)
DataGridView1.DataSource = DS.Tables(0)




Non riesco a capire questa parte, dovrò pur dichiarare queste variabile "Da" e "DS" da qualche parte.

jackk87
14-03-2011, 12:45
Non riesco a capire questa parte, dovrò pur dichiarare queste variabile "Da" e "DS" da qualche parte.

scusami l'avevo dato per scontato :D ti basta inserire questo codice nella dichiarazione generale del form :cool: :

Dim DS As New DataSet 'Variabile DataSet
Dim DA As OleDb.OleDbDataAdapter 'Variabile DataAdapter

Lu Pier
14-03-2011, 13:36
scusami l'avevo dato per scontato :D ti basta inserire questo codice nella dichiarazione generale del form :cool: :

Dim DS As New DataSet 'Variabile DataSet
Dim DA As OleDb.OleDbDataAdapter 'Variabile DataAdapter


Scusami se sono un somaro!

La variabile 'DA' viene utilizzata prima che le sia stato assegnato un valore.
È possibile che venga restituita un'eccezione dovuta a un riferimento con valore null in fase di esecuzione.

Forse dovrei aggiungere qualcosa del genere:
DA = New OleDb.OleDbConnection(Cn)

Ma mi segnale questo errore su "DA = New OleDb.OleDbConnection(Cn)" :
Impossibile convertire il valore di tipo 'System.Data.OleDb.OleDbConnection' in 'String'.

jackk87
14-03-2011, 14:35
posta tutto il codice della form che utilizzi così vedo dov'è che hai fatto confusione :D

Lu Pier
14-03-2011, 14:42
Module:
Public key As Integer
'Percorso del DataBase
Public PercorsoDB As String = "C:\Users\Pierpaolo\Documents\Visual Studio 2010\Projects\PSP Engine\PSP Engine\database.mdb"

'Stringa di Connessione
Public ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & PercorsoDB

'Connessione alla stringa
Public Cn As New OleDbConnection(ConnString)
End Module

Form:

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim sql As String
Dim ds As New DataSet 'Variabile DataSet
Dim da As OleDb.OleDbDataAdapter 'Variabile DataAdapter


sql = "SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"WHERE fr_id = " & key

Cn.Open()
da.Fill(ds)
DataGridView1.DataSource = ds.Tables(0)


Cn.Close()
End Sub

Errore:

http://img717.imageshack.us/img717/3929/errorenv.jpg

jackk87
14-03-2011, 16:18
Il codice del modulo va bene mentre quello del form devi modificarlo così:

Public Class Form3
Dim ds As New DataSet 'Variabile DataSet
Dim da As OleDb.OleDbDataAdapter 'Variabile DataAdapter

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim sql As String

sql = "SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"WHERE fr_id = " & key

Cn.Open()

'Dataset
DS = New DataSet("sviluppo")
'DataAdapter
DA = New OleDb.OleDbDataAdapter(sql, Cn)
DA.Fill(DS, "sviluppo")

DataGridView1.DataSource = DS.Tables(0)

Cn.Close()
End Sub
End Class


se avrai un button che ti gestisce tutte le modifiche fatte alla tabella:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If DS.HasChanges() Then
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
Try
DA.Update(DS, "impegno")
Catch ex As Exception
MsgBox(ex.Message)
Exit Sub
End Try

End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")
End If

End Sub

Lu Pier
15-03-2011, 09:27
Funziona perfettamente! Grazie mille!

Ora vediamo se riesco a scrivere il codice per inserire un record.

jackk87
15-03-2011, 09:56
Funziona perfettamente! Grazie mille!

Ora vediamo se riesco a scrivere il codice per inserire un record.

Se tu vuoi fare l'inserimento, la modifica e l'eliminazione e gestirla da parte nn ti serve il button dell'applica modifiche. Invece se vuoi utilizzare direttamente l'inserimento, l'aggiornamento e l'eliminazione direttamente dalla datagridview una volta letti i dati sul load del form tramite essa puoi inserire eliminare aggiornare i record direttamente da lei e poi sara il dataadapter al click del button ad aggiornare tutti i dati nel database e non devi gestire niente apparte è tutto già pronto. Se non hai capito dimmelo così ti spiego quello che non hai capito :cool:

Lu Pier
15-03-2011, 10:10
Se tu vuoi fare l'inserimento, la modifica e l'eliminazione e gestirla da parte nn ti serve il button dell'applica modifiche. Invece se vuoi utilizzare direttamente l'inserimento, l'aggiornamento e l'eliminazione direttamente dalla datagridview una volta letti i dati sul load del form tramite essa puoi inserire eliminare aggiornare i record direttamente da lei e poi sara il dataadapter al click del button ad aggiornare tutti i dati nel database e non devi gestire niente apparte è tutto già pronto. Se non hai capito dimmelo così ti spiego quello che non hai capito :cool:

Sinceramente non ho capito molto! :)

Nella mia testa volevo creare una nuova form con i vari textbox del mio database.
Poi alla pressione di un button dovevo prendere i valori delle textbox e inserire nel database.

penso sia qualcosa del tipo:

sql = insert qualcosa

Poi per la modifica e l'eliminazione non ho la più pallida idea di come fare. :D

Lu Pier
15-03-2011, 10:34
Ho fatto una prova del cavolo e funziona.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sql As String


sql = "INSERT INTO sviluppo " _
& "(fase) " _
& "VALUES " _
& "('1234')"


Dim MySqlCommand As New OleDbCommand
Cn.Open()
MySqlCommand.Connection = Cn
MySqlCommand.CommandText = sql
MySqlCommand.ExecuteNonQuery()
Cn.Close()
End Sub

Ho sbagliato qualcosa?

jackk87
15-03-2011, 11:00
Ho fatto una prova del cavolo e funziona.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sql As String


sql = "INSERT INTO sviluppo " _
& "(fase) " _
& "VALUES " _
& "('1234')"


Dim MySqlCommand As New OleDbCommand
Cn.Open()
MySqlCommand.Connection = Cn
MySqlCommand.CommandText = sql
MySqlCommand.ExecuteNonQuery()
Cn.Close()
End Sub

Ho sbagliato qualcosa?

certo che funziona e non hai sbagliato :D anche perchè se googli un pò trovi tutte le informazioni che vuoi anche se hai già trovato e a differenza dell'inserimento cambierà solo la stringa sql per quanto riguarda l'aggiornamento e l'eliminazione. Quello che intendevo io se non sei obbligato a creare altri form per l'inserimento e l'aggiornamento a parte e visto che sei alle prime armi ti avevo consigliato la strada più semplice però per altri motivi vuoi gestire il tutto da solo sei sulla strada giusta :cool:

Lu Pier
15-03-2011, 11:05
Ora stavo parametrizzando la query con linea di codice

MySqlCommand.Parameters.AddWithValue("@data", SqlDbType.DateTime).Value = DateTimePicker1.Value

Funziona solo che mi scrive sul database anche l'ora e non ne avrei bisogno.

Il divertimento inizierà quando avrò bisogno di esportare la tabella su excel!

Lu Pier
15-03-2011, 11:33
Sarà possibile che non riesco a ordinare per ID ?!

Se faccio cosi non funziona
sql = "SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"ORDER BY ID " & _
"WHERE fr_id = " & key

jackk87
15-03-2011, 12:33
Sarà possibile che non riesco a ordinare per ID ?!

Se faccio cosi non funziona
sql = "SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"ORDER BY ID " & _
"WHERE fr_id = " & key

Fai un pò di confusione sarebbe meglio se guardassi almeno le basi dell'sql e del vb.net cmq per ordinarla per id devi fare:

sql = "SELECT ID, [data inizio_fase], fase, periodo_durata, [output],verifichea, verificheb, verifichec, fine_fase, esecutore, fr_id " & _
"FROM sviluppo " & _
"WHERE fr_id = " & key & _
" ORDER BY ID "

Lu Pier
16-03-2011, 10:47
Jack ti volevo ringraziare per il grande aiuto.
Ora riesco anche ad utilizzare UPDATE per modificare i record, l'unica neo è che dopo aver modificato il database devo cliccare un button per ripopolare la DataGrid. Invece vorrei che si ripopolasse da sola.

Hai qualche consiglio?

jackk87
16-03-2011, 11:06
Jack ti volevo ringraziare per il grande aiuto.
Ora riesco anche ad utilizzare UPDATE per modificare i record, l'unica neo è che dopo aver modificato il database devo cliccare un button per ripopolare la DataGrid. Invece vorrei che si ripopolasse da sola.

Hai qualche consiglio?

Inserisci il codice che popoli la datagridview all'apertura del form in una procedura di tipo Public così alla pressione del pulsante per salvare le modifiche o l'inserimento del record vai a richiamare quella funzione per esempio:

Form1.CaricaDataGridView()


comunque ti consiglio quest'ottima guida abbastanza completa di VB.NET dacci un'occhiata ;) http://totemslair.org/guide/vb.php

Lu Pier
16-03-2011, 11:33
Inserisci il codice che popoli la datagridview all'apertura del form in una procedura di tipo Public così alla pressione del pulsante per salvare le modifiche o l'inserimento del record vai a richiamare quella funzione per esempio:

Form1.CaricaDataGridView()


comunque ti consiglio quest'ottima guida abbastanza completa di VB.NET dacci un'occhiata ;) http://totemslair.org/guide/vb.php

Grazie per la guida.

P.S. Fatto anche l'aggiornamento senza cliccare, ho fatto come hai detto te :D