Domanda Cast non valido dal tipo 'DBNull' al tipo integer

Antonio_lmp

Utente abituale
Original poster
19 Febbraio 2018
239
13
18
Lampedusa
2010-2016
Carissimi, buona sera seguo sempre con grande interesse tutti quanti e mi complimento con Voi Tutti. Mi sto avventurando nel mondo VB.NET uso la versione Visualstudio 2022 e sto creando un semplice database con un campo nella fattispecie una textbox chiamata progressivo dove viene fuori una cosa del genere "Prot." & "1" & "/" & Year(Now)". Tramite la Private Function GenID() As String txtprogressivo.Text = NewID e fin quì tutto OK (funziona alla perfezione) se la tabella contiene almeno un record. Nel caso invece la tabella sia completamente vuota dovrei essere io ad assegnare txtprogressivo.Text ="Prot." & "1" & "/" & Year(Now) solo per il primo record.
Il problema come scrivevo è che se il db e vuoto non funziona e mi viene fuori il messaggio " Cast non valido dal tipo 'DBNull' al tipo integer.

Riassumendo quindi mi serve se la tabella protocollo sia vuota che value sia uguale a 1.
Qualcuno può aiutarmi?
Grazie in anticipo.

Visual Basic:
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     btnsalva.Enabled = True
     'btnupdate.Enabled = True
     'btnelimina.Enabled = True

     Dim NewID As String = ""
     Try
         NewID = GenID()
     Catch ex As Exception
         MessageBox.Show(ex.Message)
         Return
     End Try
     If NewID = 0 Then
         txtprogressivo.Text = "Prot." & "1" & "/" & Year(Now)
     Else
         txtprogressivo.Text = NewID
     End If
 End Sub

 Private ConStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\GESTPRO-WIN\Data\DB.accdb"
     Private Function GenID() As String

     Dim value As Integer
     Dim StrValue As String
     Using con As New OleDbConnection(ConStr),
             com = New OleDbCommand("SELECT Max(Id) FROM protocollo", con)
         con.Open()
         value = CInt(com.ExecuteScalar)
     End Using

     value += 1
     If value >= 1 Then

         StrValue = "Prot." & value & "/" & Year(Now)

     Else
         strvalue = 0
     End If

     Return StrValue
 End Function
 

Sgrubak

Excel/VBA Expert
Expert
10 Marzo 2022
3.418
1.123
145
365 Beta x32
Riga 28 dovrebbe diventare
Visual Basic:
Dim res As Object?
res=com.ExecuteScalar()
If Not IsDBNull(res) Then value=CInt(res)

Anche se non ha molto senso quel che stai facendo, a mio avviso. Dato che quel valore dipende dall'ID, in caso di inserimento in multiutenza, chi ti da la garanzia che l'ID resti quello? Se apriamo io e te la stessa Form avremo lo stesso ID... Il primo che salva si becca quello che vediamo, l'altro il successivo.

Dovresti lasciar gestire al DB queste cose... Non puoi nemmeno "prenotare" l'id all'apertura della form perchè poi, se il primo che ha aperto la form annulla l'operazione, resta un buco nella numerazione (e per dei protocolli non è il massimo).

Riga 14 è un po' pasticciata. Togli quelle concatenazioni che non servono a nulla.
Visual Basic:
txtprogressivo.Text = "Prot.1/" & Year(Now)

Attento anche a riga 37 che dovrebbe essere strvalue="0". Per come l'hai scritta tu, forzi il cast da numero a stringa. Attento anche alla If di riga 13. 0 è diverso da "0"...
 

Antonio_lmp

Utente abituale
Original poster
19 Febbraio 2018
239
13
18
Lampedusa
2010-2016
OK ti ringrazio tantissimo per la tua risposta.
Tu dici che dovrei lasciare gestire ad DB ma come non ne ho idea.
Allego il file.
 

Powerwin

VBA Expert
Supermoderatore
17 Marzo 2016
20.952
3.491
1.845
vicino a Milano
Office 365