10 messaggi dal 24 maggio 2006
Ciao,
spero che qualcuno possa aiutarmi.

Mi spiego (cercando di semplificare al max) da runtime popolo una datatable di un dataset tramite un sqldataadapter, quello che non riesco a fare e' rifiltrare la questa nuova tabella sempre tramite dataadapter, riporto il codice:

Dim conn As SqlConnection
Dim cn As String = ConfigurationManager.ConnectionStrings("esempio").ConnectionString
Dim ds As New DataSet
Dim ad As SqlDataAdapter

conn = New SqlConnection(esempio)
ad = New SqlDataAdapter("select tipologia from tip where mercato='c'", conn)
ad.Fill(ds, "prova")

Dim ad1 As SqlDataAdapter

ad1 = New SqlDataAdapter("select * from prova", conn)
ad1.Fill(ds, "prova1")
Dim kk1 As DataTable
kk1 = ds.Tables("prova1")

For Each dr As DataRow In kk1.Rows

Response.Write(dr("tipologia"))
Next
ovviamente quando arriva a questa istruzione -----> ad1 = New SqlDataAdapter("select * from prova", conn)

non riconosce la tabella prova.....
si puo' fare? se si come?
p.s. ho riportato un esempio banale solo per capire come identificare la tabella.
grazie mille
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

mazinga ha scritto:

ovviamente quando arriva a questa istruzione -----> ad1 = New SqlDataAdapter("select * from prova", conn)
non riconosce la tabella prova.....

E' normale, perché "prova" non è il nome di una tabella nel database, ma è il nome di una DataTable nel tuo DataSet. Non puoi eseguire una query SQL su di essa.

Ma non c'è problema perché puoi utilizzare il metodo .Select del DataTable per filtrare i risultati ulteriormente.

ad = New SqlDataAdapter("select tipologia from tip where mercato='c'", conn)
ad.Fill(ds, "prova")
Dim kk1 As DataRow()
kk1 = ds.Tables("prova").Select("nazione='Italia'")


Come vedi qui ho utilizzato un criterio di filtraggio molto semplice "nazione='Italia'" ma tu puoi contare su una buona varietà di operatori nel definire questo filtro. Ti riporto un link dove trovi la guida e gli esempi. In particolare leggi il paragrafo "Sintassi dell'espressione":
http://msdn.microsoft.com/it-it/library/system.data.datacolumn.expression%28v=vs.80%29.aspx

Questo metodo è adatto se devi solamente scorrere le righe in un ciclo foreach, come nell'esempio che hai postato.

Invece, se devi bindare i risultati ad un controllo come il GridView, allora forse è più indicata una DataView che è, proprio come dice il nome, una "vista" sui dati della tabella. Le DataTable arrivano già "equipaggiate" di una DataView di default su cui puoi agire direttamente per filtrare o ordinare i dati. Trovi un esempio in questo articolo di Daniele.
http://www.aspitalia.com/script/599/Ordinare-Filtrare-DataView-ADO.NET.aspx

ciao,
Modificato da BrightSoul il 28 ottobre 2011 19.51 -

Enjoy learning and just keep making
10 messaggi dal 24 maggio 2006
grazie.

Pongo un altro quesito,supponendo di avere due tabelle nel dataset, che chiameremo tabella a e tabella b ho la necessita di mettere in relazione le due tabelle del dataset e poi ho la necessita di eseguire una serie di query incrociate fra di loro , riporto un esempio:

tabella a
cognome
nome
indirizzo

tabella b
cognome
eta
codice_fiscale

devo mettere in relazione il campo cognome delle due tabelle pi devo fare una query che mi restituisce il cognome e nomedella tabella a e eta della tabella b, quindi il risultato di questa query devo utilizzarlo mettendolo di nuvo in relazione con la tabella b ed estrapolando il cognome della query e il codice_fiscale della tabella b.
Come posso fare con i datatable a sfruttare il risultato della query per esequire una altra query?
in access riesco tranquillamnente a realizzarlo ma in asp.net ho difficolta.
Vi vhiedo inoltre (escluso l'msdn di microsoft) dove posso trovare una documentazione esaustiva in italiano sui dataset .
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
i DataSet hanno la proprietà .Relations che ti permette di creare relazioni tra le tabelle contenute in esso. Potresti creare una relazione che lega le colonne "Cognome" delle due tabelle:
ds.Relations.Add("relazioneSuCognome", dt1.Columns["Cognome"], dt2.Columns["Cognome"]);

Poi, con il metodo .Select, estrai dalla prima tabella tutti i DataRow che recano un certo cognome.
var righe = dt1.Select("Cognome='Rossi'");

e infine fai un foreach sulle righe, invocando per ciascuna il metodo .GetChildRows("relazioneSuCognome") che ti restituisce dalla seconda tabella tutte le righe legate dalla relazione (otterrai quelle che portano lo stesso cognome).

mazinga ha scritto:

in access riesco tranquillamnente a realizzarlo ma in asp.net ho difficolta.

In effetti... ti occorrono veramente DataSet e DataTable? Queste classi si usano in ambienti disconnessi, ovvero quando la connessione al database potrebbe non esserci per gran parte del tempo. La loro peculiarità è quella di salvare i dati su file XML e ricaricarli successivamente per un loro reimpiego (o per inviarli al database quando una connessione ad esso è finalmente disponibile).

Penso che tu possa risolvere la questione con delle query SQL. E' molto più semplice eseguire una JOIN piuttosto che provare a fare la stessa cosa con DataTable e DataSet. Ecco un esempio:
using (var cmd = new SqlCommand()){
cmd.Connection = conn;
cmd.CommandText = "SELECT tabella2.codice_fiscale FROM tabella1 INNER JOIN tabella2 ON tabella1.Cognome=tabella2.Cognome WHERE tabella1.Cognome='Rossi'";
//eseguo il comando SQL e ottengo indietro un DataReader
using (var reader = cmd.ExecuteReader()){
//finché ci sono risultati da leggere...
while (reader.Read()){
//...leggo il campo "codice_fiscale"
 var codice_fiscale = reader["codice_fiscale"];
}
}
}

Qui non ci sono DataTable o DataSet. Infatti, se il database è sempre disponibile si preferisce usare un DbCommand per inviare una query SQL e poi leggere i risultati con un DataReader (restituito dal metodo "ExecuteReader").

mazinga ha scritto:

Vi chiedo inoltre (escluso l'msdn di microsoft) dove posso trovare una documentazione esaustiva in italiano sui dataset.

Qui su aspitalia trovi uno speciale su ADO.NET.
http://www.aspitalia.com/focuson/603/Speciale-ADO.NET-Accesso-Dati-.NET-Framework.aspx

ciao,
Modificato da BrightSoul il 29 ottobre 2011 18.45 -

Enjoy learning and just keep making
10 messaggi dal 24 maggio 2006
BrightSoul ha scritto:


Penso che tu possa risolvere la questione con delle query SQL. E' molto più semplice eseguire una JOIN piuttosto che provare a fare la stessa cosa con DataTable e DataSet. Ecco un esempio:
using (var cmd = new SqlCommand()){
cmd.Connection = conn;
cmd.CommandText = "SELECT tabella2.codice_fiscale FROM tabella1 INNER JOIN tabella2 ON tabella1.Cognome=tabella2.Cognome WHERE tabella1.Cognome='Rossi'";
//eseguo il comando SQL e ottengo indietro un DataReader
using (var reader = cmd.ExecuteReader()){
//finché ci sono risultati da leggere...
while (reader.Read()){
//...leggo il campo "codice_fiscale"
 var codice_fiscale = reader["codice_fiscale"];
}
}
}




grazie della risposta.

scusami se insisto ma per me è un mondo nuovo, ma se io dovessi mettere in relazione il risultato della query che sta nel reader con una altra tabella come si fa?
Ovvero il mio problema e che devo fare dele query che si intrecciano fra di loro...quindi ho la necessità di sfruttare il risultato delle query stesse.

Grazie
Modificato da mazinga il 01 novembre 2011 18.39 -
11.886 messaggi dal 09 febbraio 2002
Contributi
mazinga ha scritto:

scusami se insisto ma per me è un mondo nuovo, ma se io dovessi mettere in relazione il risultato della query che sta nel reader con una altra tabella come si fa?


Le DataTable hanno il metodo .Load che ti consente di caricare righe da un DataReader. Questo è un metodo alternativo a quello che conosci già con il DataAdapter, ma con l'uno o con l'altro otterrai lo stesso risultato.
Quando hai due o più DataTables caricate in un DataSet, puoi metterle in relazione come ti dicevo nel post precedente.

Però, il punto della questione io credo che tu debba risolverlo con query SQL. Infatti le query ti consentono di intrecciare i risultati grazie a JOIN e subqueries. Qui trovi delle slides sul linguaggio SQL
http://www-db.deis.unibo.it/courses/SIL-A/slides.html

Se ti può essere utile, Visual Studio ha un editor visuale di queries, simile a quello che ha anche Access. Lo raggiungi dal pannello "Server Explorer" e poi facendo tasto destro sul tuo database (se non c'è aggiungilo) e poi "New query". Questo ti può aiutare a creare la query che ti restituisce il risultato voluto.

Detto questo, se proprio non si riesce a venirne fuori, come ultima chance puoi impiegare i risultati di una prima query per comporre una seconda. Qui, con la prima query, mi estraggo l'elenco dei codici fiscali di alcune persone e poi li uso per comporre dinamicamente la clausola WHERE di una seconda query.

using (var cmd = new SqlCommand()){
cmd.Connection = conn;
cmd.CommandText = "SELECT tabella2.codice_fiscale FROM tabella1 INNER JOIN tabella2 ON tabella1.Cognome=tabella2.Cognome WHERE tabella1.Cognome='Rossi'";
List<string> codicifiscali = new List<string>();
//eseguo il comando SQL e ottengo indietro un DataReader
using (var reader = cmd.ExecuteReader()){
//leggo tutti i codici fiscali
while (reader.Read()){
//...leggo il campo "codice_fiscale" e lo aggiungo alla lista "codicifiscali" che mi servirà per la seconda query
codicifiscali.Add("'" + reader["codice_fiscale"] + "'");
}
}

//ora uso la lista "codicifiscali" per comporre la clausola where della seconda query
cmd.CommandText = "SELECT * FROM tabella3 WHERE codice_fiscale IN ("+string.Join(",", codicifiscali.ToArray())+")";
using (var reader2 = cmd.ExecuteReader()){
//leggo i valori da questa seconda query
while (reader2.Read()){
//leggo i campi dal secondo reader
}
}

}


ciao,
Modificato da BrightSoul il 01 novembre 2011 20.10 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.