+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: [ASP.NET]Classe Recupera e classe inserisci

  1. #1
    ubimaior non è in linea Scolaretto
    Post
    74

    [ASP.NET]Classe Recupera e classe inserisci

    Ciao,
    ancora una volta chiedo aiuto.

    Ho creato una classe che recupera le descrizioni dei prodotti da un database (per l'esattezza un csv, ma è indifferente) partendo dal codice prodotto, l'altra inserisce i dati nel database.


    Classe RagSoc
    codice:
     Private _CodiceCliente As String
        Property CodiceCliente() As String
    
            Get
                Return _CodiceCliente
            End Get
            Set(ByVal value As String)
                _CodiceCliente = value
            End Set
        End Property
    
    
        Private _RagioneSociale As String
        Property RagioneSociale() As String
    
            Get
                Return _RagioneSociale
            End Get
            Set(ByVal value As String)
                _RagioneSociale = value
            End Set
        End Property
    
    
    Public Sub Recupera()
            Dim ConnCsv As New System.Data.OleDb.OleDbConnection
            Dim CustomerCode, CustomerName, strConnString, strSQL As String
    
            strSQL = "SELECT RagioneSociale From tClienti.csv Where CStr(CodiceCliente) = '" & CodiceCliente & "'"
            strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("App_Data/") & _
    ";Extended Properties='TEXT;HDR=Yes;FMT=Delimited;Format=Delimited(;)'"
    
    
            ConnCsv.ConnectionString = strConnString
    
            Try
    
    
    
                Dim dr As OleDbDataReader
    
    
    
                ConnCsv.ConnectionString = strConnString
                With objcomm
                    .Connection = ConnCsv
                    .CommandText = strSQL
                    .CommandType = CommandType.Text
                End With
                ConnCsv.Open()
                'connCsv.Close()
                dr = objcomm.ExecuteReader
    
    
    
                If dr.Read Then
    
    
                    RagioneSociale = dr.GetString(0)
    
                Else
    
                    RagioneSociale = "<font color = 'red'> Codice non presente</font>"
    
    
                End If
    
    
                ConnCsv.Close()
            Catch ex As Exception
                ConnCsv.Close()
    
            End Try
    
    
        End Sub
    Come posso richiamarla nella pagina?
    io ho provato così ma non succede niente:

    codice:
    Dim NomeClienteAs New RagSoc
            Dim RagioneSociale, CustomerCode As String
            CustomerCode = tbCustomerCode.Text
     RagioneSociale = RagSoc.Aggiorna()
    Errore: BC30491: L'espressione non produce un valore.

    Cosa sbaglio?
    Ultima modifica di bumm; 28-10-2011 23:00 

  2. #2
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    codice:
    Dim NomeCliente As New RagSoc
    ok hai creato l'istanza della classe ma tutto il codice che segue - e un mistero.
    in teoria devi assegnare il valore della textbox (tbCustomerCode.Text) alla proprietà (CodiceCliente) dell'istanza NomeCliente e poi invocare il metodo Aggiorna.
    quindi qualcosa del genere:
    codice:
    Dim NomeCliente As New RagSoc
    NomeCliente.CodiceCliente = tbCustomerCode.Text 
    NomeCliente.Aggiorna()
    Dim RagioneSociale as String = NomeCliente.RagioneSociale
    Pero comunque è strutturato male il tuo codice.
    Io farei una classe - Modello es Utenza che ha le proprietà Codice, RagioneSociale
    un'altra classe - ControllerUtenza che ha il metodo GetUtenzaByCodice che ha un parametro(Codice Utenza) e restituisce l'istanza popolata della classe Utenza
    Es:


    ''' <summary>
    ''' La classe utenza - e un modello
    ''' Al suo interno ci deve essere solo la logica di validazione
    ''' </summary>
    ''' <remarks></remarks>
    Public Class Utenza

    ''' <summary>
    ''' Costruttore
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()

    End Sub

    ''' <summary>
    ''' Costruttore con parametri
    ''' </summary>
    ''' <param name="codCliente">Codice cliente</param>
    ''' <param name="ragSociale">Ragione sociale</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal codCliente As String, ByVal ragSociale As String)
    _CodiceCliente = codCliente
    _RagioneSociale = ragSociale
    End Sub

    Private _CodiceCliente As String
    Property CodiceCliente() As String

    Get
    Return _CodiceCliente
    End Get
    Set(ByVal value As String)
    _CodiceCliente = value
    End Set
    End Property


    Private _RagioneSociale As String
    Property RagioneSociale() As String

    Get
    Return _RagioneSociale
    End Get
    Set(ByVal value As String)
    _RagioneSociale = value
    End Set
    End Property
    End Class

    ''' <summary>
    ''' La classe che ti aiuta a recuperare l'istanza della classe Utenza in base ai vari parametri
    ''' Qui puoi mettere anche le procedure di eventuale aggiornamento e.c.c.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class ControllerUtenza

    ''' <summary>
    ''' recupera istanza in base ai parametri
    ''' </summary>
    ''' <param name="codCliente">codice di utenza</param>
    ''' <returns>istanza della classe Utenza specifica</returns>
    ''' <remarks></remarks>
    Public Shared Function GetUtenzaByCode(ByVal codCliente As String) As Utenza
    Dim res As Utenza = Nothing
    Dim ConnCsv As New System.Data.OleDb.OleDbConnection
    Dim CustomerCode, CustomerName, strConnString, strSQL As String
    strSQL = "SELECT CodiceCliente, RagioneSociale From tClienti.csv Where CodiceCliente = '" & codCliente & "'"
    strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("App_Data/") & _
    ";Extended Properties='TEXT;HDR=Yes;FMT=Delimited;Format=Delimited(;)'"

    'il codice di recupero dati
    ' ---
    'fine del tuo codice di recupero

    If dr.Read Then

    CustomerCode = dr.GetString(0)
    CustomerName = dr.GetString(1)
    If Not String.IsNullOrEmpty(CustomerCode) AndAlso Not String.IsNullOrEmpty(CustomerName) Then
    Return New Utenza(CustomerCode, CustomerName)
    End If

    End If


    ConnCsv.Close()
    Catch ex As Exception
    ConnCsv.Close()

    End Try

    Return res
    End Function

    Public Shared Function GetUtenzaByRagioneSociale(ByVal ragSociale As String) As Utenza
    Dim res As Utenza = Nothing
    'codice di recupero

    Return res
    End Function


    End Class


    naturalmente per recuperare l'istanza della classe Utenza con un CodiceCliente specifico:

    Dim a As Utenza = ControllerUtenza.GetUtenzaByCode(" codice utente")
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

  3. #3
    ubimaior non è in linea Scolaretto
    Post
    74
    Grazie, ora studio il codice e cerco di applicarlo anche alla classe che recupera la descrizione dei prodotti.
    In realtà la pagina che sto cercando di riorganizzare una pagina che inserisce dati in un database ma prima fa dei controlli sull'accesso, recupera le descrizioni, fa calcoli e dato il nome del dipendente, scrive il relativo codice nel db: 1890 righe (e non è la più lunga)...
    Troppe e troppo confuse.

  4. #4
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    L'architettura dell'applicativo - e una cosa molto importante. Il primo e gravissimo errore - mettere il codice di accesso al database in una pagina.
    Non si può costruire le applicazioni scalabili seguendo questo approccio.
    Se un domani dovrai passare su una RDBMS diversa es Postgres o ppure Oracle? E se un domani dovrai realizzare una versione per un dispositivo mobile? Cosa farai? Dovrai riscrivere tutta l'applicazione.
    Nelle pagine devi operare con gli Controller che ti restituiscono gli Oggetti Business.
    Se posso consigliarti - abbandona i WebForms e passa a MVC.
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

  5. #5
    ubimaior non è in linea Scolaretto
    Post
    74
    Il prossimo passo sarà quello di passare a MVC, però devo ancora studiarlo.
    Ora il mio problema è capire le classi.
    Sai quando c'è un concetto, magari semplice per molti, che proprio non ti entra in testa?
    L'applicazione che ho creato è complessa: permette di inserire delle "issues", carica in automatico le descrizioni dei prodotti, alcune caratteristiche come il segmento di appartenenza, la ragione sociale del cliente, facendo risparmiare tempo al compilatore. Inserisce i dati nel db, permette vari gradi di approvazioni dei diversi manager, invia notifiche via email, estrae dati per i KPI ecc..
    Però il codice è un casino e ogni volta che mi chiedono una modifica impazisco.
    Il programma l'ho creato di mia iniziativa, non mi è stato commissionato dall'azienda (sono un impiegato, non un IT). L'ho fatto per eliminare un inutile giro di carta e di lavoro. E' piaciuto e lo hanno adottato.
    Il problema è che alcune parti di codice sono ripetute in più pagine e sono astruse (alcune pagine raggiungono le 3000 righe).
    Voglio capire come sfruttare le classi.

    Ho usato, modificandola un pò, la classe che mi hai suggerito e sono riuscito a recuperare la ragione sociale.
    Ho provato ad aggiungere l'email ma mi ha dato errore, proverò ancora.
    Ho però un paio di domande.
    Se non ti scoccia "ti uso" per capire.

    1):
    codice:
    Public Shared Function GetUtenzaByRagioneSociale(ByVal ragSociale As String) As Utenza
            Dim res As Utenza = Nothing
            'codice di recupero
    
            Return res
        End Function
    Ha una funzione o l'hai messa in previsione di un utilizzo futuro?
    Non riesco a capire l'utilità.

    2) Perché mi dà errore se uso la connectionstring dal web.config?

    Web config:

    codice:
    <connectionStrings>
    
        <add name="tClientiConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\eccs\App_Data\tClienti.csv; 
             ExtendedProperties='Text;HDR=Yes;FMT=Delimited;Format=Delimited(;)'"/>
             
           
    	</connectionStrings>
    Codice:
    codice:
    Dim ConnCsv As New System.Data.OleDb.OleDbConnection(ConfigurationSettings.AppSettings("tClientiConnectionString").ToString)
    Errore:
    System.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto.

    Eppure
    codice:
     Dim Connessione As New OleDbConnection(ConfigurationSettings.AppSettings("AccessConn").ToString)
    no dà errore.

  6. #6
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    Rispondo prima alle domande:
    1) La funzione restituisce l'istanza della classe utenza e non solo la ragione sociale.
    Quindi passi l'id della utenza alla funzione ed avrai la classe popolata con i dati della utenza(compresa email, nome ragione sociale e.c.c.)
    Quindi il codice che dovresti inserire li deve:
    - creare l'istanza della classe (Dim res As Utenza = Nothing)
    - andare sul DB(o altra sorgente), eseguire una "SELECT * FROM tabella WHERE id_utenza = ?" dove ? - il codice di utenza passato come parametro.
    - popolare l'istanza con i dati restituiti dalla query
    (
    res.CodiceCliente = DataReader("CodiceUtente") ,
    res.RagioneSociale = DataReader("RagioneSociale")
    )
    - restituire l'istanza popolata della classe: (Return res)

    A questo punto puoi usare quella classe per bindarla ai controlli Web.
    Quindi, separando la logica di popolamento della classe e visualizzazione - non devi riscrivere i metodi di accesso ai dati su ogni pagina.

    2)Non funziona probabilmente perché usi il percorso assoluto e il processo di IIS non ha diritti di accedere a quella directory. Provi a mettere il file in un percorso relativo e modificare il percorso su relativo.

    Ora il mio problema è capire le classi.
    Sai quando c'è un concetto, magari semplice per molti, che proprio non ti entra in testa?
    Senza un buon libro la vedo dura...

    Per sfruttarli veramente al massimo - devi studiare i concetti di OOP(Object oriented programming) Programmazione orientata agli oggetti - Wikipedia
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

  7. #7
    ubimaior non è in linea Scolaretto
    Post
    74
    Quote Originariamente inviato da bumm Visualizza il messaggio
    Rispondo prima alle domande:
    1) La funzione restituisce l'istanza della classe utenza e non solo la ragione sociale.
    Quindi passi l'id della utenza alla funzione ed avrai la classe popolata con i dati della utenza(compresa email, nome ragione sociale e.c.c.)
    Quindi il codice che dovresti inserire li deve:
    - creare l'istanza della classe (Dim res As Utenza = Nothing)
    - andare sul DB(o altra sorgente), eseguire una "SELECT * FROM tabella WHERE id_utenza = ?" dove ? - il codice di utenza passato come parametro.
    - popolare l'istanza con i dati restituiti dalla query
    (
    res.CodiceCliente = DataReader("CodiceUtente") ,
    res.RagioneSociale = DataReader("RagioneSociale")
    )
    - restituire l'istanza popolata della classe: (Return res)
    Io ho provato a farlo usando il metodo GetUtenzaByCode.

    Ho aggiunto la proprietà Email, ho aggiunto il parametro Email sia in "New", sia in GetUtenzaByCode.

    Ho aggiunto Email nella quary e ho impostato: Email = dr.GetString(2).


    Quindi ho sbagliato a farlo con GetUtenzaByCode e avrei dovuto inserire i metodi di estrazione in GetUtenzaByRagioneSociale?

    Quote Originariamente inviato da bumm Visualizza il messaggio
    Senza un buon libro la vedo dura...

    Di libri ne ho preso 2:
    1) ASP.NET - Guida completa (Apogeo) qualche anno fa. Secondo me è un buon libro, anche se ormai superato.


    Però fa l'esempio della classe quando ancora fa gli esempi di pagine con markup + codice.
    Infatti il mio problema non è creare una classe che faccia determinate cose.
    Il mio problema è crearla fuori dal code behind e poi richiamarla.
    In teoria è semplice.
    Istanzio la classe poi chiamo il metodo così: NomeIstanza.NomeMetodo().
    Però provo e non riesco.

    Ora sto leggendo, ma ho iniziato da poco, "Beginning ASP.NET in C# and VB".
    Anche questo mi sembra buono.
    Tu hai qualche testo da suggerire?

  8. #8
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    Ho aggiunto la proprietà Email, ho aggiunto il parametro Email sia in "New", sia in GetUtenzaByCode.
    Questo non l'ho capito. Hai messo Email in costruttore di cosa?

    Il mio problema è crearla fuori dal code behind e poi richiamarla.
    In teoria è semplice.
    Istanzio la classe poi chiamo il metodo così: NomeIstanza.NomeMetodo().
    Però provo e non riesco.
    Un tipo di risposta che detesto! "provo e non riesco"-allora cosa fai? ti rassegni?
    Se non riesci, sicuramente c'e un motivo.
    - Ti da qualche errore?
    - Hai provato a mettere il punto di interruzione per vedere lo stato degli variabili?



    Tu hai qualche testo da suggerire?
    MSDN Library (italiano)
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

  9. #9
    ubimaior non è in linea Scolaretto
    Post
    74
    Quote Originariamente inviato da bumm Visualizza il messaggio
    Questo non l'ho capito. Hai messo Email in costruttore di cosa?
    Volevo dire che ho aggiunto l proprietà

    codice:
    Private _EmailCliente As String
        Property EmailCliente() As String
    
            Get
                Return _EmailCliente
            End Get
            Set(ByVal value As String)
                _EmailCliente = value
            End Set
        End Property
    Poi nel costruttore ho aggiunto “mailCliente”:
    codice:
        Public Sub New(ByVal codCliente As String, ByVal ragSociale As String, ByVal mailCliente As String)
            _EmailCliente = mailCliente
            _CodiceCliente = codCliente
            _RagioneSociale = ragSociale
        End Sub
    In “GetUtenzaByCode”:

    codice:
    strSQL = "SELECT CodiceCliente, RagioneSociale, Email From tClienti.csv Where CodiceCliente = '" & codCliente & "'"
    e
    codice:
    mailCliente = dr.GetString(2)
      If Not String.IsNullOrEmpty(CustomerCode) AndAlso Not String.IsNullOrEmpty(CustomerName) Then
                        Return New Utenza(CustomerCode, CustomerName, CustomerMail)
                    End If


    A quanto pare però non dovevo metterlo lì, giusto?





    Quote Originariamente inviato da bumm Visualizza il messaggio
    Un tipo di risposta che detesto! "provo e non riesco"-allora cosa fai? ti rassegni?

    In effeti mancava un “ancora”. Non ho intenzione di smettere di provare. Come ho detto all’inizio, il mio obiettivo è capire. L’applicazione funzionante l’ho già fatta, anche se molto incasinata a livello di codice.

    Quote Originariamente inviato da bumm Visualizza il messaggio
    - Ti da qualche errore?
    Dopo vari tentativi ed errori di casting risolti: System.Data.OleDb.OleDbException: Nessun valore specificato per alcuni parametri necessari.

    Riga 121: dr = objcomm.ExecuteReader

    Sembra che non ho messo dei parametri nella stringa.

    Però il mio problema non è trovare la soluzione per questo errore.

    E’ (se ho interpretato bene ciò che mi hai scritto prima) capire perché devo mettere il metodo in GetUtenzaByRagioneSociale e non posso fare come descritto qua, semplicemente ricalcando il codice esistente, aggiungendo la variabile CustomerMail dove già ci sono CustomerCode e CustomerName.

  10. #10
    L'avatar di bumm
    bumm non è in linea Very Important Person Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Luogo
    Bologna
    Post
    2,142
    Blogs
    1
    A quanto pare però non dovevo metterlo lì, giusto?
    No, l'hai messo li dove deve essere.E giusto cosi.

    Riga 121: dr = objcomm.ExecuteReader
    Di sicuro c'e qualcosa nella tua query che non va...

    E’ (se ho interpretato bene ciò che mi hai scritto prima) capire perché devo mettere il metodo in GetUtenzaByRagioneSociale e non posso fare come descritto qua, semplicemente ricalcando il codice esistente, aggiungendo la variabile CustomerMail dove già ci sono CustomerCode e CustomerName.
    Puoi anche non creare la funzione "GetUtenzaByRagioneSociale" se devi cercare solo su CodiceUtenza, oppure, se devi cercare su tutti i 3 campi, puoi creare la funzione universale GetUtenzaByParams che accetta tutti e 3 parametri(CodiceUtenza, RagioneSociale, Email). Poi nel corpo della funziona confronti i valori e se sono Null non li includi nella clausola WHERE della tua query.
    "HeloWorld.exe" 17 errors, 31 warnings.

    Non mi mandate le richieste di aiuto via PM! Non vi risponderò! Tutte le domande fateli sul forum!

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi