View Full Version : [VB] Query con variabile
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?
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
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.
Mettendo un punto di interruzione ho visto che la query è corretta ma senza il generatore di query non so come popolare le textbox.
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
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"
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()
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.
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:
Se intendi quelle nel modulo si è stata una mia distrazione :doh:
e se la query generasse più risultati come li gestisco?
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()
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?
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.
Lunedì quando torno a lavoro provo, per ora non posso che ringraziarti per il grande aiuto che mi stai dando.
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.
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
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'.
posta tutto il codice della form che utilizzi così vedo dov'è che hai fatto confusione :D
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
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
Funziona perfettamente! Grazie mille!
Ora vediamo se riesco a scrivere il codice per inserire un record.
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:
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
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?
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:
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!
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
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 "
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?
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
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.