Gestione errori: ciclare campi sql con vb.net

giovedì 30 aprile 2009 - 11.41

giaarcix Profilo | Newbie

Ciao a tutti,
una questione.
Ho una tabella in un db sql2008 nella quale ogni secondo vengono scritte
delle righe con un id numerico incrementale.
Il mio programma deve ciclare ogni tot secondi queste righe (estraendo
solo quelle nuove in base all'indice), eseguire alcune operazioni, e
poi scrivere il risultato dei suoi calcoli all'interno di un'altra
tabella.
Il codice è qualcosa del genere:

Data_sql.Open(query, conn_sql, 3, 3)
Do While Data_sql.EOF = False
campo1= Data_sql.Fields("campo1").Value
campo2= Data_sql.Fields("campo2").Value
campo3= Data_sql.Fields("campo3").Value
Call eseguiOperazioni(campo1, campo2, campo3)
Data_sql.MoveNext()
Loop


Vorrei sapere a livello di gestione degli errori quale potrebbe essere
il modo migliore di gestire la cosa.
Non vorrei trovarmi in un loop infinito per esempio... al che ho
pensato di mettere un try catch all'interno del do while. Ma se invece
fosse la query di apertura del recordset a dare errore? Metto un try
catch esterno ed uno interno??
Grazie... se c'è bisogno di delucazioni chiedetemi!!


Giacomo da Pavia


luxsor Profilo | Guru

Ciao Giacomo,
non so che tipo di operazioni dovrai esegure sui record nel la query che utilizzi per estrarre i dati, ma
utilizzando un datareader con la proprietà Read, non avrai l'inconveniente di trovarti un un loop infinito.

Do White TuoDataReader.Read = true
campo1= Data_sql.Fields("campo1").Value
campo2= Data_sql.Fields("campo2").Value
campo3= Data_sql.Fields("campo3").Value
Call eseguiOperazioni(campo1, campo2, campo3)
Loop

>Vorrei sapere a livello di gestione degli errori quale potrebbe
>essere il modo migliore di gestire la cosa.
Se il datareader restituisce un recordset con la query che gli passi, il ciclo cliclera su quei record.
Io ti consiglio di utilizzare per ogni campo la funzione ISNULL del DataReader:
>if MyDataReader.IsNull("campo")=true then ' intercetta l'eventuale campo NULL

L'unico inconveniente che potresti trovare è se la funzione EseguiOperazioni generasse un'eccezione, in quel caso la dovresti inserire in un blocco try catch.

Fammi sapere


------------------------
Luxsor

giaarcix Profilo | Newbie

Ciao!
Grazie mille sei stato gentilissimo!
Ho provato ad usare il dataReader e tutto funziona. In effetti così è sicuramente meglio.

Ora però vado più a fondo in ciò che il mio programma fa e vediamo se riesci a darmi uno spunto in più...
In pratica funziona (già funziona ma lo voglio appunto migliorare) da "accentratore" di segnalazioni: legge appunto delle segnalazioni su varie tabelle, i cui dati vengono incrementati da altri programmi, le filtra, eventualmente le corregge, e poi le inserisce in un unico calderone opportunamente macinate in modo che siano fruibili agli utenti.
Prima ho parlato di sql2008 perchè effettivamente stavo provando su quella parte del programma, ma in realtà i database su cui deve leggere queste segnalazioni sono:

1 sql 2000
1 sql 2005
1 sql 2008
2 mysql
1 access 97 (!!!!!)

Fai conto che ci sono cinque sub che vengono chiamate in sequenza, ed in ciascuna viene effettuata la lettura dal relativo db, vensono eseguiti i calcoli, e vengono scritti i risultati.
Ora, non so se ho preso un esempio su internet basato su sql, ma per usarlo ho dovuto creare dei:

myCommand as sqlCommand
myConnection as sqlConnection
dr as sqlDataReader

Il che mi fa pensare che le stesse cose non vadano bene per le connessioni ai database diversi da sql...?
Comunque mi fa piacere perchè sto esplorando un mondo nuovo!
Se riesci a darmi ancora una mano mi fai un piacere!
Grazie!

Giacomo

luxsor Profilo | Guru

Ciao Giacomo,

>Il che mi fa pensare che le stesse cose non vadano bene per le
>connessioni ai database diversi da sql...?
Infatti.
Per database Sql Server devi utilizzare il namespace System.Data.SqlClient
per Access, invece il namespace System.Data.OleDb
Le funzioni sono identiche a patto del nome (es. SqlCommand e l'altro OleDBCommand ecc..)
Un'altra cosa che cambia è la rispettiva stringa di connessione, infatti per ogni datasource utilizzato devi associare la propria stringa di connessione
Dai un occhiata qui:
http://www.connectionstrings.com/

Ciao


------------------------
Luxsor
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