PDA

View Full Version : [Visual basic 2008] Ancora su database sql..


ale09hh
15-03-2009, 16:36
Perchè il seguente codice non funziona? Non mi da errore ma non fa quello che dovrebbe...

Dim conn As New System.Data.SqlServerCe.SqlCeConnection("Data Source = componenti.sdf; Persist Security Info=False;")
Dim sqlQ As String = "SELECT pezzo, modello, prezzo, marca FROM temporal WHERE pezzo = 'processore'"
Dim command As New System.Data.SqlServerCe.SqlCeCommand(sqlQ, conn)
conn.Open()
Dim reader As System.Data.SqlServerCe.SqlCeDataReader = command.ExecuteReader()

While (reader.Read())

If Label14.Text = " " Then
MsgBox("Devi scegliere un processore prima di aggiungerlo!", MsgBoxStyle.Critical, "ERRORE!")

ElseIf IsDBNull((reader(("pezzo")))) Then
Dim cmd As New System.Data.SqlServerCe.SqlCeCommand
cmd.CommandText = "INSERT INTO temporal(pezzo, modello, prezzo, marca) VALUES ('processore' , '" & Label15.Text & "' , '" & Label17.Text & "' , '" & Label14.Text & "')"
conn.Open()
cmd.Connection = conn
cmd.ExecuteNonQuery()
While (reader.Read())
ListBox4.Items.Add(UCase((reader("pezzo"))) & " - " & UCase((reader("marca"))) & " " & UCase((reader("modello"))) & " - " & (reader("prezzo")) & "€")
End While
conn.Close()

Else
MsgBox("Puoi inserire solo un processore per volta!", MsgBoxStyle.Critical, "ERRORE")

End If

End While

reader.Close()
conn.Close()

MarcoGG
15-03-2009, 16:49
Non mi è chiaro quel secondo Reader nidificato nel primo... :mbe:
Che stai tentando di fare ?

ale09hh
15-03-2009, 17:02
Allora se ti ricordi io nel mio programma vorrei mettere una cosa tipo carrello della spesa...

All'inizio ho sperimentato a farlo "normalmente", cioè inserendo direttamente i dati dal form nella list box, ma poi ho incontrato dei problemi più avanti per cui ho deciso di inserire un database temporaneo in cui inserire i dati per metterli in seguito nel listbox...

In particolare,

Dim sqlQ As String = "SELECT pezzo, modello, prezzo, marca FROM temporal WHERE pezzo = 'processore'"
Dim command As New System.Data.SqlServerCe.SqlCeCommand(sqlQ, conn)
conn.Open()
Dim reader As System.Data.SqlServerCe.SqlCeDataReader = command.ExecuteReader()

Qui mi connetto al database per leggere se esiste il campo 'pezzo' nella colonna 'processore', e se non ci sono li inserisce lui e li visualizza nella list box, precisamente qui ---> ElseIf IsDBNull((reader(("pezzo")))) Then
Dim cmd As New System.Data.SqlServerCe.SqlCeCommand
cmd.CommandText = "INSERT INTO temporal(pezzo, modello, prezzo, marca) VALUES ('processore' , '" & Label15.Text & "' , '" & Label17.Text & "' , '" & Label14.Text & "')"
conn.Open()
cmd.Connection = conn
cmd.ExecuteNonQuery()
While (reader.Read())
ListBox4.Items.Add(UCase((reader("pezzo"))) & " - " & UCase((reader("marca"))) & " " & UCase((reader("modello"))) & " - " & (reader("prezzo")) & "€")
End While
conn.Close()

gli altri due if controllano:
1- se l'utente ha selezionato il processore prima di inserirlo nel listbox
2- se l'utente ha già inserito un processore

MarcoGG
15-03-2009, 17:39
Va beh, non ho capito esattamente cosa tu voglia fare, comunque fare 2 cicli while sullo stesso reader ( il Reader che usi dentro è lo stesso che usi fuori, perchè vedo che ne hai dichiarato uno solo ) non può andare.

Quando fai Reader.Read() il reader è partito, è come un cursore, poi gli fai fare ancora .Read() all'interno... E' logico che faccia pasticci, anzi mi sorprende un po' che non ti si pianti tutto.

Se vuoi usare un DataReader interno prova ad istanziarne uno nuovo ! E occhio ai nomi... ;)

ale09hh
15-03-2009, 18:07
E' un pò difficile da spiegare e aggiungi che non sono un mostro di eloquenza... :D va be provero in qualche altro modo..