Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET] Un Dataset con due tabelle???

Devo ficcare 2 tabelle in un Dataset, ma non unite tra di loro...
Il bello è che o non riesco a riempirle con i dati o non riesco neanche ad
aggiungerle nel Dataset (e DataAdapter...)...
Io ho bisogno solo di un Dataset con due stramaledette tabelle di un
database di Access con cui fare poi una DataRelation...
Mi date una mano per favore?

 Mi date una mano per favore?
Volentieri, però dicci come avresti fatto tu, tanto per avere un punto di
partenza.
--
Salutoni
Sergio

 Mi date una mano per favore?
Qualche indicazione in piů?
Grazie. :-)
Saluti,
Antonio
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Webmaster 
www.visualcsharp.it
"Great spirits have always encountered violent opposition
from mediocre minds." A.Einstein
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 partenza.
Ok, io ho generato una OLEDbConnection che si connette ad un Database di
Access...
dopodiché ho generato un OLEDbDataAdapter con una SQL query che mette dentro
le due tabelle del database (secondo me è qui l'errore...)...
Poi ho fatto una data relation 1aMolti per collegare le due tabelle con un
effetto speciale...Pure sto pezzo va...;)

 dentro le due tabelle del database (secondo me è qui l'errore...)...
(snip)
Posta, per favore, il pezzo di codice in cui costruisci il dataadapter, in cui
generi l'istruzione sql e quello dove richiami il metodo fill del dataadapter,
se no da queste parti si lavora al buio.
--
Salutoni
Sergio


Ecco qui...
Me.OleDbConnection1.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data
Source=C:\Documen" & _
"ts and Settings\Alessandro.PANGUANETA\Documenti\Progetti di Visual
Studio\Test D" & _
"atabase\bin\Test.mdb;Mode=Share Deny None;Extended Properties="""";Jet
OLEDB:Syste" & _
"m database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database
Password="""";Jet OLED" & _
"B:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial
Bulk " & _
"Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database
Password="""";Je" & _
"t OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet
OLEDB:" & _
"Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica
Repair=Fals" & _
"e;Jet OLEDB:SFP=False"
Me.OleDbDataAdapter1.DeleteCommand = Me.OleDbDeleteCommand1
Me.OleDbDataAdapter1.InsertCommand = Me.OleDbInsertCommand1
Me.OleDbDataAdapter1.SelectCommand = Me.OleDbSelectCommand1
Me.OleDbDataAdapter1.TableMappings.AddRange(New
System.Data.Common.DataTableMapping() {New
System.Data.Common.DataTableMapping("Table", "Personale", New
System.Data.Common.DataColumnMapping() {New
System.Data.Common.DataColumnMapping("ID", "ID"), New
System.Data.Common.DataColumnMapping("Nome", "Nome"), New
System.Data.Common.DataColumnMapping("Cognome", "Cognome"), New
System.Data.Common.DataColumnMapping("Età", "Età")})})
Me.OleDbDataAdapter1.UpdateCommand = Me.OleDbUpdateCommand1
Me.OleDbSelectCommand1.CommandText = "SELECT Cognome, Età, ID, Nome FROM
Personale"
Me.OleDbSelectCommand1.Connection = Me.OleDbConnection1
OleDbDataAdapter1.Fill(DataSet11, "Personale")
Dim Relazione As New DataRelation("Settore",
DataSet11.Personale.Columns("ID"), DataSet11.Settore.Columns("OperaioID"))
DataSet11.Relations.Add(Relazione)

 System.Data.Common.DataColumnMapping("Età", "Età")})})
Prima perplessità:
non ho una grande esperienza di dataset e datatable, ma perchè tiri impiedi un
mulino per mappare i nomi dei campi del datatable allo stesso nome che hanno nel
database?
Seconda perplessità:
il codice che hai postato carica un datatable solo: dove è quello per caricare
la tabella "settore"?
--
Salutoni
Sergio

 la tabella "settore"?
 è qui il punto...Non me lo carica...L'ho messo io a mano nello schema XML
che viene generato quando si carica il DataSet, ma il generatore di SQL mi
dice che non posso usare più di due tabelle...
Ma se non posso usare 2 tabelle in un DataSet, che cavolo l'hanno inventato
a fare il DataRelation???Boh...

 e DataSet l'ho fatto dalla finestra di progettazione...
Allora, perdonami, ma passo.
Non so come si usano le finestre di progettazione, personalmente le odio e cerco
di farne a meno in qualsiasi situazione, perchè non amo usare delle cose che
fanno quello che vogliono loro piuttosto di quello che voglio io....
--
Salutoni
Sergio

fanno quello che vogliono loro piuttosto di quello che voglio io....
Che poi, imho tutto 'sto casino per non scrivere una join in sql...
-- 
ciao, hal

 Che poi, imho tutto 'sto casino per non scrivere una join >in sql...
No, la join non va bene...
Io le tabelle le devo tenere separate, non unite!!!

Io le tabelle le devo tenere separate, non unite!!!
Scusami, ammetto di non avere ancora approfondito 
ADO.NET
, ma non ti
seguo :-(
Nel codice, che hai gentilmente pubblicato, hai scritto, fra l'altro:
<codice>
Dim Relazione As New DataRelation("Settore",
DataSet11.Personale.Columns("ID"),
DataSet11.Settore.Columns("OperaioID"))
DataSet11.Relations.Add(Relazione)
</codice>
Mi par di capire che metti in relazione (in join, quindi) le due
tabelle Personale/Settore.
Dino Esposito, scrive, a proposito delle Relations:
<citazione>
To represent parent/child data relationships in 
ADO.NET
, you are
expected to use the DataRelation object. If you're familiar with ADO
data shaping, you'll soon recognize, under the hood of a DataRelation
object, the SHAPE language code snippet that I just showed above.
In 
ADO.NET
, a DataRelation object is used to establish an in-memory
relationship between two DataTable objects. The relationship sets on
matching values found in one column the two tables have in common. A
column in 
ADO.NET
 is represented by the DataColumn object. 
</citazione>
Da come la capisco io, viene fatto fare al client un lavoro che il
database server farebbe di gran lunga meglio. Capisco che Intel abbia
dei Pentium IV da vendere, ma...
Parlando seriamente: IMHO mi sembra che quello che vuoi fare tu possa
essere veramente tanto semplificato servendoti una opportuna view nel
database.
-- 
ciao, hal

 select, e vediamo cosa succede
Succede che funziona!!!
Grazie a tutti per il prezioso aiuto, posto il codice di seguito...
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Try
Connessione.ConnectionString = StringaConnessione
Connessione.Open()
Dim Sql1 As String = "SELECT * FROM Personale;"
Dim Sql2 As String = "SELECT * FROM Settore;"
Dim Adapter1 As New OleDbDataAdapter(Sql1, Connessione)
Dim Adapter2 As New OleDbDataAdapter(Sql2, Connessione)
Adapter1.Fill(DataSet, "Personale")
Adapter2.Fill(DataSet, "Settore")
Dim Relazione As New DataRelation("Rel",
DataSet.Tables.Item(0).Columns("ID"),
DataSet.Tables.Item(1).Columns("OperaioID"))
DataSet.Relations.Add(Relazione)
DataGrid1.DataSource = DataSet
Catch ex As Exception
MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK,
MessageBoxIcon.Error, MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly)
Finally
Connessione.Close()
End Try
End Sub
Quindi avendo la Tabella Personale con...
Mone=Mario
Cognome=Rossi
ID=1
e la tabella Settore con...
OperaioID=1
Macchina=Pressa
e con...
OperaioID=1
Macchina=Leviga
Ho associato Mario Rossi sia alla Leviga che alla Pressa...e posso vedere il
tutto con semplicità e una sola DataGrid...

 vedere il tutto con semplicità e una sola DataGrid...
Oooh... questa parte mi interessa.....
In che senso lo vedi con una sola datagrid?
Intendi dire con il segno più posto sul selettore di record alla sinistra della
datagrid?
--
Salutoni
Sergio

visto che funziona?
:-)))
però, occhio, non dire che non volevi legare le tabelle tra di loro, perchè
così in realtà l'hai fatto!
:-)
altri consigli: oltre alla Connection, chiudi anche il DataAdapter, non ti
serve più.....
il dataset contiene la copia del database, una copia in locale.......
al massimo devi riaprirla se devi rileggere, o se devi fare un .Update.....
good coding!!!
p.s. --> hai visto quante righe di codice in meno?
:-))
--
Damiani Liborio Igor
ig...@igordamiani.it
 - 
soft...@igordamiani.it
 - 
idam...@hotmail.com
http://www.igordamiani.it
ICQ : 11847262


La relation serve per costruire relazioni 1aMolti, ti faccio un esempio...
Hai una tabella con campi descrittivi di una persona...
Devi relazionare questa tabella con un altra tabella che contiene i settori
di una fabbrica...
In questo modo, hai che un record della prima tabella (una persona
quindi...) corrisponde a più record della seconda tabella (la pressa, la
mensa, il cesso...)...
Con un join invece unirei semplicemente le due tabelle... e la cosa non mi
garba per niente...
Io voglio la relazione di cui sopra...

Io voglio la relazione di cui sopra...
Continua pure cosi'... :-(
-- 
ciao, hal

riprendiamo da qua, che ne dite?
:-))
allora, il discorso č questo.....approfondendo un attimo il 3ed tra CSSoft,
Alessandro e hal1961...
il tutto un po' teoricamente.....non ho .NET sottomano, al momento.....
un dataset č una copia in locale di un db (o, piů esattamente di una sua
parte)......
questo vuol dire che puň contenere uno o piů tabelle......ok?
a parte il codice che crea l'OleDB.OleDBConnection e compagnia bella, la
parte succosa č:
OleDbDataAdapter1.Fill(DataSet11, "Personale")
questo prende il DataAdapter, che rappresenta il collegamento fisico con il
db, prende la tabella "Personale" e riempe DataSet11 con la tabella in
questione......
a questo punto prova a vedere DataSet11.Tables.Count e vedrai che ti
restituisce 1......
adesso puoi mettere dentro la seconda tabella.......
OleDbDataAdapter1.Fill(DataSet11, "Settore")
a questo punto prova a vedere DataSet11.Tables.Count e vedrai che ti
restituisce 2......
conclusione: basta, il gioco č fatto.....
come hanno detto gli altri, se crei un DataRelation, vuol dire che vuoi
creare una relazione tra le due tabelle. A quanto dici, tu non vuoi farlo,
perciň evita di crearlo......
non solo, effettivamente c'č un sacco di codice ridondante......se hai un
libro 
ADO.NET
, anche di basso livello, prova a seguire gli esempi: vedrai
che quello che hai fatto tu in x righe, lo puoi fare tranquillamente con 1/3
delle righe, credimi, č cosě......
good coding!!!


Ok, ci sono...Ho fatto tutto quello che mi avete consigliato generando
questo...
Public Class Form1
Inherits System.Windows.Forms.Form
Dim StringaConnessione As String = "Provider=Microsoft.jet.OLEDB.4.0; Data
Source=C:\Documents and Settings\Alessandro.PANGUANETA\Documenti\Progetti di
Visual Studio\Test Database\bin\Test.mdb;"
Dim WithEvents Connessione As New OleDbConnection()
Dim DataSet As New DataSet()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Try
Connessione.ConnectionString = StringaConnessione
Connessione.Open()
Dim Sql As String = "SELECT * FROM Personale;SELECT * FROM Settore"
Dim Adapter As New OleDbDataAdapter(Sql, Connessione)
Adapter.Fill(DataSet, "Personale")
Adapter.Fill(DataSet, "Settore")
Dim Relazione As New DataRelation("Rel",
DataSet.Tables.Item(0).Columns("ID"),
DataSet.Tables.Item(1).Columns("OperaioID"))
DataSet.Relations.Add(Relazione)
DataGrid1.DataSource = DataSet
Catch ex As Exception
MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK,
MessageBoxIcon.Error, MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly)
Finally
Connessione.Close()
End Try
End Sub
#Region "Stato Connessione"
Private Sub Connessione_StateChange(ByVal sender As Object, ByVal e As
System.Data.StateChangeEventArgs) Handles Connessione.StateChange
If (e.CurrentState And ConnectionState.Open) <> 0 Then
StatusBar.Text = "Connessione Aperta"
ElseIf e.CurrentState = ConnectionState.Closed Then
StatusBar.Text = "Connessione Chiusa"
ElseIf e.CurrentState = ConnectionState.Broken Then
StatusBar.Text = "Connessione Fallita"
End If
End Sub
#End Region
End Class
Il problema è che questo mi da un errore sulla stringa Sql (che ho chiamato
appunto Sql...); qual'è la stringa giusta da mettere per ficcare le due
tabelle nell'OleDbDataAdapter???

 ficcare le due tabelle nell'OleDbDataAdapter???
Prova a fare due distinti oledbadapter, ciascuno con la sua istruzione di
select, e vediamo cosa succede
--
Salutoni
Sergio

 good coding!!!
In che senso chiuderlo?Con Dispose?
Ma poi per riaprirlo devo ridimensionarlo?


 datagrid?
Esatto; Bindo solo la prima tabella con
DataGrid1.SetDataBinding(DataSet, "Personale")
E mi viene fuori il segno piů per tutti gli operai che lavorano su una o piů
macchine...

sì, lo chiudo, ma credo sia effice un
.Dispose
= Nothing
sì, certo, lo devi ridimensionare. Ma il vantaggio è che tu lavori su una
copia *locale* del db; in pratica, .net ti crea in RAM (con matrici, array e
tutto il resto) il database, con la possibilità quindi di lavorare in
modalità disconnessa.......
se il dataset contiene dati in sola-lettura, allora è l'ideale, perchè leggi
il db solo all'inizio, poi basta......non ti serve più avere una connessione
aperta......
occhio, però, secondo quanto dicono Balena e M$, quando riempi il dataset,
devi cercare di essere il più selettivo possibile. Se le tabelle Settore e
Personale sono molto grandi, tutto questo discorso non va bene.......quindi
dipende un po'......in teoria devi cercare di riempire il dataset con query
che ti prendano i dati effettivi che hai bisogno.....
good coding!!!
