View Full Version : [VB.NET 2008] Database
Fabio7586
07-04-2009, 13:02
Salve, ho un problema, inserito in input due valori da textbox, deve andare a fare la ricerca in un database e se trovato, deve restituirmi in un altra textbox il valore:
codice
Private Sub Button1_Click_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Aprichiudi.Click
Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Fabio\Desktop\Codice Fiscale\Comuni.accdb;Persist Security Info=False;"
Dim Cn As New OleDbConnection(ConnString)
Dim sql As String = "select NAZIONALE from italia where COMUNE=txtCOMUN and PROVINCIA=txtPROV"
If Cn.State = ConnectionState.Open Then Cn.Close()
If Aprichiudi.Text = "&Connetti" Then
Cn.Open()
Aprichiudi.Text = "&Disconnetti"
Else
Aprichiudi.Text = "&Connetti"
Cn.Close()
End If
If (Cn.State) = ConnectionState.Open Then
MessageBox.Show("Il db adesso è connesso", _
"Attenzione", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
Dim cmd As New OleDbCommand(sql, Cn)
Dim testo As String
testo = cmd.ExecuteNonQuery()
txtout.Text = testo
Else
MessageBox.Show("Il db adesso è disconnesso", _
"Attenzione", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End If
End Sub
Dice oledbexception non è stata gestita, nessun valore specificato per alcuni parametri necessari.
Cosa sto sbagliando?
ma gli passi i parametri nella query?
io vedo solo che costruisci la stringa...
cosa sono e come sono settati txtCOMUN e txtPROV?
magari serve una cosa del genere, supponendo txtCOMUN e txtPROV varabili inizializzate prima a tua discrezione
Dim sql As String = "select NAZIONALE from italia where COMUNE= ' " & txtCOMUN & " ' and PROVINCIA= ' " & txtPROV & " ' "
Kralizek
07-04-2009, 14:07
ma gli passi i parametri nella query?
io vedo solo che costruisci la stringa...
cosa sono e come sono settati txtCOMUN e txtPROV?
magari serve una cosa del genere, supponendo txtCOMUN e txtPROV varabili inizializzate prima a tua discrezione
Dim sql As String = "select NAZIONALE from italia where COMUNE= ' " & txtCOMUN & " ' and PROVINCIA= ' " & txtPROV & " ' "
ma anche no! Impariamo ad usare i parametri!
Dim sql As String = "SELECT NAZIONALE FROM italia WHERE COMUNE = ? AND PROVINCIA = ?"
Dim cmd As New OdbcCommand (sql)
cmd.Parameters.Add(txtCOMUN.Text)
cmd.Parameters.Add(txtPROV.Text)
o qualcosa del genere, non ricordo esattamente la sintassi per aggiungere parametri ad un OdbcCommand. Ma meglio che la concatenazione di stringhe!
Fabio7586
07-04-2009, 14:23
ma gli passi i parametri nella query?
io vedo solo che costruisci la stringa...
cosa sono e come sono settati txtCOMUN e txtPROV?
magari serve una cosa del genere, supponendo txtCOMUN e txtPROV varabili inizializzate prima a tua discrezione
Dim sql As String = "select NAZIONALE from italia where COMUNE= ' " & txtCOMUN & " ' and PROVINCIA= ' " & txtPROV & " ' "
Sono due textbox; in che senso costruisco solo la stringa? Dove lavoro io, creiamo software di gestione aziendale, e non ho alcun problema a lavorare con i database, tant'è vero che le query che scrivo sono tutte del tipo select campo1 as qualcosa,campo2 as qualcosa,campo3 as qualcosa from table where table.campo1=variabile1,table.campo2=varibile2 eventualmente group by order by etc..
ma anche no! Impariamo ad usare i parametri!
Dim sql As String = "SELECT NAZIONALE FROM italia WHERE COMUNE = ? AND PROVINCIA = ?"
Dim cmd As New OdbcCommand (sql)
cmd.Parameters.Add(txtCOMUN.Text)
cmd.Parameters.Add(txtPROV.Text)
o qualcosa del genere, non ricordo esattamente la sintassi per aggiungere parametri ad un OdbcCommand. Ma meglio che la concatenazione di stringhe!
Perchè usi odbccommand?
Ho fatto come hai detto, solo scrivendo oledbcommand e non odbc
Private Sub Button1_Click_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Aprichiudi.Click
Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Fabio\Desktop\Codice Fiscale\Comuni.accdb;Persist Security Info=False;"
Dim Cn As New OleDbConnection(ConnString)
Dim sql As String = "select NAZIONALE from italia where COMUNE=? and PROVINCIA=?"
If Cn.State = ConnectionState.Open Then Cn.Close()
If Aprichiudi.Text = "&Connetti" Then
Cn.Open()
Aprichiudi.Text = "&Disconnetti"
Else
Aprichiudi.Text = "&Connetti"
Cn.Close()
End If
If (Cn.State) = ConnectionState.Open Then
MessageBox.Show("Il db adesso è connesso", _
"Attenzione", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
Dim cmd As New OleDbCommand(sql)
Dim testo As String
cmd.Parameters.Add(txtCOMUN.Text)
cmd.Parameters.Add(txtPROV.Text)
testo = cmd.ExecuteNonQuery()
txtout.Text = testo
Else
MessageBox.Show("Il db adesso è disconnesso", _
"Attenzione", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End If
End Sub
Ma mi dà questo errore:
OleDbParameterCollection accetta solo oggetti di tipo OleDbParameter non null, non oggetti String.
o qualcosa del genere, non ricordo esattamente la sintassi per aggiungere parametri ad un OdbcCommand. Ma meglio che la concatenazione di stringhe!
hai ragione, molto meglio e molto più pulito :)
era giusto per dare una soluzione veloce
Fabio7586
07-04-2009, 17:01
Help!
Kralizek
07-04-2009, 17:30
Help!
Scusa, ero al lavoro e non ho visto che stavi usando il provider OleDb. Anzicchè usare OdbcCommand, usa OleDbCommand e tutto andrà bene ;)
Fabio7586
08-04-2009, 08:04
Scusa, ero al lavoro e non ho visto che stavi usando il provider OleDb. Anzicchè usare OdbcCommand, usa OleDbCommand e tutto andrà bene ;)
Ho usato oledb, ma da questo errore:
OleDbParameterCollection accetta solo oggetti di tipo OleDbParameter non null, non oggetti String.
due post più su c'è il codice che ho usato!
Kralizek
08-04-2009, 08:20
Vedi il costruttore di un OleDbParameter cosa chiede ;)
ma anche no! Impariamo ad usare i parametri!
Dim sql As String = "SELECT NAZIONALE FROM italia WHERE COMUNE = ? AND PROVINCIA = ?"
Dim cmd As New OdbcCommand (sql)
cmd.Parameters.Add(txtCOMUN.Text)
cmd.Parameters.Add(txtPROV.Text)
o qualcosa del genere, non ricordo esattamente la sintassi per aggiungere parametri ad un OdbcCommand. Ma meglio che la concatenazione di stringhe!
Quoto. La concatenazione, tranne in casi molto semplici, espone spesso ad errori, soprattutto in connessione a DB Access...
Per quanto riguarda OleDbParameter, forse meglio questa soluzione, più corretta e leggibile ( su DB Access 2003, per 2007 modificare la strCN... ) :
Dim strCN As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & percorso & "nomeDB.mdb" & ";Persist Security Info=False"
Dim CN As New OleDb.OleDbConnection(strCN)
Dim strSql As String = "SELECT * FROM nomeTabella WHERE id=@id AND nome=@nome"
Dim CMD As New OleDb.OleDbCommand(strSql, CN)
CMD.Parameters.Add("@id", OleDb.OleDbType.BigInt)
CMD.Parameters.Add("@nome", OleDb.OleDbType.VarChar)
'...
'Assegnazione Parametri :
CMD.Parameters("@id").Value = txt_id.Text
CMD.Parameters("@nome").Value = txt_nome.Text
'...
CN.Open()
Dim RDR As OleDb.OleDbDataReader = CMD.ExecuteReader()
While (RDR.Read())
'...
'...
End While
RDR.Close()
CN.Close()
Ciascun parametro ha un suo nome @parametro. Con 2 soli parametri non si nota un granchè, ma ti assicuro che in una Insert con 30 parametri fa la sua bella differenza... ;)
Kralizek
08-04-2009, 08:51
Che io sappia il provider OleDb non supporta i parametri con nome.
Cosí come il provider MySql marca i parametri con "?" (es: ?name).
Che io sappia il provider OleDb non supporta i parametri con nome.
Cosí come il provider MySql marca i parametri con "?" (es: ?name).
Li supporta eccome... ;)
Io uso quella tecnica praticamente tutte le volte che ho a che fare con DB Access. Forse ti riferisci ad un ADO.Net precedente al 2.0...
Fabio7586
08-04-2009, 09:25
Quoto. La concatenazione, tranne in casi molto semplici, espone spesso ad errori, soprattutto in connessione a DB Access...
Per quanto riguarda OleDbParameter, forse meglio questa soluzione, più corretta e leggibile ( su DB Access 2003, per 2007 modificare la strCN... ) :
Dim strCN As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & percorso & "nomeDB.mdb" & ";Persist Security Info=False"
Dim CN As New OleDb.OleDbConnection(strCN)
Dim strSql As String = "SELECT * FROM nomeTabella WHERE id=@id AND nome=@nome"
Dim CMD As New OleDb.OleDbCommand(strSql, CN)
CMD.Parameters.Add("@id", OleDb.OleDbType.BigInt)
CMD.Parameters.Add("@nome", OleDb.OleDbType.VarChar)
'...
'Assegnazione Parametri :
CMD.Parameters("@id").Value = txt_id.Text
CMD.Parameters("@nome").Value = txt_nome.Text
'...
CN.Open()
Dim RDR As OleDb.OleDbDataReader = CMD.ExecuteReader()
While (RDR.Read())
'...
'...
End While
RDR.Close()
CN.Close()
Ciascun parametro ha un suo nome @parametro. Con 2 soli parametri non si nota un granchè, ma ti assicuro che in una Insert con 30 parametri fa la sua bella differenza... ;)
Perchè mi consigli il provider 4.0 e non 12.0? Io l'ho preso da stringconnection, che differenza c'è?
Edit:
Pardon...non avevo ben capito che avevi scritto di cambiare strcon! Poi per passare il valore ottenuto dalla query, basta che assegno la variabile strsql nella textbox?
P.s. se è possibile qualcuno può spiegarmi come faccio a fare un oggetto che mi compare a video con un timer, che dura finchè il database non si connette?
Perchè mi consigli il provider 4.0 e non 12.0? Io l'ho preso da stringconnection, che differenza c'è?
Perchè, come ho scritto, il mio esempio è su Access 2003. Se usi un DB Access 2007 ( .accdb ) l'unica modifica è appunto la stringa di connessione strCN. Usa la tua. ;)
P.s. se è possibile qualcuno può spiegarmi come faccio a fare un oggetto che mi compare a video con un timer, che dura finchè il database non si connette?
Non so esattamente il perchè del tuo codice, ma tutta questa preoccupazione sui tempi di connessione al DB la trovo superflua, soprattutto se questo file .accdb è locale ( ma anche in LAN... ).
La connessione è praticamente istantanea. La apri / la usi / la chiudi.
Oltretutto tenere connessioni inutili aperte, in giro per l'applicazione, e soprattutto con Access, non è mai una buona idea...
Fabio7586
08-04-2009, 10:02
Non so esattamente il perchè del tuo codice, ma tutta questa preoccupazione sui tempi di connessione al DB la trovo superflua, soprattutto se questo file .accdb è locale ( ma anche in LAN... ).
La connessione è praticamente istantanea. La apri / la usi / la chiudi.
Oltretutto tenere connessioni inutili aperte, in giro per l'applicazione, e soprattutto con Access, non è mai una buona idea...
Non è una preoccupazione sui tempi del database, figurati, era solo per fare una cosa carina ^_^
Fabio7586
09-04-2009, 11:08
Ho Provato questo:
Private Sub Button1_Click_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Aprichiudi.Click
Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Fabio\Desktop\Codice Fiscale\Comuni.accdb;Persist Security Info=False;"
Dim Cn As New OleDbConnection(ConnString)
Dim sql As String = "select NAZIONALE from italia where COMUNE=@idcomune and PROVINCIA=@idprovincia"
Dim cmd As New OleDbCommand(sql, Cn)
cmd.Parameters.Add("@idcomune", OleDb.OleDbType.LongVarChar)
cmd.Parameters.Add("@idprovincia", OleDb.OleDbType.LongVarChar)
If Cn.State = ConnectionState.Open Then Cn.Close()
If Aprichiudi.Text = "&Connetti" Then
Cn.Open()
Aprichiudi.Text = "&Disconnetti"
Else
Aprichiudi.Text = "&Connetti"
Cn.Close()
End If
If (Cn.State) = ConnectionState.Open Then
MessageBox.Show("Il db adesso è connesso", _
"Attenzione", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
cmd.Parameters("@idcomune").Value = txbLNasc.Text
cmd.Parameters("@idprovincia").Value = txbProvNasc.Text
Dim RDR As OleDb.OleDbDataReader = cmd.ExecuteReader()
While (RDR.Read())
'...
txtout.Text = cmd.ExecuteNonQuery()
'...
End While
RDR.Close()
Else
MessageBox.Show("Il db adesso è disconnesso", _
"Attenzione", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End If
End Sub
Non funzione, restituisce qualcosa a proposito di ExecuteNonQuery(), perchè?
Non funzione, restituisce qualcosa a proposito di ExecuteNonQuery(), perchè?
Vedo che hai usato la soluzione dei parametri con nome. ;) Bene, ma non così. Ovvio che da errore, hai già il DataReader pronto, inoltre .ExecuteNonQuery si usa per operazioni di Insert/Update/Delete, e mai usarlo nel ciclo di lettura del DataReader...
Se la tua query era "select NAZIONALE from italia ... ", a questo punto esiste un campo "NAZIONALE" nella tabella risultati restituita dal DataReader, perciò semmai :
While (RDR.Read())
'...
txtout.Text = RDR("NAZIONALE")
'...
End While
;)
Fabio7586
09-04-2009, 11:48
Vedo che hai usato la soluzione dei parametri con nome. ;) Bene, ma non così. Ovvio che da errore, hai già il DataReader pronto, inoltre .ExecuteNonQuery si usa per operazioni di Insert/Update/Delete, e mai usarlo nel ciclo di lettura del DataReader...
Se la tua query era "select NAZIONALE from italia ... ", a questo punto esiste un campo "NAZIONALE" nella tabella risultati restituita dal DataReader, perciò semmai :
While (RDR.Read())
'...
txtout.Text = RDR("NAZIONALE")
'...
End While
;)
GrazIEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!!
Risposta a tuo pvt :
Se vuoi riutilizzare il mio codice al post #10, basta che nel ciclo di lettura del DataReader, per ogni Record restituito, tu vada ad aggiungere una riga al DataGridView, che avrai già formattato in design mode costruendo le colonne di formato appropriato.
Altro metodo è usare un DataSet, ma in quel caso il codice andrà modificato.
Fabio7586
17-04-2009, 13:58
Risposta a tuo pvt :
Se vuoi riutilizzare il mio codice al post #10, basta che nel ciclo di lettura del DataReader, per ogni Record restituito, tu vada ad aggiungere una riga al DataGridView, che avrai già formattato in design mode costruendo le colonne di formato appropriato.
Altro metodo è usare un DataSet, ma in quel caso il codice andrà modificato.
Ciao, grazie dell'info.
Ho formattato il datagridview, ho creato tre colonne di tipo textbox (DataGridViewTextBoxColumn), e chiedo scusa se ho scritto male nel pvt, ma era proprio questo che chiedevo; in che modo passo il valore trovato nelle righe del datagridview?
Mi spiace essere così zelante, ma è la prima volta che lavoro con un database, e sto cercando di imparare ad usarli correttamente, ho cercato guide in merito, ma nulla di così esauriente!
Semplice, ad esempio in questo modo :
Dim nuovaRow As New DataGridViewRow
nuovaRow.CreateCells(DataGridView1)
nuovaRow.Cells(0).Value = RDR("Campo1")
nuovaRow.Cells(1).Value = RDR("Campo2")
...
...
nuovaRow.Cells(N-1).Value = RDR("CampoN")
Dimenticavo... Ovviamente da mettere nel ciclo di lettura del DataReader, e inoltre aggiungere un :
DataGridView1.Rows.Add(nuovaRow) ;)
Fabio7586
17-04-2009, 15:16
Ho scritto questo,
Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Comuni.accdb;Persist Security Info=False;"
Dim Cn As New OleDbConnection(ConnString)
Dim sql As String = "select * from italia where PROVINCIA=@idprovincia"
Dim cmd As New OleDbCommand(sql, Cn)
Dim codprov, provnasc, codice As String
If (Cn.State) = ConnectionState.Closed Then
Cn.Open()
End If
codprov = txbcercom.Text
codprov = StrConv(codprov, VbStrConv.Uppercase)
If codprov = "" Then
MsgBox("Il Comune è vuoto! Impossibile Procedere!", MsgBoxStyle.Critical, "Errore")
Cn.Close()
Exit Sub
End If
cmd.Parameters.Add("@idprovincia", OleDb.OleDbType.LongVarChar)
cmd.Parameters("@idprovincia").Value = codprov
Dim RDR As OleDb.OleDbDataReader = cmd.ExecuteReader()
Dim nuovaRow As New DataGridViewRow
While (RDR.Read())
nuovaRow.CreateCells(Dbcercacom)
Dbcercacom.Rows.Add(nuovaRow)
nuovaRow.Cells(0).Value = RDR("COMUNE")
nuovaRow.Cells(1).Value = RDR("PROVINCIA")
'...
End While
RDR.Close()
si ferma qui nuovaRow.CreateCells(Dbcercacom) e restituisce InvalidOperationException non è stata gestita, la riga specificata appartiene già ad un controllo datagridview, perchè?
Dim nuovaRow As DataGridViewRow
While (RDR.Read())
nuovaRow = New DataGridViewRow
nuovaRow.CreateCells(Dbcercacom)
nuovaRow.Cells(0).Value = RDR("COMUNE")
nuovaRow.Cells(1).Value = RDR("PROVINCIA")
Dbcercacom.Rows.Add(nuovaRow)
'...
End While
Fabio7586
18-04-2009, 08:19
Dim nuovaRow As DataGridViewRow
While (RDR.Read())
nuovaRow = New DataGridViewRow
nuovaRow.CreateCells(Dbcercacom)
nuovaRow.Cells(0).Value = RDR("COMUNE")
nuovaRow.Cells(1).Value = RDR("PROVINCIA")
Dbcercacom.Rows.Add(nuovaRow)
'...
End While
Ciao,
grazie ancora, però a questo punto mi sorge spontanea la domanda, questo nuovaRow = New DataGridViewRow a cosa serve? e cosa implica la clausola new?
grazie per la disponibilità e per la rottura che ti sto arrecando! :)
questo nuovaRow = New DataGridViewRow a cosa serve? e cosa implica la clausola new?
grazie per la disponibilità e per la rottura che ti sto arrecando! :)
New è ovviamente la chiamata al metodo costruttore della classe, una delle prime cose che devi sapere se usi .Net.
Se noti ho dichiarato solo il tipo fuori dal ciclo del DataReader, mentre dentro, con New, l'oggetto vero e proprio.
nuovaRow è appunto un oggetto DataGridViewRow, che istanzio e inizializzo con tutti i valori del RDR, mentre l'istruzione nuovaRow.CreateCells(Dbcercacom) serve ad aggiungere e formattare in un colpo solo tutte le celle ( vuote ) alla nuova riga ereditandone le caratteristiche dal DataGridView desiderato.
Fabio7586
18-04-2009, 10:20
New è ovviamente la chiamata al metodo costruttore della classe, una delle prime cose che devi sapere se usi .Net.
Se noti ho dichiarato solo il tipo fuori dal ciclo del DataReader, mentre dentro, con New, l'oggetto vero e proprio.
nuovaRow è appunto un oggetto DataGridViewRow, che istanzio e inizializzo con tutti i valori del RDR, mentre l'istruzione nuovaRow.CreateCells(Dbcercacom) serve ad aggiungere e formattare in un colpo solo tutte le celle ( vuote ) alla nuova riga ereditandone le caratteristiche dal DataGridView desiderato.
Grazie mille! Sto facendo passi da gigante! Purtroppo non ho mai lavorato così nello specifico sia per righe di codice sia per database, perchè dove lavoro, mi limito a creare query con costruttori di query fatti ad hoc oppure con semplici righe di codice che vanno a scrivere qualcosa in un database, l'utilizzo di classi e metodi mi era quasi sconosciuto fino a questo momento! Sto leggendo manuali e guide, ma comunque vanno per il generico, e penso che per imparare qualcosa, bisogna anzitutto affrontare il problema nello specifico sennò sono tutte belle parole! Spero non ti dispiaccia se per quache altro problema chiederò il tuo aiuto, visto che ho notato che sei una persona molto preparata ed in gamba!
Grazie!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.