Newsgroup: it.comp.www.asp
Titolo: [ASP.net/OleDb] usare tabelle Joinate

Allora,
sono un dot-nettaro alle prime armi, e non ho ben
chiaro (giuro che goooooglo da 2 ore) come si fa
una cosa... prima volta in assoluto che accedo ai
Db da .NET...
Ho un oggetto (Search) che ha tra le proprietà
DataTable table
string    primaryKey
Questa table va riempita con una JOIN (OLEDB) tra due
o piu' tabelle. Una commandstring di esempio:
SELECT * FROM tabella,foreignTabella WHERE tabella.campo = 
foreignTabella.foreignTabellaPrimaryKey
------------------------------------------------------
SCOPO: ottenere un oggetto che formatti una tabella
Access (non uso DataGrid perchè la formattazione può
non essere necessariamente HTML e perchè sto portando
del codica da ASP a 
ASP.NET
) con header, body ripetuto
tra righe, footer.
A questo oggetto fornisco il nome della tabella, e imposto
header, footer ed un body con degli alias tipo ...#campo1#...,
#campo2#, #numeroRiga#, eccetera...
Lui estrae primary key, valori dei campi da sostituire,
se richiesto crea una FORM in HTML per ricerca e/o
editing, se richiesto formatta i dati (con stringhe,
currency, sostituisce i campi null con roba varia),
crea i campi HTML INPUT appropriati (con combo box o
radiobuttons per le foreign keys)
e sostituisce le chiavi esterne col valore di riferimento
appropriato nella tabella esterna.
L'ho già creato in Classic ASP e va una bellezza :)
--- Domanda 0) C'è qualche oggetto di cui ignoro l'esistenza
che mi permetta ciò con meno sbattimenti?
------------------------------------------------------
--- Domanda 1) La querystring è corretta?
Poi, come procedo?
Come riempio il DataSet e alla fine ottengo la tabella?
Premetto che devo ottenere anche la primaryKey della
tabella.
Con una tabella sola (senza join) ottenevo il tutto con i metodi
che poi ho incollato.
Ora ho provato a modificarli ma succede "qualcosa"
alla lista delle Tables del dataSet (prima accedevo
all'unica tabella con DataTable table = ....Tables[0]).
PRIMO METODO: popola una NameValue collection con le chiavi
esterne, {"campoInt","tabExt.campoExt"}
         public NameValueCollection GetForeignKeys (string table)
         {
             string connectionString = Config.dbConnString;
             OleDbConnection conn = new OleDbConnection(connectionString);
             NameValueCollection keys = new NameValueCollection();
             conn.Open();
             Guid guid = OleDbSchemaGuid.Foreign_Keys;
             object[] filter = new object[] { 
null,null,null,null,null,table};
             DataTable schemaTable = conn.GetOleDbSchemaTable(guid,filter);
             foreach (DataRow dataRow in schemaTable.Rows)
             {
                 string fkField = 
Convert.ToString(dataRow["FK_COLUMN_NAME"]);
                 string fkTable = 
Convert.ToString(dataRow["FK_TABLE_NAME"]);
                 string pkField = 
Convert.ToString(dataRow["PK_COLUMN_NAME"]);
                 string pkTable = 
Convert.ToString(dataRow["PK_TABLE_NAME"]);
                 keys.Add(fkField,pkTable+"."+pkField);
             }
             conn.Close();
             return keys;
         }
SECONDO METODO
         public DataSet GetDataSetFromQuery (string select, string table)
         {
             NameValueCollection fk = this.GetForeignKeys(table);
             string foreignTableList = "";
             string where = " WHERE 1=1 ";
             foreach (string key in fk.AllKeys)
             {
                 string value = fk.GetValues(key)[0];
                 string tableVal = value.Split('.')[0];
                 foreignTableList += ","+tableVal;
                 where += "AND "+value+"="+this.tableName+"."+key;
             }
             string connectionString = Config.dbConnString;
             OleDbConnection conn = new OleDbConnection(connectionString);
             string commandString = "Select "+select+" from 
"+table+foreignTableList+where;
             OleDbDataAdapter myDataAdapter = new 
OleDbDataAdapter(commandString, conn);
             DataSet myDataSet = new DataSet( );
             myDataAdapter.Fill(myDataSet,table); <--- Qui il dilemma!
             myDataAdapter.FillSchema(myDataSet, SchemaType.Source,table);
             return myDataSet;
         }
Ora ho il Table[0] che genera un'eccezione Index out of bounds...
--- Domanda 2) Aprire piu' connection come ho fatto è poco performante?
Come posso ovviare, nel caso affermativo?
--- Domanda 3) Il DataAdapter.Fill devo ripeterlo per ogni tabella? O ci 
sono modi piu' indolori?
--- Domanda 4) Posso ottenere le relazioni dal DataSet invece che con
questo metodo farraginoso (Metodo 1) in altri modi? Se sì come?
--- Domanda 5) Insomma sto codice è sicuramente strutturato male :/
Esempio, potevo creare un modo meno tamarro per gestire le chiavi
esterne che non sputarle in una stringa...
Prometto una benedizione dal parroco locale a chi mi sa tirare le 
orecchie in modo esaustivo :)

 
Non rispondete, ho risolto e chiedo scusa per i kb
che la mia ignoranza vi ha fatto scaricare :)