Usare array per confrontare

lunedì 26 novembre 2007 - 20.03

crostino75 Profilo | Newbie

Ciao ragazzi

vorrei utilizzare un array che mi consente di confrontare ogni singolo valore dell'array stesso con il mese in corso e, in caso di eguaglianza, aggiungere il dato (prelevato da un DB) ad una dropdownlist. Ho scritto un paio di righe di codice... però mi capita che se prelevo l'array da DB
Dim test() As String = {Me.reader("trem")}
non funziona, se lo scrivo "as is" Dim test() As String = {1,2,11} il codice mi funziona... cosa può essere? Vi ringrazio
Emanuele

Me.WJVA.Open() Me.OleDbCommand1.Parameters(0).Value = "URRR" reader = Me.OleDbCommand1.ExecuteReader Dim mese As String = System.DateTime.Now.Month Do Do While reader.Read() Dim test() As String = {Me.reader("trem")} Dim test2 As String For Each test2 In test If test2 = mese Then Me.DropDownList2.Items.Add(Me.reader("arrivalICAO")) Else End If Next Loop Loop While reader.NextResult() Me.DropDownList2.DataBind() End Sub

alx_81 Profilo | Guru

>Ciao ragazzi
Ciao!
>
>vorrei utilizzare un array che mi consente di confrontare ogni
>singolo valore dell'array stesso con il mese in corso e, in caso
>di eguaglianza, aggiungere il dato (prelevato da un DB) ad una
>dropdownlist. Ho scritto un paio di righe di codice... però mi
>capita che se prelevo l'array da DB Dim test() As String = {Me.reader("trem")}
>non funziona, se lo scrivo "as is" Dim test() As String = {1,2,11}
>il codice mi funziona... cosa può essere?
Tu non aggiungi il valore all'array in quel modo. Per aggiungere un elemento ad un array devi inserire il valore nella posizione specifica.
Devi utilizzare la Redim Preserve inoltre per ridefinire, ad ogni ciclo, l'array (solo VBNet).
Ma eccoti un esempio pratico..

Step:
Un datatable che contiene dei dati di prova (simile al tuo datareader, la differenza è come lo scorro, tu userai la reader.read()).
Un array inizialmente vuoto
Un ciclo sulle righe del datatable
Un test sul mese corrente
L'aggiunta del dato nell'array

Esempio:


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



>Vi ringrazio Emanuele
Di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

crostino75 Profilo | Newbie

Non mi sono spiegato bene,
io non devo aggiungere valori ad un array, perché questi valori
già sono definiti a priori.

Piuttosto, i valori di questo array sono, o dovrebbero essere
prelevati da un DB

infatti
se io provo con Dim test() As String = {1,2,11}
il mio codice gira a dovere
se provo con Dim test() As String = {me.reader("valoriarr")}
dove nella riga valoriarr il reader legge 1,2,11
il codice non funziona.

Ecco,
il mio problema sta nel portare dal DB all'array questi valori,
non riesco a capire perché non possa leggere correttamente
1,2,11... ho fatto CAST diogni ordine e grado... ma non va

Spero di essermi spiegato meglio

emanuele

alx_81 Profilo | Guru

>Non mi sono spiegato bene,
>io non devo aggiungere valori ad un array, perché questi valori
>già sono definiti a priori.>
>Piuttosto, i valori di questo array sono, o dovrebbero essere
>prelevati da un DB
>
>infatti
>se io provo con Dim test() As String = {1,2,11}
>il mio codice gira a dovere
>se provo con Dim test() As String = {me.reader("valoriarr")}
>dove nella riga valoriarr il reader legge 1,2,11
>il codice non funziona.
Tu hai nel campo proprio i valori separati da virgola? Non farlo mai.. il campo di una tabella, per essere almeno in 1a forma normale (http://it.wikipedia.org/wiki/Normalizzazione_del_database#Prima_Forma_Normale) deve avere valori atomici e non gruppi di valori. La soluzione migliore sarebbe avere quei valori in verticale, per poter scorrere il reader ed aggiungere, con la procedura che ti ho illustrato prima, i valori nell'array. Anche se questa non è la tua richiesta, prendilo comunque come un consiglio.
Definire come hai fatto tu comunque non funziona perchè il campo valoriarr torna una stringa con l'elenco dei valori (immagino), ma siccome per il framework quella è una stringa, ti fa al massimo un array con un elemento che vale "1,2,11". Per fare quello che ti serve, utilizzando quel campo non normalizzato. devi splittare la stringa per la virgola, ciclare l'array che la String.Split ti torna e poi inserire i valori nell'array.

Se posso permettermi, ti do un paio di consigli:
- Usa l'option strict attivato (Tools-->Option-->Projects and solutions-->VB Defaults in visual studio) che non ti fa fare conversioni pericolose rendendo il codice fortemente tipizzato. Tipo
Dim test() As String = {1,2,11}
ti darebbe errore, poichè definisci un array di stringhe, ma metti degli interi come elementi. Per prevenire errori di questo tipo, usa l'option strict (C# è strict, non ti da la possibilità di fare queste cose, è decisamente più avanti )

- Evita campi csv, ragiona in verticale. Se avessi avuto tre righe invece che tre valori csv avresti una più corretta e semplice gestione del caso. Ragiona in forma più normale possibile.

>
>Ecco,
>il mio problema sta nel portare dal DB all'array questi valori,
>non riesco a capire perché non possa leggere correttamente
>1,2,11... ho fatto CAST diogni ordine e grado... ma non va
il cast non conta.. tu stai idealmente cercando di trasformare la stringa che ti torna in un elenco.
>Spero di essermi spiegato meglio
anche io
>
questo è quanto, fammi sapere poi come decidi di risolvere.
Ciao!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

crostino75 Profilo | Newbie

Ciao,

per la "tipizzazione" ti ringrazio di cuore per il consiglio, è sempre utile migliorare.

Per i dati csv, concordo in peno e, in effetti, non era mia intenzione usare le virgole.

Per la verticalizzazione del DB, se hai la pazienza di leggermi, ti spiego il mio contesto:

mi hanno chiesto di sviluppare un paio di paginette per la gestione di un DB già esistente. In questo, tutto a scopo amatoriale/ludico, vengono catalogati i voli per una compagnia di volo virtuale (si sfrutta il Microsoft Flight Simulator).

Il DB, grossomodo, è così strutturato:

|da_dove_parto|dove_arrivo|link_pagina_descrizione|

i voli sono 76.

Verticalizzare il DB comporta aggiungere una colonna "mese" e per ognuno dei 76 voli dire in quale mese questo volo è disponibile, avrei 76*12 = 912 righe
a questo aggiungi che gli aeroporti nel mondo sono circa 36000 e, cmq, per ogni volo dovrei mantenere il link alla pagina descrizione volo...

... mi è sembrato consono aggiungere la colonna "mese" ma di utilizzare la stessa in orizzontale (l'array) usando qualcosa del genere 1p2p3p4p5p6p7p8p9p10p11p12.

Non conoscevo, io ignorante, la funzione split ed oggi sono riuscito a splittare la stringa ed ad ciclarla per l'array.

Certo, atomizzare il DB è la soluzione più "elegante", questo è fuor di dubbio... e ti ringrazio ancora per aver segnalato il link al wiki in argomento.

Hai qualche suggerimento ancora da donarmi?

Ti saluto.

Emanuele

alx_81 Profilo | Guru

>Ciao,
Ciao!
>
>per la "tipizzazione" ti ringrazio di cuore per il consiglio,
>è sempre utile migliorare.
verissimo
>
>Per i dati csv, concordo in peno e, in effetti, non era mia intenzione
>usare le virgole.
>Per la verticalizzazione del DB, se hai la pazienza di leggermi,
>ti spiego il mio contesto:
>
>mi hanno chiesto di sviluppare un paio di paginette per la gestione
>di un DB già esistente. In questo, tutto a scopo amatoriale/ludico,
>vengono catalogati i voli per una compagnia di volo virtuale
>(si sfrutta il Microsoft Flight Simulator).
>
>Il DB, grossomodo, è così strutturato:
>
>|da_dove_parto|dove_arrivo|link_pagina_descrizione|
>
>i voli sono 76.
>
>Verticalizzare il DB comporta aggiungere una colonna "mese" e
>per ognuno dei 76 voli dire in quale mese questo volo è disponibile,
>avrei 76*12 = 912 righe
>a questo aggiungi che gli aeroporti nel mondo sono circa 36000
>e, cmq, per ogni volo dovrei mantenere il link alla pagina descrizione
>volo...
>
>... mi è sembrato consono aggiungere la colonna "mese" ma di
>utilizzare la stessa in orizzontale (l'array) usando qualcosa
>del genere 1p2p3p4p5p6p7p8p9p10p11p12.
>
>Non conoscevo, io ignorante, la funzione split ed oggi sono riuscito
>a splittare la stringa ed ad ciclarla per l'array.
>
>Certo, atomizzare il DB è la soluzione più "elegante", questo
>è fuor di dubbio... e ti ringrazio ancora per aver segnalato
>il link al wiki in argomento.
>
>Hai qualche suggerimento ancora da donarmi?
Personalmente il database lo farei in un modo un pochino diverso. Se non ho capito male hai una tabella Voli.
Ecco come lo progetterei (a grandi linee):

- Tabella Voli: IDVolo PK ed identità (intero), IDCittaPartenza (intero), IDCittaArrivo (intero), link (stringa)
- Tabella Citta: IDCitta PK identità (intero), Nome (stringa)
- Tabella Mesi: IDVolo (intero), Mese (intero) (con PK su entrambi i campi)
- relazione tra Voli e Città su i campi IDCittaPartenza e IDCittaArrivo.
- relazione tra Voli e Mesi in 1:N su IDVolo

In questo modo hai 76 righe sulla Voli, 76*12 righe sulla Mesi (ma con occupazione di spazio minima grazie ai tipi più snelli).
Citta avrà solo le righe di ogni città aggiunta. Come vedi, normalizzando in questo modo tutte e tre le tabelle sono molto leggere.
Ora, non so che DBMS utilizzi, però un relazionale funziona meglio con una logica di questo tipo.
Alla fine è sufficiente mettere in join le tre tabelle in maniera opportuna per ottenere quello che ti serve con ottime prestazioni.
Vedi tu poi che strada seguire.

>Ti saluto.
Ciao!

Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5