none
DataSet: accesso con NomeTabella.NomeCampo RRS feed

  • Domanda

  • Ciao a tutti ho un problema concettuale.

    Ho una dataset "riempito" con una query che NON conosco a priori e che non produco io (diciamo che la ricevo come parametro dall'esterno). La query potrebbe anche essere un banale "SELECT Clienti.ID, Clienti.RagSoc FROM Clienti".

    Per ora accedo al dataset in questa maniera: mioDataset.Tables[0].Rows[0]["ID"] e tutto funziona correttamente... ma ora ho la necessità di poter accedere in quest'altra maniera: mioDataset.Tables[0].Rows[0]["Clienti.ID"]. Purtroppo per me ricevo dall'esterno anche il nome del campo come stringa e lo uso per recuperare il valore: mioDataset.Tables[0].Rows[0][Campo1].

    Considerando che NON ho quindi potere nè sulla query nè sul campo secondo voi si può fare qcosa?

    Grazie anche solo per la lettura :)


    Al3xI98O
    giovedì 10 novembre 2011 14:46

Risposte

  • Certo! 

    Comprensiva di codice!

    Ho ragionato così (esempio di tag=Clienti.ID):

    1. se il dataset ha una sola tabella: non considero quella nel tag ma solo ciò che c'è dopo il punto (quindi da Clienti.ID tengo conto solo di ID)

    2. se ho più tabelle, spezzo il tag e provo a chiamare quello della tabella corrispondente. Se non c'è restituisco errore!

     

    private string SostituisciTag(string FileDoveSostitutire, string Tag, int NrRiga)
    		{
    			try
    			{
    
    				string[] TagDiviso = Tag.Split('.');
    
    				if (_DatasetReport.Tables.Count == 1) //ho solo una tabella quindi ignoro ciò che vi è nel TAG
    					FileDoveSostitutire = FileDoveSostitutire.Replace(string.Format("<{0}>", Tag), _DatasetReport.Tables[0].Rows[NrRiga][TagDiviso[1]].ToString());
    				else
    					if (_DatasetReport.Tables.Contains(TagDiviso[0]))
    						FileDoveSostitutire = FileDoveSostitutire.Replace(string.Format("<{0}>", Tag), _DatasetReport.Tables[TagDiviso[0]].Rows[NrRiga][TagDiviso[1]].ToString());
    					else
    						FileDoveSostitutire = FileDoveSostitutire.Replace(string.Format("<{0}>", Tag), "TABELLA NON PRESENTE NELLA QUERY/DATASET");
    
    				return FileDoveSostitutire;
    			}
    			catch (Exception ex)
    			{
    
    				...
    			}
    		}
    



    Al3xI98O
    • Contrassegnato come risposta Irina Turcu mercoledì 23 novembre 2011 14:36
    giovedì 17 novembre 2011 14:31

Tutte le risposte

  • ciao

     

    Clienti.ID in genere significa tabella Cliente, colonna ID

    quindi pui scrivere:

    mioDataset.Tables["Clienti"].Rows[0]["ID"]

    puoi splittare i due elementi con

    per splittare con il punto puoi usare appunto .Split


    Antonio Esposito
    MCT, MCPD, MCTS, MCP
    http://dotnetlombardia.org

    Italy
    giovedì 10 novembre 2011 22:05
    Postatore
  • Ciao Antonio la tua soluzione è valida in parte :)

    Se il dataset è popolato con un SqlDataAdapter e non è stato definito un mapping conterrà un Datatable con il nome "Table" e non"Clienti".


    Antonello
    giovedì 10 novembre 2011 22:42
  • Clienti.ID in genere significa tabella Cliente, colonna ID

    quindi pui scrivere:

    mioDataset.Tables["Clienti"].Rows[0]["ID"]


    Ciao, anche io avevo pensato a questa cosa ma, se ho ben capito, nel dataset devo passargli le tabelle una per una specificandole... una sola query con 2 tabelle ce l'ho solo un una Tables di indice 0... Mi sfugge qcosa?
    Al3xI98O
    giovedì 10 novembre 2011 22:56
  • ciao

     

    eh si, se alla creazione del dataset le tabelle non vengono aggiunte con il nome della tabella queste non avranno il nome desiderato...

    ma se sono state create mettendo nel costruttore il nome questo ci sarà correttamente... bisognerebbe provare

     

    Al3xI98O, a dire il vero non ho capito bene cosa intendevi dire con l'ultimo post.. cosa intendi con "devo passargli le tabelle una per una??"

     

    ciao


    Antonio Esposito
    MCT, MCPD, MCTS, MCP
    http://dotnetlombardia.org

    Italy
    giovedì 10 novembre 2011 23:29
    Postatore
  • eh si, se alla creazione del dataset le tabelle non vengono aggiunte con il nome della tabella queste non avranno il nome desiderato...

     

    Al3xI98O, a dire il vero non ho capito bene cosa intendevi dire con l'ultimo post.. cosa intendi con "devo passargli le tabelle una per una??"


    Intendevo quello che hai detto te la riga sopra cioè che le tabelle devono essere aggiunte col nome della tabella... solo che a me arriva una query con eventuale join quindi ho virtualmente sempre e solo una tabella: giusto?
    Al3xI98O
    venerdì 11 novembre 2011 08:18
  • Ciao Al3xI98O,

    Da quanto la vedo io, il nome del campo che ricevi dall’esterno dovrebbe essere un campo della tabella finale (ottenuta mediante lo Join).

    Qualche domanda per te:

    • se ricevi la stringa Clienti.ID dall’esterno, Clienti dovrebbe indicarti quale tabella?
    • ritieni i risultati di query multiple nello stesso DataSet?

     

    Grazie in anticipo per rispondere,


    Irina Turcu

    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    LinkedIn

    • Contrassegnato come risposta Al3xI98O giovedì 17 novembre 2011 14:11
    • Contrassegno come risposta annullato Al3xI98O giovedì 17 novembre 2011 14:11
    giovedì 17 novembre 2011 14:10
  • se ricevi la stringa Clienti.ID dall’esterno, Clienti dovrebbe indicarti quale tabella?
  • In quel caso dovrebbe essere Tabella=Clienti e Campo=ID
  • ritieni i risultati di query multiple nello stesso DataSet?
  • Potenzialmente sì. Il fatto è che i moduli che costruiranno il dataset non li controllo quindi non ho idea di cosa mi arriverà...

    Per ora ho risolto in maniera un po' contorta... magari c'è una via lineare!


    Al3xI98O
    giovedì 17 novembre 2011 14:15
  • Potresti per cortesia condividere la soluzione che hai trovato, così magari avremo un punto di partenza per pensare a qualcos’altro?

     

    Grazie,


    Irina Turcu

    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    LinkedIn

    giovedì 17 novembre 2011 14:25
  • Certo! 

    Comprensiva di codice!

    Ho ragionato così (esempio di tag=Clienti.ID):

    1. se il dataset ha una sola tabella: non considero quella nel tag ma solo ciò che c'è dopo il punto (quindi da Clienti.ID tengo conto solo di ID)

    2. se ho più tabelle, spezzo il tag e provo a chiamare quello della tabella corrispondente. Se non c'è restituisco errore!

     

    private string SostituisciTag(string FileDoveSostitutire, string Tag, int NrRiga)
    		{
    			try
    			{
    
    				string[] TagDiviso = Tag.Split('.');
    
    				if (_DatasetReport.Tables.Count == 1) //ho solo una tabella quindi ignoro ciò che vi è nel TAG
    					FileDoveSostitutire = FileDoveSostitutire.Replace(string.Format("<{0}>", Tag), _DatasetReport.Tables[0].Rows[NrRiga][TagDiviso[1]].ToString());
    				else
    					if (_DatasetReport.Tables.Contains(TagDiviso[0]))
    						FileDoveSostitutire = FileDoveSostitutire.Replace(string.Format("<{0}>", Tag), _DatasetReport.Tables[TagDiviso[0]].Rows[NrRiga][TagDiviso[1]].ToString());
    					else
    						FileDoveSostitutire = FileDoveSostitutire.Replace(string.Format("<{0}>", Tag), "TABELLA NON PRESENTE NELLA QUERY/DATASET");
    
    				return FileDoveSostitutire;
    			}
    			catch (Exception ex)
    			{
    
    				...
    			}
    		}
    



    Al3xI98O
    • Contrassegnato come risposta Irina Turcu mercoledì 23 novembre 2011 14:36
    giovedì 17 novembre 2011 14:31
  • Ciao Al3xI98O,

    Il tuo metodo sembra il più diretto che potevi usare, quindi ti ho evidenziato la soluzione. Importante è che le tabelle abbiano i nomi impostati, quindi che siano state create mettendo nel costruttore il nome, come consigliato prima da Antonio.

     

    Per ogni altri dubbi, sai dove trovarci :)

    Buon coding!


    Irina Turcu

    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    LinkedIn

    mercoledì 23 novembre 2011 14:36
  • Grazie mille :)

    Confermo che ho mantenuto quello come metodo e che funziona!


    Al3xI98O
    mercoledì 23 novembre 2011 15:15