Oppure

Loading
29/08/11 13:57
Renny
Ciao Ragazzi...
Continuazione della domanda
pierotofy.it/pages/extras/forum/16/1030328-[vbnetconsigli_per_database_relazionale_con_parametri/
Ho deciso di usare Access per gestire il db. Ho scritto le query con l'IDE VS10 (davvero portentoso) e usando 1 o 2 parametri va tutto bene... Con la query filtro dei dati e riempio una listbox mettendo Nome, cognome, data di nascita e mansione ecc.
Ho visto poi tra le varie opzioni il framework Entity, ma a dire il vero non c'ho capito granchè. Comunque sono giusto alla conclusione forse la soluzione migliore, in termini di performance, è quella di usare un modello "misto". Mi collego al DB tramite query, cioè le mie ricerche tramite parametri e i dati che recupero li passo a una datatable non tipizzata. In questo modo carico in memoria sono una mimina parte, mentre il grosso dei dati rimane nel database. Giusto?
Ora però vorrei predisporre una DialogBox che permetta sia di editare i dati sia di Inserirne di nuovi. A partire della listView, seleziono un singolo recorset, lo carico dal DB con una query per ID e poi metto la tupla(?)in un dataset tipizzato contenente un singolo recorset del db, praticamente una sola row.
Quindi:
If lstDati.SelectedItems.Count <> 1 Then Exit Sub

        Dim MyID As Integer = CInt(lstDati.SelectedItems(0).SubItems(0).Text)
        Dim cmdquery As New OleDbCommand
        Dim p As New OleDbParameter
        Dim adapter As New OleDbDataAdapter
        p.Value = MyID
        p.ParameterName = "@ID"
        p.OleDbType = OleDbType.Integer
        Try
            conn.Open()
            cmdquery.Parameters.Add(p)
            cmdquery.CommandText = Query.CercaID
            cmdquery.Connection = conn
            adapter.SelectCommand = cmdquery
'Apapter.Fill??

A questo punto dovrei usare l'adapter con fill, per riempire il mio dataset tipizzato (che ho realizzato con VS).. Giusto? Su "Origine dati" mi mostra il mio dataset tipizzato, ma quello che non riesco a fare è istanziarlo.. :(
Qual'è il modo migliore poi per mostrare i dati nella dialogBox. Se poi l'utente modifica qualcosa, come si procede per salvare le modifiche?
E in caso di un nuovo inserimento?
Devo dire di essere un po' confuso/confusivo.. :_doubt:
Ultima modifica effettuata da Renny 30/08/11 15:42
aaa
02/09/11 21:52
Renny
Bene, ciao a tutti.
Dopo vari tentativi ho predisposto il mio progetto usando delle funzioni shared che, passata la query come parametro di ingresso restituiscono la datatable con i dati richiesti. Per prima cosa riempio una listview con alcune colonne dei mio db, che contengono i dati salienti (Nome, cognome, ecc";)
Tramite la seguente funzione posso fare ricerche.
Public Function QueryByString(ByVal myquery As String, ByVal pValue As String, ByVal pName As String) As DataTable
            Dim cmdquery As New OleDbCommand
            Dim p As New OleDbParameter
            Dim td As New DataTable
            Dim Adapter As New OleDbDataAdapter
            Dim conn As New OleDbConnection
            conn.ConnectionString = MyDB.DBINfo.ConnectionString

            p.ParameterName = pName
            p.Value = pValue
            p.OleDbType = OleDbType.Char
            cmdquery.Parameters.Add(p)
            cmdquery.Connection = conn
            cmdquery.CommandText = myquery
            Try
                conn.Open()
                Adapter.SelectCommand = cmdquery
                Adapter.Fill(td)
            Catch ex As Exception
                Debug.Print(ex.Message)
            Finally
                conn.Close()
            End Try
            Return td
        End Function

Se sono state ritrovare delle corrispondenze aggiorno la listview.
Ho predisposto un tasto EDIT, per modificare i dati del DB. L'utente seleziona una riga della listview e premendo edit faccio aprire un form dialog
If lstDati.SelectedItems.Count > 1 Then Exit Sub
        
Dim SelectedID As Integer = CInt(lstDati.SelectedItems(0).SubItems(0).Text)
     
        Dim d As New DialogData(SelectedID)
        d.ShowDialog()

... codice dialog

Public Sub New(Optional ByVal selectedID As Integer = -1)
If selectedID <> -1 Then
            _ID = selectedID
            _td = QueryByID(MyDB.Query.CercaID, _ID, "@ID")
           '_td è una datatable della classe dialog, che contiene i dati della tupla da editare
        InitializeComponent()

Chiamo poi una funzione che riempie i vari controlli della dialog box, siano essi textbox o altro.
La funzione è questa:
Public Sub FillControl(ByVal r As DataRow) 'datarow con i miei dati
        Dim Nc As String 'nome del controllo 
        For Each c As Control In Me.FlowLayoutPanel1.Controls
            If TypeOf c Is TextBox Then
                Nc = CStr(c.Tag) 'la tag del controllo contiene il nome della colonna con il dato associato
                If Not IsDBNull(r(Nc)) Then c.Text = CStr(r(Nc))
            End If
        Next
I miei dubbi sono:
1) nella dialog ho anche dei dateTimePicker, che non espongono la proprietà Text ma solo Value. C, come controllo generico non ha "value". Come posso fare, senza assegnare il valore a mano?
2) Tra le tabella del mio Db c'è una relazione 1 a molti: soggetto con 1 mansione. So come fare la query con il join tra le tabelle, però se poi devo fare l'update dei dati, ho letto che non si può fare con + tabelle alla volta.. Per l'update dei dati pensavo di usare la seguente funzione:
[Code]
Public Function QueryUpdateTd(ByVal MyquerySelect As String, ByVal IDp As Integer, ByVal pName As String, ByVal td As DataTable) As Integer
Dim conn As New OleDbConnection
Dim adapter As OleDbDataAdapter
Dim cmd As New OleDbCommand
Dim cmdB As New OleDbCommandBuilder
Dim p As New OleDbParameter
Dim result As Integer

conn.ConnectionString = MyDB.DBINfo.ConnectionString
cmd.CommandText = MyquerySelect 'uso la stessa query che ha generato la datatable i cui dati sono mostrati nella dialogbox
p.Value = IDp 'passo il parametro ID della tupla da modificare
p.ParameterName = pName
p.OleDbType = OleDbType.Integer

cmd.Parameters.Add(p)
cmd.Connection = conn
Try
conn.Open()
'apro un adapter che presenta la stessa struttura di td
adapter = New OleDbDataAdapter(cmd)
cmdB.QuotePrefix = "["
cmdB.QuoteSuffix = "]"
'uso il commandBuilder
cmdB.DataAdapter = adapter
result = adapter.Update(td)
Catch ex As Exception
Debug.Print(ex.Message)
Finally
conn.Close()
End Try

Return result
End Function
[/Code]
4) Dalla form principale vorrei aggiungere anche un tasto Nuovo Record, e caricare la dialogbox vuota. Per aggiungere la nuova riga volevo usare sempre il commandBuilder. C'è un modo per creare un oggetto datarow che presenti la stessa struttura della td, senza creare fare adapter.fill(td)?

Come vi sembra questo codice? C'è un modo migliore e più ordinato di procedere?? Grazie.:asd:
Ultima modifica effettuata da Renny 02/09/11 21:56
aaa
08/09/11 9:18
Renny
Bene..
Volevo porre ora una domanda un po "concettuale"... Al di là del codice, che bene o male si trova anche in internet, da scopiazzare e riutilizzare..
Ho scritto la mia classe database, che contiene le mie funzioni per eseguire le query sul Database, restituendo come parametro un datatable che poi con varie sub viene mostrato nei controlli. Praticamente procedo con datatable non tipizzati. Ho creato anche delle sub per l'update, l'insert e il delete dei record, ricreando nella sub uno scheletro minimo del datatable, modificando i dati (secondo parametri in ingresso alla sub) e usando poi l'adapter per eseguire l'update. Tutto funziona, bene o male.
Premessa: nel mio progetto ho 3 form, "1 principale" e 2 dialog, che uso per modificare o aggiungere dati alle 2 tabelle del DB.
Question: Devo in ogni classe Form dichiarare un nuovo oggetto Database, per accedere ai metodi che espone? In via teorica si comporta come un Modulo, offrendo solo metodi statici, però per poter usare l'overloads ho preferito definire Database come una classe.. Ha senso organizzare il lavoro così?
aaa
08/09/11 12:42
Renny
A me non risponde mai nessuno.. :_doubt::(:-|:alert::grr:
aaa