Secondo voi è un idea folle o si può realizzare?

venerdì 01 agosto 2008 - 08.56

gabriel81 Profilo | Junior Member

Ciao!
Mi è venuta un idea, (forse una pazzia), ma pensavo di creare una classe che inserisce un record nel database(io uso gli mdb).
Il nome della tabella gliela si passerebbe direttamente al costruttore.
Il mio pensiero folle è che se i nomi dei campi nella form sono identici ai nomi delle colonne della tabella da aggiornare, non c'è più bisogno di dire all'adapter:
che nella colonna nome deve mettere la Textbox_nome,che nella colonna cognome deve mettere la Textbox_cognome...ecc ecc

Pensavo ad una sorta di metodo che catturasse(chissà come...) la struttura della tabella,quindi nomi delle colonne e tipo di dato popolando ad esempio un array.
Poi si potrebbe confrontare questo array con l'elenco dei campi sul form per creare un arrai definitivo contenente nome colonna, suo valore immesso nel controllo e tipo di dati.

A questo punto la sintasse dell SQL è presto fatta, creando con un ciclo le varie parti come ad esempio "INSERT INTO " & Me.TabellaDaAggiornare & " ( " & Stringacampi & " ) VALUES (" & StringaValori & ")".

Ovviamente dovrebbe avere inoltre un metodo interno di validazione che controllare a monte la consistenza dei dati.
Se fattibile, questo significherebbe:

Su BottoneSalva.click
Dim NuovoRecord as new ClasseInserimentoRecord("TABELLA_PIPPO")
NuovoRecord.Salva()
Basta.

Secondo voi è un idea folle o si può realizzare?

alx_81 Profilo | Guru

>Ciao!
Ciao!

>Mi è venuta un idea, (forse una pazzia), ma pensavo di creare
>una classe che inserisce un record nel database(io uso gli mdb).
>Il nome della tabella gliela si passerebbe direttamente al costruttore.
>Il mio pensiero folle è che se i nomi dei campi nella form sono
>identici ai nomi delle colonne della tabella da aggiornare, non
>c'è più bisogno di dire all'adapter:
>che nella colonna nome deve mettere la Textbox_nome,che nella
>colonna cognome deve mettere la Textbox_cognome...ecc ecc
Non mi sembra proprio per niente una pazzia , anzi!

>Pensavo ad una sorta di metodo che catturasse(chissà come...)
>la struttura della tabella,quindi nomi delle colonne e tipo di
>dato popolando ad esempio un array.
>Poi si potrebbe confrontare questo array con l'elenco dei campi
>sul form per creare un arrai definitivo contenente nome colonna,
>suo valore immesso nel controllo e tipo di dati.
Sinceramente ci sono una marea di approcci per ottenere quello che ti serve.
Per ottenere i metadati dei tuoi oggetti DB puoi utilizzare SMO (ho scritto un post per usare una classe SMO di esempio qui: http://blogs.dotnethell.it/suxstellino/Classe-Sql-Server-Management-Objects-SMO-per-la-gestione-degli-oggetti-di-un-database__11662.aspx)

>A questo punto la sintasse dell SQL è presto fatta, creando con
>un ciclo le varie parti come ad esempio "INSERT INTO " & Me.TabellaDaAggiornare
>& " ( " & Stringacampi & " ) VALUES (" & StringaValori & ")".
Fai come sempre attenzione a concatenare i valori in questo modo. Piuttosto pensa a definirti dei template (magari su XML) con dei placeholders, andando a fare la sostituzione a runtime.

>Ovviamente dovrebbe avere inoltre un metodo interno di validazione
>che controllare a monte la consistenza dei dati.
>Se fattibile, questo significherebbe:
>
>Su BottoneSalva.click
>Dim NuovoRecord as new ClasseInserimentoRecord("TABELLA_PIPPO")
>NuovoRecord.Salva()
>Basta.
>
>Secondo voi è un idea folle o si può realizzare?
Ci vuole molto impegno ed attenzione, ma si riesce a realizzare eccome. Se ci pensi "basta" vedere la problematica dalla parte delle entità. Parti da un oggetto, ed in base ai suoi elementi descrittivi (metadati) componi una classe standard con le operazioni base. Poi puoi pensare di arricchire la classe con attributi aggiuntivi che definiscono anche il comportamento di una proprietà o di un campo in base al fatto che il progetto sia di tipo web o windows. Il controllo di default associato, ecc..
Lavorando con XML puoi ottenere ottimi risultati..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gabriel81 Profilo | Junior Member

Bene, allora non sono pazzo!!
Però diciamo che non è una banalità... specialmente lavorare con XML, non ci ho mai lavorato...
Fantastico il tuo articolo... io pensavo ad un banalissimo reader.getschema().. secondo te non è sufficiente?

alx_81 Profilo | Guru

>Bene, allora non sono pazzo!!
>Però diciamo che non è una banalità... specialmente lavorare
>con XML, non ci ho mai lavorato...
>Fantastico il tuo articolo... io pensavo ad un banalissimo reader.getschema()..
>secondo te non è sufficiente?
Dipende cosa ti serve.. E poi dipende anche dal DBMS. SMO è solo SQL Server, se vuoi stare generico, devi usare i metodi del .net framework del System.Data.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gabriel81 Profilo | Junior Member

Si, ho risolto così la prima parte.

Dim connessioneoledb As New OleDb.OleDbConnection(My.Settings.AccessConnectionString)
Dim Comandooledb As New OleDb.OleDbCommand("SELECT * FROM TABELLA", connessioneoledb)
connessioneoledb.Open()

Dim lettore As OleDb.OleDbDataReader = Comandooledb.ExecuteReader(CommandBehavior.KeyInfo)
Dim dt As DataTable = lettore.GetSchemaTable()
Me.dt = dt

Ora pensavo di lavorare a runtime con gli array.
Solo se puoi darmi un ultima delucidazione:
Io vengo dal php, dove un array è un array.

Qui ci sono una sfilza infinita di collezioni sorted Of T e chi + ne ha, + ne metta...
Cosa mi conviene usare?

alx_81 Profilo | Guru

>Ora pensavo di lavorare a runtime con gli array.
>Solo se puoi darmi un ultima delucidazione:
>Io vengo dal php, dove un array è un array.
>Qui ci sono una sfilza infinita di collezioni sorted Of T e chi
>+ ne ha, + ne metta...
>Cosa mi conviene usare?
Io utilizzo molto le generics e le List Of.. quelle sotto il namespace System.Collections.Generic.
Sono molto comode. Tu che vuoi fare di preciso con le tue collezioni?

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gabriel81 Profilo | Junior Member

Come ho accennato all'inizio, volevo usare queste collezioni per calcolare a runtime la stringa SQL di insert.
Usare l'XML per me è troppo complesso....
Precisamente pensavo di riempire 1 array con i nomi del columnname dal oledbdatareader.GetSchemaTable() (che ho appena provato: uno spettacolo di metodo!!!)
Poi ciclo per ogni riga dell'array, verificando a quali elementi dell'array corrisponde un omonimo in form.controls, eliminando le righe che non trovano un corrispettivo nei controlli;
contemporaneamente associo il valore del controllo alla riga dell'array.
Ottengo un array con 3 vori per riga: nome colonna, datatype,valore da inserire.
Questo array sarebbe poi da validare, ma sinceramente non ho la più pallida idea di come fare.....
(Certo che usando SQL Server mi basterebbe usare dei triggers, però mi è imposta la scelta di Access.....)

Con questo array passerò alla creazione dell'SQL.

alx_81 Profilo | Guru

>Precisamente pensavo di riempire 1 array con i nomi del columnname
>dal oledbdatareader.GetSchemaTable() (che ho appena provato:
>uno spettacolo di metodo!!!)
>Poi ciclo per ogni riga dell'array, verificando a quali elementi
>dell'array corrisponde un omonimo in form.controls, eliminando
>le righe che non trovano un corrispettivo nei controlli;
>contemporaneamente associo il valore del controllo alla riga
>dell'array.
>Ottengo un array con 3 vori per riga: nome colonna, datatype,valore
>da inserire.
Io fare una classe Colonna con le tre suddette proprietà e poi una classe Tabella con una proprietà che è l'elenco delle colonne (List Of Colonna).
Poi, nella classe Tabella, farei i 4 metodi standard di update, insert, delete e select (quest'ultimo in overload se vuoi farlo per chiave o totale).
Per ottenere le stringhe SQL utilizzerei in ogni metodo la collezione delle colonne.

>Questo array sarebbe poi da validare, ma sinceramente non ho
>la più pallida idea di come fare.....
Che tipo di validazione vuoi fare?
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gabriel81 Profilo | Junior Member

mumble mumble...
mentre cerco di capire la tua idea.... oggi sono + lento del solito, ti spiego cosa intendo per validazione.
Se nel campo data ci metto "vado al mare" e nel campo Importo in € ci metto "ciao", l'applicazione dovrebbe dirmi qualcosa...

alx_81 Profilo | Guru

>mumble mumble...
Farei proprio come fa SMO. Immagina di avere una tabella Utenti con 5 colonne. Farei una classe Utenti con una proprietà Columns che è una List(Of Colonna). Poi una Classe Colonna generica dove metterei gli attributi di una colonna database.

>mentre cerco di capire la tua idea.... oggi sono + lento del
>solito, ti spiego cosa intendo per validazione.
>Se nel campo data ci metto "vado al mare" e nel campo Importo
>in € ci metto "ciao", l'applicazione dovrebbe dirmi qualcosa...
Queste cose te le devi segnare da qualche parte. Quindi o su un db, o su un file XML, magari usando le RegularExpressions

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gabriel81 Profilo | Junior Member

Faccio pratica... ti ringrazio enormamente.
Se dovessi avere altre domande posso disturbarti?

alx_81 Profilo | Guru

>Faccio pratica... ti ringrazio enormamente.
>Se dovessi avere altre domande posso disturbarti?
certo!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gabriel81 Profilo | Junior Member

Scusa, ho difficoltà con list.exist.
Il predicato non viene ben specificato su msdn....

Come faccio a verificare se in una lista è presente un elemento?
La lista è popolata con oggetti colonne che hanno ciascuno le rispettive proprietà nomecolonna, tipo e valore.
vorrei capire se nella lista esiste un oggetto colonna che ha proprietà nomecolonna = "NOME_COLONNA".....

Grazie 1000 in anticipo..

alx_81 Profilo | Guru

>Scusa, ho difficoltà con list.exist.
>Il predicato non viene ben specificato su msdn....
è un po' complesso in effetti..

>Come faccio a verificare se in una lista è presente un elemento?
Consultandomi anche con colleghi, sembrerebbe comodo provare una cosa così:

Public Enum Tipo As Byte t_varchar = 1 t_int = 2 t_short = 3 t_char = 4 t_byte = 5 ' ... End Enum Public Class Colonna #Region "Campi" Private _nome As String Private _valore As String Private _ordinale As Byte Private _tipo As Tipo #End Region #Region "Proprietà" Public Property Nome() As String Get Return _nome End Get Set(ByVal value As String) _nome = value End Set End Property Public Property Valore() As String Get Return _valore End Get Set(ByVal value As String) _valore = value End Set End Property Public Property Ordinale() As Byte Get Return _ordinale End Get Set(ByVal value As Byte) _ordinale = value End Set End Property Public Property Tipo() As Tipo Get Return _tipo End Get Set(ByVal value As Tipo) _tipo = value End Set End Property #End Region End Class Public Class tabella #Region "Campi" Private _colonne As New List(Of Colonna) #End Region #Region "Proprietà" Public ReadOnly Property Colonne() As List(Of Colonna) Get Return _colonne End Get End Property #End Region Public Function findColumn(ByVal NomeColonna As String) As Boolean Dim Esiste As Boolean = False For i As Int32 = 0 To Me.Colonne.Count - 1 If Me.Colonne(i).Nome = NomeColonna Then Esiste = True End If Next Return Esiste End Function End Class

In poche parole ti implementi il metodino tu..

>Grazie 1000 in anticipo..
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gabriel81 Profilo | Junior Member

Wow... ora traffico..

Grazie 5000
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5