Ciclo di rottura codice in c#

martedì 08 gennaio 2008 - 13.43

fustaman Profilo | Junior Member

Ho una situazione abbastanza classica da risolvere, solo che in c# non ho la + pallida idea di come poterlo fare.

Devo ciclare su una tabella di un db ordinata per codice e fondamentalmente fare delle operazioni una volta per ogni codice ed altre una volta per ogni riga. insomma il classico esempio di ciclo a rottura di codice che in un altro linguaggio (es asp classico) avrei fatto + o - cosi:

do while (not rs.eof)
codice = rs("codice")
istruzioni....
do while (rs("codice) = codice)
istruzioni....
rs.movenext
if rs.eof then exit do
loop
istruzioni....
loop

Ma in c# aprendo la tabella con un Datareader, che non ha la proprietà di eof non ho prorpio idea di come ricreare questo tipo di algoritmo. Qualcuno mi può dare una dritta?

Grazie mille!!!

SSUPERPIPPO Profilo | Guru

>Ho una situazione abbastanza classica da risolvere, solo che
>in c# non ho la + pallida idea di come poterlo fare.
>
>Devo ciclare su una tabella di un db ordinata per codice e fondamentalmente
>fare delle operazioni una volta per ogni codice ed altre una
>volta per ogni riga. insomma il classico esempio di ciclo a rottura
>di codice che in un altro linguaggio (es asp classico) avrei
>fatto + o - cosi:
>
>do while (not rs.eof)
> codice = rs("codice")
> istruzioni....
> do while (rs("codice) = codice)
> istruzioni....
> rs.movenext
> if rs.eof then exit do
> loop
> istruzioni....
>loop
>
>Ma in c# aprendo la tabella con un Datareader, che non ha la
>proprietà di eof non ho prorpio idea di come ricreare questo
>tipo di algoritmo. Qualcuno mi può dare una dritta?
>
>Grazie mille!!!

Il ciclo sarà di questo tipo:

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

Ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

fustaman Profilo | Junior Member

Ok fino a qui ci arrivavo, ma ho bisogno di fare la rottura codice ossia fare alcune delle operazioni solo una volta per ogni codice (quindi gruppo di record) ed altre una per ogni record.

SSUPERPIPPO Profilo | Guru

>Ok fino a qui ci arrivavo, ma ho bisogno di fare la rottura codice
>ossia fare alcune delle operazioni solo una volta per ogni codice
>(quindi gruppo di record) ed altre una per ogni record.

Mi pareva che il tuo problema fosse la non presenza di eof...
L'istruzione sarà quindi la seguente:

do while TuoRecordSet.Read
codice=TuoRecordSet.Item("codice")
' istruzioni.....
do while TuoRecordSet.Read
if TuoRecordSet.Item("codice")=codice then
' istruzioni
else
exit do
end if
Loop
Loop

Così dovrebbe funzionare

Ciao

Alessandro

>do while (not rs.eof)
> codice = rs("codice")
> istruzioni....
> do while (rs("codice) = codice)
> istruzioni....
> rs.movenext
> if rs.eof then exit do
> loop
> istruzioni....
>loop

http://blogs.dotnethell.it/alebadalin

fustaman Profilo | Junior Member

non credo funzioni, secondo me cosi le istruzioni dentro al secondo ciclo le esegue solo dal 2° record in poi e non sul primo.

forse è il caso che spieghi meglio quello che devo fare, devo aggiornare un catalogo di album di mp3 prendendo i dati da una tabella di aggiornamento fatta + o - così:

cod cd - titolo cd - titolo traccia - interprete traccia - autore traccia - ......
001 - cd1 - traccia 1 - interprete 1 - autore 1
001 - cd1 - traccia 2 - interprete 1 - autore 2
001 - cd1 - traccia 3 - interprete 1 - autore 3
002 - cd 2 - traccia 1 - interprete 2 - autore 4
002 - cd 2 - traccia 2 - initerprete 2 - autore 2
....................................................................................................


quello che devo fare è per ogni cd (quindi una sola volta per ogni cod cd) fare una verifica se il codice eiste già nella tabella del database da aggiornare, poi in base al risultato di questa verifica per ogni riga indipendentemente dal codice cd, devo prendere gli altri dati ed inserirli o aggiornarli nell'altra tabella.

Vorrei evitare di fare una query di verifica per ogni riga appesantendo cosi la procedura che già non sarà leggera vista la mole di dati.
In asp classico lo avrei risolto agevolmente con l'algoritmo che ho postato sopra, ma in c# con un datareader prorpio non so come fare.

SSUPERPIPPO Profilo | Guru

>non credo funzioni, secondo me cosi le istruzioni dentro al secondo
>ciclo le esegue solo dal 2° record in poi e non sul primo.
>
>forse è il caso che spieghi meglio quello che devo fare, devo
>aggiornare un catalogo di album di mp3 prendendo i dati da una
>tabella di aggiornamento fatta + o - così:
>
>cod cd - titolo cd - titolo traccia - interprete traccia - autore
>traccia - ......
>001 - cd1 - traccia 1 - interprete 1
>- autore 1
>001 - cd1 - traccia 2 - interprete 1
>- autore 2
>001 - cd1 - traccia 3 - interprete 1
>- autore 3
>002 - cd 2 - traccia 1 - interprete 2
>- autore 4
>002 - cd 2 - traccia 2 - initerprete 2
>- autore 2
>....................................................................................................
>
>
>quello che devo fare è per ogni cd (quindi una sola volta per
>ogni cod cd) fare una verifica se il codice eiste già nella tabella
>del database da aggiornare, poi in base al risultato di questa
>verifica per ogni riga indipendentemente dal codice cd, devo
>prendere gli altri dati ed inserirli o aggiornarli nell'altra
>tabella.
>
>Vorrei evitare di fare una query di verifica per ogni riga appesantendo
>cosi la procedura che già non sarà leggera vista la mole di dati.
>In asp classico lo avrei risolto agevolmente con l'algoritmo
>che ho postato sopra, ma in c# con un datareader prorpio non
>so come fare.
>
>

Vediamo se ho capito bene, vedi se questo codice può andar bene:

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

Fammi sapere, ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

fustaman Profilo | Junior Member

non va nemmeno questo secondo me perchè quando esce dal ciclo interno verificando che il codice è diverso ha appena fatto una lettura di record, e ne esegue subito un'altra, dovuta al read() del primo ciclo, saltando cosi un record.

L'unico modo è fare in modo che il read sia solo sul ciclo interno, comunque il problema è la contestualità della lettura del record con la verifica di fine recordset, questa contestualità non permette di fare questo tipo di algoritmo.

Il fatto e che questo tipo di algoritmo a me capita spessissimo di doverlo utilizzare, e mi sembra strano che Microsoft abbia eliminato del tutto la possibilità di fare una cosa del genere. Probabilmente esistono altri modi magari non utilizzando un datareader per ottenere lo stesso risultato, ma vista la mia scarsa conoscenza del framework e delle sue classi, non saprei come.

SSUPERPIPPO Profilo | Guru

>non va nemmeno questo secondo me perchè quando esce dal ciclo
>interno verificando che il codice è diverso ha appena fatto una
>lettura di record, e ne esegue subito un'altra, dovuta al read()
>del primo ciclo, saltando cosi un record.
>
>L'unico modo è fare in modo che il read sia solo sul ciclo interno,
>comunque il problema è la contestualità della lettura del record
>con la verifica di fine recordset, questa contestualità non permette
>di fare questo tipo di algoritmo.
>
>Il fatto e che questo tipo di algoritmo a me capita spessissimo
>di doverlo utilizzare, e mi sembra strano che Microsoft abbia
>eliminato del tutto la possibilità di fare una cosa del genere.
>Probabilmente esistono altri modi magari non utilizzando un datareader
>per ottenere lo stesso risultato, ma vista la mia scarsa conoscenza
>del framework e delle sue classi, non saprei come.
>

Fammi fare un pò di prove, poi ti faccio sapere...

Ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

fustaman Profilo | Junior Member

Ho trovato una soluzione, utilizzo un dataset invece che un datareader, poi ciclo sulle righe del datatable e per ogni riga mi faccio restituire con il metodo select un array datarow filtrato sul codice per fare il ciclo interno, una volta fatto incremento l'indice del ciclo esterno del numero di righe restituite dal metodo select.

ecco il codice:


DataSet ds = new DataSet();

....riempio il dataset.....

DataTable dt = ds.Tables["mp3"];

int ni = 0; //variabile utilizzata come passo per il ciclo

for (int i = 0; i<dt.Rows.Count;i+=ni)
{
DataRow drEx = dt.Rows[i];

..... istruzioni da eseguire una volta per ogni codice prodotto

DataRow[] drCodice = drEx.Select("codice=''" + drEx["codice"] + ""

for (ind=0; ind < drCodice.length; ind++) {

... istruzioni da eseguire finchè si resta sullo stesso codice prodotto

}

ni = drCodice.length;
}

Grazie comunque per lo sbattimento Alessandro, ti segno comunque come risposta accettata.

SSUPERPIPPO Profilo | Guru

Stavo pensando anch'io alla soluzione del DataSet... comunque mi fa piacere che hai risolto

Ciao

Alessandro

http://blogs.dotnethell.it/alebadalin
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