Array in C#

giovedì 28 febbraio 2008 - 17.40

gae58 Profilo | Senior Member

salve, non ho capito dove commetto l'errore.

Ho un file txt con dei campi separati da virgole, questo file contiene arie lInee.

Attraverso il dataREader leggo la riga e attraverso il foreach ed il comando split mi creo l'array.
Il problema è che devo inizializzare l'array e dargli una dimensione che non conosco sin dall'inizio.

il codice è questo:
string[] aRiga = new string[10];
foreach (string s in aRiga)
{
Riga = tr.ReadLine();
aRiga = Riga.Split(',');
tw.WriteLine(aRiga[0]);
}
successivamente il dato lo deco salvare in una tabella MS SQL
come posso fare per evitare questo comando:
string[] aRiga = new string[10];
e quindi il dimensionamento dell'array?

Ho provato la stessa cosa col do while, ma non funziona e non ho capito il perché:
il codice è questo:
string[] aRiga = new string[10];
do
{
Riga = tr.ReadLine();
aRiga = Riga.Split(',');
tw.WriteLine(aRiga[0]);
} while (Riga != null);


qualche aiuto?

grazie

Gaetano

freeteo Profilo | Guru

ciao,
per fare quello che dici io vedrei 3 approcci:
1: usare il metodo della classe "System.IO.File.ReadAllLines()" che torna gia' un array di stringhe pieno di tutte le righe, cosi' puoi girare sulle righe
2: usare un generics, tipo "List<string>" e fare poi l'add della riga man mano che ti serve
3: usare il Slq Bulk Copy di Sql

Il primo è il classico per file non troppo grandi.

Il secondo è "comodo" ma non proprio performante all'aumentare delle righe, pero' è dinamico, e se ti serve un array dopo puoi chiamare il metodo "ToArray()" dopo che l'hai popolato.

Il 3o è quello che ti aiuta di piu' se il tuo lavoro è di importare dentro a sql un file di testo contenente delle righe. Non lo conosco dettagliatamente, percui ti rimando a qualche link che ti possa aiutare, nel caso ovviamente il tuo obbiettivo sia quello di importare dati in sql:
http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file
http://msdn2.microsoft.com/en-us/library/1y8tb169(VS.80).aspx


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

gae58 Profilo | Senior Member

ciao ti ringrazio per la risposta, ma la riga comprende più campi che devo separare ed il 3 metodo non va bene perchè non posso usare il bulk su Aruba.

Ti ringrazio


Gaetano

freeteo Profilo | Guru

>ciao ti ringrazio per la risposta, ma la riga comprende più campi
>che devo separare ed il 3 metodo non va bene perchè non posso
>usare il bulk su Aruba.
si effettivamente quello non si puo' fare...alla fine allora sei riuscito lo stesso?

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

gae58 Profilo | Senior Member

ciao Matte,

si, il codice funziona, essendo inesperto, non mi sono accorto, che durante il ciclo ha dato l'errore, perché un campo data è vuoto. Quindi io mi sono soffermato sul codice e non sul controllo dei dati.
Per la prossima volta mi sai consigliare come posso fare a controllare se il ciclo s'interrompe e se c'è la possibilità di visualizzare i codici o una barra di scorrimento?

grazie


Gaetano

P.S.:
scusami non riesco ad effettuare il controllo su data vuota. Nel file di testo, quando manca il dato le 2 virgole sono consecutive e senza spazio.
Ho provato con questo controllo (C#):
if (aRiga[3] != null)

e con questo
if (aRiga[3] != ""),
ma in nessuno dei due casi mi ritorna la mancanza del dato. Mica sai se c'è qualche comando empty?

grazie

pozzoli.samuele Profilo | Senior Member

in vb si usa una cosa del tutto simila a not isdbnull(campo)...

Al 99,999% c'è una cosa molto molto simile! ;)

gae58 Profilo | Senior Member

provo

grazie
Gaetano

freeteo Profilo | Guru

ciao,
si il controllo da fare è:
if (Riga[3] != DbNull.Value)

in questo caso viene controllato il tipo particolare di valore nullo proveniente dal db.
Il resto dei controlli possono essere corretti se il campo è stringa e ci salvi dentro una data, se invece sul db è data, o sara' nullo (quindi il controllo con DbNull.Value) oppure sara' una data valida, quindi non dovresti avere problemi in questo senso.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

gae58 Profilo | Senior Member

ti ringrazio, nel caso volessi fare il contrario?

DateTime a = DateTime(" / / ");

cioè devo passare ad unca mpo DateTime della Tabella di MS SQL un campo data vuoto
ho provato anche con:
DateTime a = null;

ma non va
Gaetano

pozzoli.samuele Profilo | Senior Member

Grazie teo per la traduzione simultanea!

pozzoli.samuele Profilo | Senior Member

Grazie teo per la traduzione simultanea!

freeteo Profilo | Guru

x Samuele:
di niente, il mio post cominciava con un "si,..." e il "si" era riferito a quello che avevi detto tu del DbNull


x Gaetano:
ma cosa intendi dire che non va, ti da errore la query?
Ma la query come la fai, usi i parametri? se si ti basta mettere un parametro con "DbNull.Value" come valore...oppure impostando nella DataTable sempre questo valore.

Eventualmente prova a postare 1po di codice che cosi' si capisce meglio dove potrebbe essere l'errore.

Grazie.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

gae58 Profilo | Senior Member

grazie a tutti per le risposte, allora
ho un file csv, di cui leggo ogni singola riga. La riga la trasformo in un array attraverso lo Split.
Lo stesso campo può o meno avere la Data e lo controllo attraverso:
if (aRiga[15] != string.Empty)
{
Response.Write("Data Piena");
Data = DateTime.Parse(aRiga[15]);
}
else
{
Response.Write("Data Vuota");
Data = DateTime.Parse(" / / ");
}
Poi valorizzo il parametro con il valore della var Data.

Non riesco a passare la data vuota al dataBase

Spero di essere stato chiaro

ciao


Gaetano

pozzoli.samuele Profilo | Senior Member

Ma che senso ha avere una data vuota?

O è nothing, allora il parse date non funziona oppure una data la deve contenere.

Fare un parse date di (" / / ") non ha proprio senso logico!

Non capisco cosa vuoi fare!

Se devi salvarlo nel db, fa presto, gli assegni un dbnull.value, se invece devi scrivere una data vuota perchè nel db c'è null, gestisci l'eccezione con il codice, riconoscendo il valore dbnull nel db.

Non capisco cosa vuoi fare...

gae58 Profilo | Senior Member

ciao,

non se la logica e la sequenza delle istruzioni che adopero sia giusta.
Ho un array ed alcuni di questi hanno una data.
Assegno alle variabili, il valore dell'array ed in questa controllo se ci sono dei campi data vuoti,

Faccio il controllo e se la data non c'è metto data vuota.
Poi ho definito i parametri ed a questi assegno le variabili.
Poi effettuo l'inserimento nel database.
Ho provato ad assegnare alla variabile il valor dbnull, ma mi ritorna l'errore.
E' per questo che mi serve assegnare una data vuota alla variabile.

Ho trovato un link, me lo leggo e ti faccio sapere se funziona.

ciao
Gaetano

pozzoli.samuele Profilo | Senior Member

>ciao,
>
>non se la logica e la sequenza delle istruzioni che adopero sia
>giusta.

La logica è giusta, per il programmatore che la decide.
Se hai deciso che le operazioni devono essere eseguite in questo modo, non posso dirti altro se non che è giusta.

>Ho un array ed alcuni di questi hanno una data.
>Assegno alle variabili, il valore dell'array ed in questa controllo
>se ci sono dei campi data vuoti,

E' qui che non siamo daccordo! Cosa vuol dire data vuota? Mi fai un esempio? E già che ci sei, mi spieghi anche cosa vuol dire intero vuoto? O Byte vuoto?

Non esiste!

L'unica cosa a cui puoi assegnare un valore "vuoto" è una stringa, perchè non ci metti dei caratteri. Ma la stringa, come variabile, contiene comunque un dato. Una stringa di lunghezza 0.

Un intero vuoto non esiste!

Esiste solo un intero a cui tu hai dato il significato di vuoto! Mettiamo 0....

Lo stesso per le date.

L'unica cosa che si avvicina ad essere una data vuota, è una variabile data acui hai dato il valore di null o nothing o quello che vuoi. Un puntatore, cioè, a nulla. A una posizione di memoria che non esiste. In questo caso, tu puoi capire che il dato contenuto non è valido.

Ma altrimenti, se una variabile esiste, contiene un dato.

Tu devi decidere se quel dato è valido o no.

Non esistono comunque variabili vuote.

Decidi tu, se consideri non attendibile, per esempio, la data del 01/01/1900.

Ma fare il parswe di una data uguale a " / / " non ha senso, non esiste, non potrà mai portare a nessun risultato.

La logica è perfetta, ma si pasa su un principio che non funziona... purtroppo.

>Faccio il controllo e se la data non c'è metto data vuota.
>Poi ho definito i parametri ed a questi assegno le variabili.
>Poi effettuo l'inserimento nel database.
>Ho provato ad assegnare alla variabile il valor dbnull, ma mi
>ritorna l'errore.

Perchè il dbnull, lo devi mettere nel db.

Assegnagli il valore nothing (questo in vb, mi pare sia lo stesso in c#. Se lo scrivi e diventa blu, è giusto.

DBnull, va salvato nel db. Nothing nelle variabili.

>E' per questo che mi serve assegnare una data vuota alla variabile.

Però il concetto di data vuota non esiste. Puoi solo o annullare la variabile o assegnare un valore a cui tu hai dato senso nullo.

>Ho trovato un link, me lo leggo e ti faccio sapere se funziona.

Facci sapè.

>ciao
>Gaetano

gae58 Profilo | Senior Member

ti ringrazio per l'esaurinete spiegazione.

Il file csv è composta da dati separati davirgole e quando la data non è presente è una sequenza di 2 virgole.

1,01/01/2007,a
2,,b

a questo punto per il rigo 2 l'array non avrà alcun valore.

Questo intendo per variabile vuota e quando salvo il movimento mi dice che non può effetuare la trasformazione da string a DateTime

ciao
Gaetano

pozzoli.samuele Profilo | Senior Member

>ti ringrazio per l'esaurinete spiegazione.

Di niente, immaginarsi....

>Il file csv è composta da dati separati davirgole e quando la
>data non è presente è una sequenza di 2 virgole.

Perfetto! Ma sul csv, non hai nemmeno una variabile! E' una stringa!

>1,01/01/2007,a

E qui prenderai l'1 nell'intero, la data 01/01/2007 nella data e a nella stringa. Ok.

>2,,b

E qui prenderai 2 nell'intero, Nothing nella data oppure una tua data che consideri null, come il 01/01/1900, e b nella stringa

>
>a questo punto per il rigo 2 l'array non avrà alcun valore.

La stringa sarà una stringa vuota o tuttal'più nothing

>Questo intendo per variabile vuota e quando salvo il movimento
>mi dice che non può effetuare la trasformazione da string a DateTime

Per forza, perchè lui cerca di convertire una data! E la data non c'è. Quindi non puoi inizializzare una data con una data che non esiste! Punto. Abbandona questo concetto.

Non puoi mettere una data "vuota" in una variabile data, perchè la data "vuota" non esiste.

Puoi solo mettere o una data che per te non ha significato (ti riporto di nuovo l'esempio di prima, se vuoi) oppure metti a nothing la variabile!

>ciao
>Gaetano


Spero di essere stato maggiormente chiaro.

Il problema è che il parse non accetta se non date correttamente formate. " / / ", non è una data correttamente formata. Non riuscirai mai a farla passare.

Dovrai getire i due casi:

1- la data è di lunghezza = ad 8:
|--> la dariabile data è uguale al parse della stringa.
2- la data è di lunghezza diversa (se è di 12 caratteri, di 3, di 7... Saranno date non valide! Al limite 6 caratteri è ammissibile....)
|--> La variabile data va settata a nothing, perchè non esiste una data velida.

Ok?

gae58 Profilo | Senior Member

ti ringrazio, adesso è tutto + chiaro

ciao

Gaetano
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