Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74

    vb 2010: eseguire vari select count sulla stessa tabella

    Salve a tutti.

    Nel mio form ho una serie di textbox che devo avvalorare con delle select eseguite su una tabella con varie condizioni where

    Non essendo pratico (vedi firma) ho cercato su internet ed ho trovato il codice necessario per effettuare UN count

    codice:
            Dim CN As New OleDb.OleDbConnection(stringaconn)
            CN.Open()
            Dim cmd As New OleDb.OleDbCommand("Select COUNT(*) FROM dati", CN)
            ttptot.Text = cmd.ExecuteScalar()
            cmd = Nothing
            CN.Close()
    ma dovrei fare anche un count (*) where campo1 = '30'
    e poi un in cui campo1 = '31'
    e poi in cui campo1 = '50'
    ecc ecc (sono 10)
    e poi altri dieci invece di COUNT con SUM

    ma se provo a ripetere il codice, ovviamente mi da errore dicendomi

    codice:
    Errore	2	La variabile locale 'CN' è già dichiarata nel blocco corrente.
    Potreste suggerirmi come fare risolvere ?

    Grazie
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    ti faccio un esempio

    per prima cosa un metodo che restituisce il risultato di aggregazione di una query
    codice:
    '-------------------------------------------------------------------------------------------------
    'Restituisce il risultato di una funzione di aggregazione di una istruzione sql
    'Esegue la query e restituisce la prima colonna della prima riga nel gruppo 
    'di risultati restituito dalla query. 
    'Le colonne o le righe aggiuntive vengono ignorate
    '
    'restituisce Nothing se non trova valore
    'restituisce System.DBNull.Value se trova valore null
    'restituisce object se trova valore
    '-------------------------------------------------------------------------------------------------
    Public Function RisultatoAggregazioneSQL(Connessione As OleDbConnection, stringaSQL As String) As Object
        Dim Comando As OleDbCommand
    
        Try
            Comando = New OleDbCommand(stringaSQL, Connessione)
    
            RisultatoAggregazioneSQL = Comando.ExecuteScalar()
    
        Catch er As Exception
            Throw
        Finally
    
        End Try
    
    End Function

    poi un metodo che restituisce 0 se il risultato della query è dbnull.value
    codice:
    '--------------------------------------------------------------
    'Convert DBNull in 0
    '--------------------------------------------------------------
    Public Function NullToZero(v As Object) As Object
        If v Is DBNull.Value Then
            Return 0
        Else
            Return v
        End If
    
    End Function


    Poi il metodo che fa le interrogazioni:
    codice:
    Option Strict On
    Imports o = System.Data.OleDb
    
    
    Partial Class prove_a
        Inherits System.Web.UI.Page
    
    
        Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
            
    Using con As New o.OleDbConnection(StringaConnessione)
                con.Open()
    
                'conteggio dei record
                Dim v1 As Integer = CInt(RisultatoAggregazioneSQL(con, "select count(*) from campi"))
                PrintLn(v1)
    
                'conteggio dei record con condizione: dà 0
                Dim v2 As Integer = CInt(RisultatoAggregazioneSQL(con, "select count(*) from campi where 1=0"))
                PrintLn(v2)
    
                'somma del campo [double] con condizione
                Dim v3 As Double = CDbl(NullToZero(RisultatoAggregazioneSQL(con, "select sum([double]) from campi where 1=1")))
                PrintLn(v3)
    
                'somma del campo [double] con condizione: dà 0
                Dim v4 As Double = CDbl(NullToZero(RisultatoAggregazioneSQL(con, "select sum([double]) from campi where 1=0")))
                PrintLn(v4)
            End Using
    
        End Sub
    dove a PrintLn puoi sostituire qualunque istruzione che stampi il risultato
    Ultima modifica di pietro09; 29-04-2014 a 08:33
    Pietro

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    ti faccio un esempio

    per prima cosa un metodo che restituisce il risultato di aggregazione di una query
    codice:
    '-------------------------------------------------------------------------------------------------
    'Restituisce il risultato di una funzione di aggregazione di una istruzione sql
    'Esegue la query e restituisce la prima colonna della prima riga nel gruppo 
    'di risultati restituito dalla query. 
    'Le colonne o le righe aggiuntive vengono ignorate
    '
    'restituisce Nothing se non trova valore
    'restituisce System.DBNull.Value se trova valore null
    'restituisce object se trova valore
    '-------------------------------------------------------------------------------------------------
    Public Function RisultatoAggregazioneSQL(Connessione As OleDbConnection, stringaSQL As String) As Object
        Dim Comando As OleDbCommand
    
        Try
            Comando = New OleDbCommand(stringaSQL, Connessione)
    
            RisultatoAggregazioneSQL = Comando.ExecuteScalar()
    
        Catch er As Exception
            Throw
        Finally
    
        End Try
    
    End Function

    poi un metodo che restituisce 0 se il risultato della query è dbnull.value
    codice:
    '--------------------------------------------------------------
    'Convert DBNull in 0
    '--------------------------------------------------------------
    Public Function NullToZero(v As Object) As Object
        If v Is DBNull.Value Then
            Return 0
        Else
            Return v
        End If
    
    End Function


    Poi il metodo che fa le interrogazioni:
    codice:
    Option Strict On
    Imports o = System.Data.OleDb
    
    
    Partial Class prove_a
        Inherits System.Web.UI.Page
    
    
        Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
            
    Using con As New o.OleDbConnection(StringaConnessione)
                con.Open()
    
                'conteggio dei record
                Dim v1 As Integer = CInt(RisultatoAggregazioneSQL(con, "select count(*) from campi"))
                PrintLn(v1)
    
                'conteggio dei record con condizione: dà 0
                Dim v2 As Integer = CInt(RisultatoAggregazioneSQL(con, "select count(*) from campi where 1=0"))
                PrintLn(v2)
    
                'somma del campo [double] con condizione
                Dim v3 As Double = CDbl(NullToZero(RisultatoAggregazioneSQL(con, "select sum([double]) from campi where 1=1")))
                PrintLn(v3)
    
                'somma del campo [double] con condizione: dà 0
                Dim v4 As Double = CDbl(NullToZero(RisultatoAggregazioneSQL(con, "select sum([double]) from campi where 1=0")))
                PrintLn(v4)
            End Using
    
        End Sub
    dove a PrintLn puoi sostituire qualunque istruzione che stampi il risultato
    Ti ringrazio infinitamente per la pazienza e la disponibilità mostrata.
    Sono proprio nuovo di VB.NET (la mia firma ....) e quindi poco esperiente.
    Mi pare di capire da questa istruzione:


    Partial Class prove_a
    Inherits System.Web.UI.Page


    che si parla di WEB.

    In effetti e me ne scuso, non ho specificato nel titolo, che questa operazione va fatta su un archivio MDB locale.
    Non so, quindi, se il codice puo' essere utilizzato o meno (appena posso provero').

    Grazie, comunque.
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    In effetti il codice l'ho collaudato in una pagina web.
    Ma questo non ha nessuna importanza, perchè il codice lo puoi benissimo usare in una windows form per interrogare un database, per esempio Access.
    Come ho detto, invece di mettere
    PrintLn(variabile), metti Me.MioControllo.Text = variabile
    Pietro

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74
    Ho dimenticato di ringraziarti.

    Ho provato e tutto funziona alla perfezione.

    Grazie
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.