Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Consigli per App con Database
Forum - C# / VB.NET - [VB.NET] Consigli per App con Database

Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 15:57
Lunedì, 29/08/2011
Ciao Ragazzi...
Continuazione della domanda
http://www.pierotofy.it/pages/extras/forum/16/1030328-[vbn ...
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:
Codice sorgente - presumibilmente VB.NET

  1. If lstDati.SelectedItems.Count <> 1 Then Exit Sub
  2.  
  3.         Dim MyID As Integer = CInt(lstDati.SelectedItems(0).SubItems(0).Text)
  4.         Dim cmdquery As New OleDbCommand
  5.         Dim p As New OleDbParameter
  6.         Dim adapter As New OleDbDataAdapter
  7.         p.Value = MyID
  8.         p.ParameterName = "@ID"
  9.         p.OleDbType = OleDbType.Integer
  10.         Try
  11.             conn.Open()
  12.             cmdquery.Parameters.Add(p)
  13.             cmdquery.CommandText = Query.CercaID
  14.             cmdquery.Connection = conn
  15.             adapter.SelectCommand = cmdquery
  16. '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 il 30/08/2011 alle 17:42


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 23:52
Venerdì, 02/09/2011
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.
Codice sorgente - presumibilmente VB.NET

  1. Public Function QueryByString(ByVal myquery As String, ByVal pValue As String, ByVal pName As String) As DataTable
  2.             Dim cmdquery As New OleDbCommand
  3.             Dim p As New OleDbParameter
  4.             Dim td As New DataTable
  5.             Dim Adapter As New OleDbDataAdapter
  6.             Dim conn As New OleDbConnection
  7.             conn.ConnectionString = MyDB.DBINfo.ConnectionString
  8.  
  9.             p.ParameterName = pName
  10.             p.Value = pValue
  11.             p.OleDbType = OleDbType.Char
  12.             cmdquery.Parameters.Add(p)
  13.             cmdquery.Connection = conn
  14.             cmdquery.CommandText = myquery
  15.             Try
  16.                 conn.Open()
  17.                 Adapter.SelectCommand = cmdquery
  18.                 Adapter.Fill(td)
  19.             Catch ex As Exception
  20.                 Debug.Print(ex.Message)
  21.             Finally
  22.                 conn.Close()
  23.             End Try
  24.             Return td
  25.         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
Codice sorgente - presumibilmente VB.NET

  1. If lstDati.SelectedItems.Count > 1 Then Exit Sub
  2.        
  3. Dim SelectedID As Integer = CInt(lstDati.SelectedItems(0).SubItems(0).Text)
  4.      
  5.         Dim d As New DialogData(SelectedID)
  6.         d.ShowDialog()
  7.  
  8. ... codice dialog
  9.  
  10. Public Sub New(Optional ByVal selectedID As Integer = -1)
  11. If selectedID <> -1 Then
  12.             _ID = selectedID
  13.             _td = QueryByID(MyDB.Query.CercaID, _ID, "@ID")
  14.            '_td è una datatable della classe dialog, che contiene i dati della tupla da editare
  15.         InitializeComponent()


Chiamo poi una funzione che riempie i vari controlli della dialog box, siano essi textbox o altro.
La funzione è questa:
Codice sorgente - presumibilmente VB.NET

  1. Public Sub FillControl(ByVal r As DataRow) 'datarow con i miei dati
  2.         Dim Nc As String 'nome del controllo
  3.         For Each c As Control In Me.FlowLayoutPanel1.Controls
  4.             If TypeOf c Is TextBox Then
  5.                 Nc = CStr(c.Tag) 'la tag del controllo contiene il nome della colonna con il dato associato
  6.                 If Not IsDBNull(r(Nc)) Then c.Text = CStr(r(Nc))
  7.             End If
  8.         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:
Codice sorgente - presumibilmente VB.NET

  1. [Code]
  2. Public Function QueryUpdateTd(ByVal MyquerySelect As String, ByVal IDp As Integer, ByVal pName As String, ByVal td As DataTable) As Integer
  3.             Dim conn As New OleDbConnection
  4.             Dim adapter As OleDbDataAdapter
  5.             Dim cmd As New OleDbCommand
  6.             Dim cmdB As New OleDbCommandBuilder
  7.             Dim p As New OleDbParameter
  8.             Dim result As Integer
  9.  
  10.             conn.ConnectionString = MyDB.DBINfo.ConnectionString
  11.             cmd.CommandText = MyquerySelect 'uso la stessa query che ha generato la datatable i cui dati sono mostrati nella dialogbox
  12.             p.Value = IDp 'passo il parametro ID della tupla da modificare
  13.             p.ParameterName = pName
  14.             p.OleDbType = OleDbType.Integer
  15.  
  16.             cmd.Parameters.Add(p)
  17.             cmd.Connection = conn
  18.             Try
  19.                 conn.Open()
  20. 'apro un adapter che presenta la stessa struttura di td
  21.                 adapter = New OleDbDataAdapter(cmd)
  22.                 cmdB.QuotePrefix = "["
  23.                 cmdB.QuoteSuffix = "]"
  24. 'uso il commandBuilder
  25.                 cmdB.DataAdapter = adapter
  26.                 result = adapter.Update(td)
  27.             Catch ex As Exception
  28.                 Debug.Print(ex.Message)
  29.             Finally
  30.                 conn.Close()
  31.             End Try
  32.  
  33.             Return result
  34.         End Function
  35. [/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 il 02/09/2011 alle 23:56


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 11:18
Giovedì, 08/09/2011
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ì?


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 14:42
Giovedì, 08/09/2011
A me non risponde mai nessuno.. :_doubt::(:-|:alert::grr:


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote