View Full Version : [VB.NET 2010] Delucidazioni su possibili azioni con ExecuteScalar()
Ciao a tutti rieccomi a rompere :ciapet:
Ora sto ultimando la mia prima desktop-app. basata interamente sui miei Studi autonomi.. sono quasi alla fine e non voglio fermarmi proprio ora :mad:
il mio problema sta in questa private sub che QUALCUNO (http://www.hwupgrade.it/forum/member.php?u=84594) mi ha aiutato a finire con tanta pazienza :D
la subroutine funziona perfettamente ma ora vorrei aggiungere l'ultimo tassello (che spiego sotto il codice).
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'Prendo i dati da smsservergateway e li confronto con smspanel
Dim Comando_SmsGateway As New OleDbCommand
Dim Comando_SmsPanel As New OleDbCommand
Dim Adapter_SmsGateway As New OleDbDataAdapter
Dim Adapter_SmsPanel As New OleDbDataAdapter
Dim Reader_SmsGateway As OleDbDataReader
Dim ANUMBER As String
Dim SMSMESSAGE As String
Dim RECEIVEDDATE As Date
Dim DEVICECODE As String
Dim INBOXID As String
Dim EMAIL As String
Dim TESTO As String
Dim Avanti As Integer
Comando_SmsGateway.Connection = Connessione_server
Comando_SmsGateway.CommandText = "SELECT * FROM INBOX"
Comando_SmsGateway.CommandType = CommandType.Text
Adapter_SmsGateway.SelectCommand = Comando_SmsGateway
Connessione_server.Open()
Reader_SmsGateway = Comando_SmsGateway.ExecuteReader()
While Reader_SmsGateway.Read()
Avanti = Avanti + 1
INBOXID = Reader_SmsGateway("INBOXID")
ANUMBER = Reader_SmsGateway("ANUMBER")
DEVICECODE = Reader_SmsGateway("DEVICECODE")
SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
TESTO = "Spedito da : " & ANUMBER & Chr(13) & " Ricevuto il : " & RECEIVEDDATE & Chr(13) & " Testo del messaggio : " & SMSMESSAGE
Comando_SmsPanel.Connection = Connessione
Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
'Per impostare un parametro in una clausola WHERE con SELECT bisogna Esplicitare il tipo ! e poi assegnarli il valore.
Comando_SmsPanel.Parameters.Add("@DEVICECODE", OleDbType.VarChar)
Comando_SmsPanel.Parameters("@DEVICECODE").Value = DEVICECODE
Comando_SmsPanel.CommandType = CommandType.Text
Connessione.Open()
'Per assegnare ad una variabile il risultato di una query con SELECT singola bisogna usare ExecuteScalar() , il tipo varia in base alle necessità
EMAIL = Comando_SmsPanel.ExecuteScalar()
Connessione.Close()
ReportTesto = " Sms ricevuto da : " & ANUMBER & " Testo del messaggio : " & SMSMESSAGE & " E-Mail spedita a : " & EMAIL
BackgroundWorker1.ReportProgress(Avanti, ReportTesto)
InviaEmail(EMAIL, TESTO)
System.Threading.Thread.Sleep(Tempo)
If BackgroundWorker1.CancellationPending Then
e.Cancel = True
Exit While
End If
End While
be il mio intento è di creare un controllo dopo il comando
EMAIL = Comando_SmsPanel.ExecuteScalar()
cioè capire se ha trovato un risultato nella query
Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
Se trova tale corrispondenza invia la mail (come gia fa) però se non trova la corrispondenza non fa nulla e ciò non mi piace affatto .. vorrei poter gestire questo evento , come posso fare?
mentre vi scrivo sto spulciando MSDN ma non sembra avere la risposta:muro:
Per ora ho risolto cosi
EMAIL = Comando_SmsPanel.ExecuteScalar()
If String.IsNullOrEmpty(EMAIL) Then
ReportTesto = " Questo messaggio : " & SMSMESSAGE & " Ricevuto da : " & ANUMBER & " Con Device Code : " & DEVICECODE & " E' in attesa di conferma"
Else
ReportTesto = " Sms ricevuto da : " & ANUMBER & " Testo del messaggio : " & SMSMESSAGE & " E-Mail spedita a : " & EMAIL
InviaEmail(EMAIL, TESTO)
End If
E' la soluzione migliore? ce ne sono altre piu sicure?
Sì, così può andare, Ludo.
Complimenti per il .IsNullOrEmpty ! :D
Sì, così può andare, Ludo.
Complimenti per il .IsNullOrEmpty ! :D
Ciao marco
grazie per il consiglio alla fine ho adottato quel if
Avrei ancora dei dubbi sempre su executescalar()
posso far in modo di capire se la query mi ritorna piu di un record ? cioè ora mi ritorna UNA EMAIL per ogni ciclo executescalar , ma se me ne tornassero due ? come faccio a capire se ci sono piu di un record? ovviamente se me ne tornano due andrei a fare altri controlli
cioè in sostanza il codice
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'Prendo i dati da smsservergateway e li confronto con smspanel
Dim Comando_SmsGateway As New OleDbCommand
Dim Comando_SmsPanel As New OleDbCommand
Dim Comando_SmsPanel_Inserimento As New OleDbCommand
Dim Adapter_SmsGateway As New OleDbDataAdapter
Dim Adapter_SmsPanel As New OleDbDataAdapter
Dim Reader_SmsGateway As OleDbDataReader
Dim ANUMBER As String
Dim SMSMESSAGE As String
Dim RECEIVEDDATE As Date
Dim DEVICECODE As String
Dim INBOXID As String
Dim EMAIL As String
Dim TESTO As String
Dim Avanti As Integer
Comando_SmsGateway.Connection = Connessione_server
Comando_SmsGateway.CommandText = "SELECT * FROM INBOX"
Comando_SmsGateway.CommandType = CommandType.Text
Adapter_SmsGateway.SelectCommand = Comando_SmsGateway
Connessione_server.Open()
Reader_SmsGateway = Comando_SmsGateway.ExecuteReader()
While Reader_SmsGateway.Read()
Avanti = Avanti + 1
INBOXID = Reader_SmsGateway("INBOXID")
ANUMBER = Reader_SmsGateway("ANUMBER")
DEVICECODE = Reader_SmsGateway("DEVICECODE")
SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
TESTO = "Spedito da : " & ANUMBER & Chr(13) & " Ricevuto il : " & RECEIVEDDATE & Chr(13) & " Testo del messaggio : " & SMSMESSAGE
Comando_SmsPanel.Connection = Connessione
Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
'Per impostare un parametro in una clausola WHERE con SELECT bisogna Esplicitare il tipo ! e poi assegnarli il valore.
Comando_SmsPanel.Parameters.Add("@DEVICECODE", OleDbType.VarChar)
Comando_SmsPanel.Parameters("@DEVICECODE").Value = DEVICECODE
Comando_SmsPanel.CommandType = CommandType.Text
Connessione.Open()
'Per assegnare ad una variabile il risultato di una query con SELECT singola bisogna usare ExecuteScalar() , il tipo varia in base alle necessità
EMAIL = Comando_SmsPanel.ExecuteScalar()
Connessione.Close()
If String.IsNullOrEmpty(EMAIL) Then
ReportTesto = " Questo messaggio : " & SMSMESSAGE & " Ricevuto da : " & ANUMBER & " Con Device Code : " & DEVICECODE & " E' in attesa di conferma"
Comando_SmsPanel_Inserimento.Connection = Connessione
Comando_SmsPanel_Inserimento.CommandText = "INSERT INTO deposito (messaggio,da_numero,device_numero,data_ricezione) VALUES (@SMSMESSAGE,@ANUMBER,@DEVICECODE,@RECEIVEDDATE)"
Comando_SmsPanel_Inserimento.Parameters.AddWithValue("@SMSMESSAGE", SMSMESSAGE)
Comando_SmsPanel_Inserimento.Parameters.AddWithValue("@ANUMBER", ANUMBER)
Comando_SmsPanel_Inserimento.Parameters.AddWithValue("@DEVICECODE", DEVICECODE)
Comando_SmsPanel_Inserimento.Parameters.AddWithValue("@RECEIVEDDATE", RECEIVEDDATE)
Comando_SmsPanel_Inserimento.CommandType = CommandType.Text
Connessione.Open()
Try
Comando_SmsPanel_Inserimento.ExecuteNonQuery()
Catch Eccezione As OleDb.OleDbException
ReportTesto = " " & Eccezione.Message
End Try
Connessione.Close()
Else
ReportTesto = " Sms ricevuto da : " & ANUMBER & " Testo del messaggio : " & SMSMESSAGE & " E-Mail spedita a : " & EMAIL
'InviaEmail(EMAIL, TESTO)
End If
BackgroundWorker1.ReportProgress(Avanti, ReportTesto)
System.Threading.Thread.Sleep(Tempo)
If BackgroundWorker1.CancellationPending Then
e.Cancel = True
Exit While
End If
End While
Connessione_server.Close()
End Sub
nell pezzo in cui cerco la MAIL
Comando_SmsPanel.Connection = Connessione
Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
'Per impostare un parametro in una clausola WHERE con SELECT bisogna Esplicitare il tipo ! e poi assegnarli il valore.
Comando_SmsPanel.Parameters.Add("@DEVICECODE", OleDbType.VarChar)
Comando_SmsPanel.Parameters("@DEVICECODE").Value = DEVICECODE
Comando_SmsPanel.CommandType = CommandType.Text
Connessione.Open()
'Per assegnare ad una variabile il risultato di una query con SELECT singola bisogna usare ExecuteScalar() , il tipo varia in base alle necessità
EMAIL = Comando_SmsPanel.ExecuteScalar()
Connessione.Close()
per come è scritto ora mi restituisce sempre un risultato
ma se nel caso ci fossero piu risultati ? (ovvero "WHERE numero = @DEVICECODE" se c'è WHERE numero = 0331000000 e tale associazione mi produce un risultato con prova@prova.it e maikl@mail.it perciò piu di una mail e non solo una )
posso (tramite l'if o qualche controllo di flusso) capire se il record del risultato della query non è = 1 ?
per come è scritto ora mi restituisce sempre un risultato
ma se nel caso ci fossero piu risultati ? (ovvero "WHERE numero = @DEVICECODE" se c'è WHERE numero = 0331000000 e tale associazione mi produce un risultato con prova@prova.it e maikl@mail.it perciò piu di una mail e non solo una )
posso (tramite l'if o qualche controllo di flusso) capire se il record del risultato della query non è = 1 ?
No. ExecuteScalar deve sempre restituire un solo campo. Un solo valore.
Se è previsto un set di risultati devi usare un DataReader, o un DataTable, o un DataSet...
Perciò in una situazione del tutto generica : 0, 1, 1+ risultati, ExecuteScalar non va usato.
No. ExecuteScalar deve sempre restituire un solo campo. Un solo valore.
Se è previsto un set di risultati devi usare un DataReader, o un DataTable, o un DataSet...
Perciò in una situazione del tutto generica : 0, 1, 1+ risultati, ExecuteScalar non va usato.
aaaaaaaaaa molto male :rolleyes: escludendo a priori il datareader (perchè è gia dentro un ciclo di read() e non so come farlo ... ) provero a implementare il dataset
aaaaaaaaaa molto male :rolleyes: escludendo a priori il datareader (perchè è gia dentro un ciclo di read() e non so come farlo ... ) provero a implementare il dataset
Quelle che ti sto dando sono indicazioni di massima.
Non sono entrato nel merito del tuo codice ( e non intendo certo farlo a mezzanotte... :D ).
Mi sembra tu ti stia un po' complicando le cose, comunque.
Se non sei troppo ferrato sull'Sql avanzato esistono altri sistemi per snellire, e non doversi ritrovare a fare DataReader nidificati o DataSet che forse contengono al massimo un paio di campi...
Potresti ad esempio fare solo la query più esterna e caricare i risultati in una List() di oggetti o di Structures, ecc...
Quelle che ti sto dando sono indicazioni di massima.
Non sono entrato nel merito del tuo codice ( e non intendo certo farlo a mezzanotte... :D ).
Mi sembra tu ti stia un po' complicando le cose, comunque.
Se non sei troppo ferrato sull'Sql avanzato esistono altri sistemi per snellire, e non doversi ritrovare a fare DataReader nidificati o DataSet che forse contengono al massimo un paio di campi...
Potresti ad esempio fare solo la query più esterna e caricare i risultati in una List() di oggetti o di Structures, ecc...
utilizzare le list? cioè caricare i dati (1 o piu ) in una list e poterla controllare , cosi se la list ha un solo dato fa una cosa
se ne ha di piu ne fa un altra
si puo fare???
:doh: aiuto , pensavo che vb.net fosse facile :muro: :muro:
Quelle che ti sto dando sono indicazioni di massima.
Non sono entrato nel merito del tuo codice ( e non intendo certo farlo a mezzanotte... :D ).
Mi sembra tu ti stia un po' complicando le cose, comunque.
lo so marco il mio codice fa schifo :( ma è il mio primo progetto
utilizzare le list? cioè caricare i dati (1 o piu ) in una list e poterla controllare , cosi se la list ha un solo dato fa una cosa
se ne ha di piu ne fa un altra
si puo fare???
Certo. Tutto si può fare. In fondo cos'è un record restituito da una query ?
E' un insieme di campi correlati.
Non a caso su molti testi come vengono definiti i membri interni di una Classe ? Campi.
Se le classi sono troppo "complicate", per le cose semplici, VB ci viene incontro con le Structures :
Private Structure Persona
Dim cognome As String
Dim nome As String
'...
'...
End Structure
E poi :
Dim P As New Persona
P.nome = "ilnome"
P.cognome = "ilcognome"
'...
'...
Estraendo dati da un DB, e volendo usare Structures, Classi, Liste ecc. le possibilità sono infinite. Bisogna solo trovare il miglior compromesso per le proprie esigenze.
:doh: aiuto , pensavo che vb.net fosse facile :muro: :muro:
Non sei il solo. Ce ne sono a migliaia che si buttano a testa bassa a scrivere codice perchè qualcuno gli ha detto "usa VB.NET che è facile",
e poi immancabilmente :muro: .
Forse hai corso solo un po' troppo.
Se il tuo codice ti fa schifo è già un fatto positivo.
Fatti un'analisi chiara del problema, butta tutto e ricomincia. ;)
Certo. Tutto si può fare. In fondo cos'è un record restituito da una query ?
E' un insieme di campi correlati.
Non a caso su molti testi come vengono definiti i membri interni di una Classe ? Campi.
Se le classi sono troppo "complicate", per le cose semplici, VB ci viene incontro con le Structures :
Private Structure Persona
Dim cognome As String
Dim nome As String
'...
'...
End Structure
E poi :
Dim P As New Persona
P.nome = "ilnome"
P.cognome = "ilcognome"
'...
'...
Estraendo dati da un DB, e volendo usare Structures, Classi, Liste ecc. le possibilità sono infinite. Bisogna solo trovare il miglior compromesso per le proprie esigenze.
Non sei il solo. Ce ne sono a migliaia che si buttano a testa bassa a scrivere codice perchè qualcuno gli ha detto "usa VB.NET che è facile",
e poi immancabilmente :muro: .
Forse hai corso solo un po' troppo.
Se il tuo codice ti fa schifo è già un fatto positivo.
Fatti un'analisi chiara del problema, butta tutto e ricomincia. ;)
ma non posso "buttare tutto" ormai sono ad un passo dalla fine ! :help: al massimo finisco questo e poi lo rifaccio.
non è che mi sono buttato a capofitto in vb.net è che io provengo dal web (php , mysql e jquery ) e volevo "tuffarmi" nel mondo desktop e tra i vari linguaggi (Delphi , C++ , c# , Java eccecc ) vb.net mi han detto che era (o è ) il piu user-friendly tra tutti.
Comunque opterei per Structure, anche perchè non conoscendo la differenza nn vedo neanche i vantaggi/svantaggi :doh:
non è che mi sono buttato a capofitto in vb.net è che io provengo dal web (php , mysql e jquery ) e volevo "tuffarmi" nel mondo desktop e tra i vari linguaggi (Delphi , C++ , c# , Java eccecc ) vb.net mi han detto che era (o è ) il piu user-friendly tra tutti.
Beh, è abbastanza strano che ti abbiano consigliato VB, conoscendo i tuoi trascorsi. Forse la sintassi di un C# sarebbe stata più adatta. In ogni caso, sintassi a parte, .NET è sempre .NET.
Se hai già sviluppato in Object-Oriented-PHP non sei certo a zero. ;)
Comunque opterei per Structure, anche perchè non conoscendo la differenza nn vedo neanche i vantaggi/svantaggi :doh:
La differenza tra Classi e Structures è notevole.
Inizia dalle Structures.
Beh, è abbastanza strano che ti abbiano consigliato VB, conoscendo i tuoi trascorsi. Forse la sintassi di un C# sarebbe stata più adatta. In ogni caso, sintassi a parte, .NET è sempre .NET.
Se hai già sviluppato in Object-Oriented-PHP non sei certo a zero. ;)
La differenza tra Classi e Structures è notevole.
Inizia dalle Structures.
sisi sono PHP oop al 100% (se vuoi ti farò vedere alcune mega-classi in php .. modestia a parte mi ritengo molto ferrato sul php dopo 5 anni che ci smanetto dietro :cool: )
stavo pensando
visto che devo finirlo in qualche modo questo primo-progetto-schifoso :mc: ecco la mia idea :
questa è la parte incriminata
EMAIL = Comando_SmsPanel.ExecuteScalar()
se io trasformassi la variabile email (dichiarata : dim email as string) in un array ? e strasformo executescalar in un qualcosa (cosa??? :doh: ) che mi restituisca uno o piu risultati? in tal modo andrei a fare un rapido controllo sull array EMAIL , se esso contiene 1 oggetto faccio una cosa se ne contiene di piu un altra , puo funzionare ?:help:
Beh, è abbastanza strano che ti abbiano consigliato VB, conoscendo i tuoi trascorsi. Forse la sintassi di un C# sarebbe stata più adatta. In ogni caso, sintassi a parte, .NET è sempre .NET.
Se hai già sviluppato in Object-Oriented-PHP non sei certo a zero. ;)
La differenza tra Classi e Structures è notevole.
Inizia dalle Structures.
sisi sono PHP oop al 100% (se vuoi ti farò vedere alcune mega-classi in php .. modestia a parte mi ritengo molto ferrato sul php dopo 5 anni che ci smanetto dietro :cool: )
stavo pensando
visto che devo finirlo in qualche modo questo primo-progetto-schifoso :mc: ecco la mia idea :
questa è la parte incriminata
EMAIL = Comando_SmsPanel.ExecuteScalar()
se io trasformassi la variabile email (dichiarata : dim email as string) in un array ? e strasformo executescalar in un qualcosa (cosa??? :doh: ) che mi restituisca uno o piu risultati? in tal modo andrei a fare un rapido controllo sull array EMAIL , se esso contiene 1 oggetto faccio una cosa se ne contiene di piu un altra , puo funzionare ?:help:
ciao
per avere n risultati ti serve chiamare executereader
http://msdn.microsoft.com/it-it/library/9kcbe65k%28v=VS.80%29.aspx
per passare da un datareader a un datatable (da ciclare poi come meglio credi)
semplicemente:
Dim r As SqlDataReader = cmd.ExecuteReader
DIm dt as DataTable = new DataTable();
dt.Load(r);
ciao
per avere n risultati ti serve chiamare executereader
http://msdn.microsoft.com/it-it/library/9kcbe65k%28v=VS.80%29.aspx
per passare da un datareader a un datatable (da ciclare poi come meglio credi)
semplicemente:
Dim r As SqlDataReader = cmd.ExecuteReader
DIm dt as DataTable = new DataTable();
dt.Load(r);
percio posso usare ExecuteReader senza un ciclo while reader.read() ?
percio posso usare ExecuteReader senza un ciclo while reader.read() ?
Non mi butterei in strane alchimie, Ludo.
While Reader_SmsGateway.Read()
Avanti = Avanti + 1
INBOXID = Reader_SmsGateway("INBOXID")
ANUMBER = Reader_SmsGateway("ANUMBER")
DEVICECODE = Reader_SmsGateway("DEVICECODE")
SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
TESTO = "Spedito da : " & ANUMBER & Chr(13) & " Ricevuto il : " & RECEIVEDDATE & Chr(13) & " Testo del messaggio : " & SMSMESSAGE
Comando_SmsPanel.Connection = Connessione
Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
'Per impostare un parametro in una clausola WHERE con SELECT bisogna Esplicitare il tipo ! e poi assegnarli il valore.
Comando_SmsPanel.Parameters.Add("@DEVICECODE", OleDbType.VarChar)
Comando_SmsPanel.Parameters("@DEVICECODE").Value = DEVICECODE
Comando_SmsPanel.CommandType = CommandType.Text
Connessione.Open()
'Per assegnare ad una variabile il risultato di una query con SELECT singola bisogna usare ExecuteScalar() , il tipo varia in base alle necessità
EMAIL = Comando_SmsPanel.ExecuteScalar()
Piuttosto che nidificare Readers meglio separare, no ?
Avrai un codice più prolisso, ma allo stato in cui sei è forse un problema ?
Quei campi che vedo nel Reader esterno :
INBOXID
ANUMBER
DEVICECODE
SMSMESSAGE
RECEIVEDDATE
TESTO
EMAIL
Eccola lì la Structure !
Sono tutti campi destinati a ricevere UN valore, eccetto EMAIL, che ne può avere 0,1,1+. Giusto ?
E allora EMAIL non può essere String, ma sarà un List(Of String).
Perciò usa il tuo Reader esterno, che ad ogni ciclo di lettura crea una nuova Structure, e la aggiunge ad una List(Of Structures).
A quel punto, per ogni Structure nella List(Of Structures), esegui la seconda query e popoli il campo EMAIL.
Ci sei ?
Ci sei ?
Ora come ora no ! :D ma il mio spirito curioso , la mia voglia e la mia (spero :ciapet: ) fortuna mi stanno consigliando di sbatterci la testa violentemente fino a stanotte :muro:
Ora come ora no ! :D ma il mio spirito curioso , la mia voglia e la mia (spero :ciapet: ) fortuna mi stanno consigliando di sbatterci la testa violentemente fino a stanotte :muro:
Deve esserti chiaro il procedimento che ho illustrato.
Al codice ci arrivi.
Se non hai capito il procedimento allora anche il codice non potrà che essere sbagliato.
Deve esserti chiaro il procedimento che ho illustrato.
Al codice ci arrivi.
Se non hai capito il procedimento allora anche il codice non potrà che essere sbagliato.
e difatti non ho capito bene .. intanto ci provo a svilupparlo ma missa che qualcosa mi manca
banryu79
17-12-2010, 15:02
e difatti non ho capito bene .. intanto ci provo a svilupparlo ma missa che qualcosa mi manca
Forse è tempo di mettere da parte per un attimo la tastiera, prendere carta & matita e il post di MarcoGG e leggere con calma cercando di capire bene. Consultando sistematicamente la documentazione online in caso di dubbi circa linguaggio e metodi/librerie.
Almeno è quello che farei io se fossi al tuo posto :)
Forse è tempo di mettere da parte per un attimo la tastiera, prendere carta & matita e il post di MarcoGG e leggere con calma cercando di capire bene.
Saggiamente banryu79... ;)
e difatti non ho capito bene .. intanto ci provo a svilupparlo ma missa che qualcosa mi manca
NO ! MAI ! :D
E' proprio lì il problema.
"Non ho capito, ma intanto ci provo" e giù codice...
Allora, tu hai un Reader esterno, quel :
While Reader_SmsGateway.Read()
che va bene così com'è.
Ora, anzichè andare a nidificare altri Readers o altre interrogazioni al DB, spezzi il processo in 2.
Come ?
Con l'aiuto delle classi. Non volevo fare quello che sto per fare, ma alla fine le Structures sono un po' macchinose se hanno membri da istanziare esplicitamente, e noi dobbiamo gestire quel campo EMAIL che può contenere diverse stringhe, no ?
Allora :
1. La Classe :
Public Class laMiaClasse
Public INBOXID As String
Public ANUMBER As String
Public DEVICECODE As String
Public SMSMESSAGE As String
Public RECEIVEDDATE As Date
Public TESTO As String
Public EMAIL As New List(Of String)
End Class
E qui devo aggiungere : non dire mai a nessuno che ti ho insegnato a fare le classi in questo modo ! :D.
Questo è solo un workaround per permetterti di chiudere il tuo processo alla svelta. Normalmente le Classi non si fanno così. Ma nel nostro caso decideremo di tollerare questa momentanea eresia.
2. L'insieme destinato a contenere tutti gli oggetti, istanze di questa classe, è :
Public listaOggetti As New List(Of laMiaClasse)
3. Nel Reader esterno, ad ogni ciclo, vado a creare un nuovo oggetto e a
popolarlo con i valori restituiti da ciascun campo Reader. Perciò in questo primo passaggio popolo tutto ECCETTO il campo EMAIL, che popolerò al Secondo passaggio.
4. PRIMO PASSAGGIO :
-----> Ciclo Reader_SmsGateway
Dim mioOggetto As New laMiaClasse
With mioOggetto
.INBOXID = Reader_SmsGateway("INBOXID")
.ANUMBER = Reader_SmsGateway("ANUMBER")
.DEVICECODE = ...
.SMSMESSAGE = ...
.RECEIVEDDATE = ...
.TESTO = ...
End With
listaOggetti.Add(mioOggetto)
-----> Fine Ciclo Reader_SmsGateway
5. A questo punto ho in mano la mia listaOggetti, piena di oggetti istanze di laMiaClasse.
Penso sia davvero molto chiaro adesso. :)
Arriva fino a qui.
Poi vediamo il SECONDO PASSAGGIO. ;)
Saggiamente banryu79... ;)
NO ! MAI ! :D
E' proprio lì il problema.
"Non ho capito, ma intanto ci provo" e giù codice...
Allora, tu hai un Reader esterno, quel :
While Reader_SmsGateway.Read()
che va bene così com'è.
Ora, anzichè andare a nidificare altri Readers o altre interrogazioni al DB, spezzi il processo in 2.
Come ?
Con l'aiuto delle classi. Non volevo fare quello che sto per fare, ma alla fine le Structures sono un po' macchinose se hanno membri da istanziare esplicitamente, e noi dobbiamo gestire quel campo EMAIL che può contenere diverse stringhe, no ?
Allora :
1. La Classe :
Public Class laMiaClasse
Public INBOXID As String
Public ANUMBER As String
Public DEVICECODE As String
Public SMSMESSAGE As String
Public RECEIVEDDATE As Date
Public TESTO As String
Public EMAIL As New List(Of String)
End Class
E qui devo aggiungere : non dire mai a nessuno che ti ho insegnato a fare le classi in questo modo ! :D.
Questo è solo un workaround per permetterti di chiudere il tuo processo alla svelta. Normalmente le Classi non si fanno così. Ma nel nostro caso decideremo di tollerare questa momentanea eresia.
2. L'insieme destinato a contenere tutti gli oggetti, istanze di questa classe, è :
Public listaOggetti As New List(Of laMiaClasse)
3. Nel Reader esterno, ad ogni ciclo, vado a creare un nuovo oggetto e a
popolarlo con i valori restituiti da ciascun campo Reader. Perciò in questo primo passaggio popolo tutto ECCETTO il campo EMAIL, che popolerò al Secondo passaggio.
4. PRIMO PASSAGGIO :
-----> Ciclo Reader_SmsGateway
Dim mioOggetto As New laMiaClasse
With mioOggetto
.INBOXID = Reader_SmsGateway("INBOXID")
.ANUMBER = Reader_SmsGateway("ANUMBER")
.DEVICECODE = ...
.SMSMESSAGE = ...
.RECEIVEDDATE = ...
.TESTO = ...
End With
listaOggetti.Add(mioOggetto)
-----> Fine Ciclo Reader_SmsGateway
5. A questo punto ho in mano la mia listaOggetti, piena di oggetti istanze di laMiaClasse.
Penso sia davvero molto chiaro adesso. :)
Arriva fino a qui.
Poi vediamo il SECONDO PASSAGGIO. ;)
Ciao Marco
Oggi 20 dicembre sono giunto al mio secondo mese di programmazione in vb.net , lo so che magari azzardo molte volte però alcune cose del net e della programmazione di vb.net non mi sono ancora chiare.
quando ho scritto "non ho capito ma ci provo" era un modo per dire che studiavo tutte quelle "nuove cose" (tipo le strutture) che avete scritto.
ora comunque provo a implementare il tuo codice poi ti faccio sapere.
EDIT: FATTO , ho implementato il tuo codice ,nessun errore o eccezione (ma va ?! :D)
ora comunque provo a implementare il tuo codice poi ti faccio sapere.
EDIT: FATTO , ho implementato il tuo codice ,nessun errore o eccezione (ma va ?! :D)
Finalmente Ludo ! Stavo iniziando a pensare che avessi rinunciato.
Perchè, credevi possibile che un mio codice potesse sollevare eccezioni ? :D
Pronto per il SECONDO PASSAGGIO ?
Finalmente Ludo ! Stavo iniziando a pensare che avessi rinunciato.
Perchè, credevi possibile che un mio codice potesse sollevare eccezioni ? :D
Pronto per il SECONDO PASSAGGIO ?
Rinunciare? no non fa parte del mio vocabolario
ho provato a fare di testa mia questo fine settimana , giusto per mettere sotto sforzo questo piccolo cervello
ora , se vuoi e quando vuoi , illuminami :ave: :ave: :ave:
scusa se ti rispondo tardi ma sto facendo pulizia in casa XD
scusa se ti rispondo tardi ma sto facendo pulizia in casa XD
Che è sempre una nobile e utile attività. ;)
Ok, il secondo passaggio è semplice.
Alla fine del primo abbiamo la nostra listaOggetti, piena di oggetti.
Nel tuo codice, per popolare EMAIL, hai bisogno di un solo parametro :
...
Comando_SmsPanel.Parameters.Add("@DEVICECODE", OleDbType.VarChar)
Comando_SmsPanel.Parameters("@DEVICECODE").Value = DEVICECODE
...
che guarda caso, è uno dei campi di ciascun oggetto in listaOggetti.
Perciò non rimane altro da fare che ciclare in listaOggetti :
For Each O As laMiaClasse In listaOggetti
...
Per ogni oggetto trovato :
1. Leggo DEVICECODE e lo passo alla query.
2. Eseguo il Command che mi restituisce un DataReader con i campi EMAIL trovati ( 0, 1, 1+ )
3. Nel ciclo di lettura di questo DataReader vado ad aggiungere alla list EMAIL ogni stringa trovata :
----> Ciclo DataReader
Oggetto.EMAIL.Add(valore_DataReader)
----> Fine Ciclo DataReader
Fine. A questo punto hai una lista di oggetti con cui puoi fare quello che vuoi... ;)
Ok bene , teoricamente ho capito come funziona , ora metto tutto in pratica e ti terrò aggiornato;)
Ok bene , teoricamente ho capito come funziona , ora metto tutto in pratica e ti terrò aggiornato;)
Vai, spacca tutto & torna vincitore ! :)
<System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Elimina gli oggetti prima che siano esterni all'ambito")>
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'Prendo i dati da smsservergateway e li confronto con smspanel
Dim Comando_SmsGateway As New OleDbCommand
Dim Comando_SmsPanel As New OleDbCommand
Dim Adapter_SmsGateway As New OleDbDataAdapter
Dim Adapter_SmsPanel As New OleDbDataAdapter
Dim Reader_SmsGateway As OleDbDataReader
Dim EMAIL As String
Comando_SmsGateway.Connection = Connessione_server
Comando_SmsGateway.CommandText = "SELECT * FROM INBOX"
Comando_SmsGateway.CommandType = CommandType.Text
Adapter_SmsGateway.SelectCommand = Comando_SmsGateway
Connessione_server.Open()
Reader_SmsGateway = Comando_SmsGateway.ExecuteReader()
While Reader_SmsGateway.Read()
'Per assegnare ad una variabile il risultato di una query con SELECT singola bisogna usare ExecuteScalar() , il tipo varia in base alle necessità
Dim RilevaEmail As New RilevaMail
With RilevaEmail
.INBOXID = Reader_SmsGateway("INBOXID")
.ANUMBER = Reader_SmsGateway("ANUMBER")
.DEVICECODE = Reader_SmsGateway("DEVICECODE")
.SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
.RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
.TESTO = "Spedito da : " & .ANUMBER & Chr(13) & " Ricevuto il : " & .RECEIVEDDATE & Chr(13) & " Testo del messaggio : " & .SMSMESSAGE
End With
ListaOggetti.Add(RilevaEmail)
For Each Oggetto As RilevaMail In ListaOggetti
Comando_SmsPanel.Connection = Connessione
Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
'Per impostare un parametro in una clausola WHERE con SELECT bisogna Esplicitare il tipo ! e poi assegnarli il valore.
Comando_SmsPanel.Parameters.Add("@DEVICECODE", OleDbType.VarChar)
Comando_SmsPanel.Parameters("@DEVICECODE").Value = RilevaEmail.DEVICECODE
Comando_SmsPanel.CommandType = CommandType.Text
Connessione.Open()
'Per assegnare ad una variabile il risultato di una query con SELECT singola bisogna usare ExecuteScalar() , il tipo varia in base alle necessità
EMAIL = Comando_SmsPanel.ExecuteScalar()
Connessione.Close()
Next
If BackgroundWorker1.CancellationPending Then
e.Cancel = True
Exit While
End If
End While
End Sub
Cosi si presenta il codice ora , ho commentato la "vecchia parte" per riferimento , una volta finito la cancello
ho due dubbi
visto che non ho piu il parametro nella subroutine ma nella classe ho fatto bene a mettere
Comando_SmsPanel.Parameters("@DEVICECODE").Value = RilevaEmail.DEVICECODE
invece che
Comando_SmsPanel.Parameters("@DEVICECODE").Value =DEVICECODE
anche perche senno mi sollevava un errore di sintassi
ora cambio
EMAIL = Comando_SmsPanel.ExecuteScalar()
in un datareader giusto ?
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader()
While Reader_SmsPanel.Read
ListaOggetti.Add(Reader_SmsPanel("email"))
End While
Esatto :
Comando_SmsPanel.Parameters("@DEVICECODE").Value = RilevaEmail.DEVICECODE
perchè quel comando lo devi ripetere N volte per tutti gli N oggetti che hai in listaOggetti.
Questo invece NO :
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader()
While Reader_SmsPanel.Read
ListaOggetti.Add(Reader_SmsPanel("email"))
End While
riguarda il mio codice.
Io ho scritto : Oggetto.EMAIL.Add(valore_DataReader)
Tu in pratica avrai N command che generano N readers ( in un ciclo ).
Ognuno degli N oggetti in listaOggetti avrà il SUO Reader apposta per popolare il SUO campo .EMAIL.
Esatto :
Comando_SmsPanel.Parameters("@DEVICECODE").Value = RilevaEmail.DEVICECODE
perchè quel comando lo devi ripetere N volte per tutti gli N oggetti che hai in listaOggetti.
Questo invece NO :
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader()
While Reader_SmsPanel.Read
ListaOggetti.Add(Reader_SmsPanel("email"))
End While
riguarda il mio codice.
Io ho scritto : Oggetto.EMAIL.Add(valore_DataReader)
Tu in pratica avrai N command che generano N readers ( in un ciclo ).
Ognuno degli N oggetti in listaOggetti avrà il SUO Reader apposta per popolare il SUO campo .EMAIL.
capito !
percio da cosi
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader()
While Reader_SmsPanel.Read
ListaOggetti.Add(Reader_SmsPanel("email"))
End While
a cosi
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader()
While Reader_SmsPanel.Read
Oggetto.EMAIL.Add("email")
End While
ho messo email perche Valore_datareader dovrebbe essere email (campo della query)
Ho modificato tutto ma , durante l'esecuzione mi solleva un eccezione
Impossibile utilizzare oggetti COM separati dai relativi RCW sottostanti.
il codice allo stato attuale
<System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Elimina gli oggetti prima che siano esterni all'ambito")>
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'Prendo i dati da smsservergateway e li confronto con smspanel
Dim Comando_SmsGateway As New OleDbCommand
Dim Comando_SmsPanel As New OleDbCommand
Dim Adapter_SmsGateway As New OleDbDataAdapter
Dim Adapter_SmsPanel As New OleDbDataAdapter
Dim Reader_SmsGateway As OleDbDataReader
Dim Reader_SmsPanel As OleDbDataReader
Comando_SmsGateway.Connection = Connessione_server
Comando_SmsGateway.CommandText = "SELECT * FROM INBOX"
Comando_SmsGateway.CommandType = CommandType.Text
Adapter_SmsGateway.SelectCommand = Comando_SmsGateway
Connessione_server.Open()
Reader_SmsGateway = Comando_SmsGateway.ExecuteReader()
While Reader_SmsGateway.Read()
Dim RilevaEmail As New RilevaMail
With RilevaEmail
.INBOXID = Reader_SmsGateway("INBOXID")
.ANUMBER = Reader_SmsGateway("ANUMBER")
.DEVICECODE = Reader_SmsGateway("DEVICECODE")
.SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
.RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
.TESTO = "Spedito da : " & .ANUMBER & Chr(13) & " Ricevuto il : " & .RECEIVEDDATE & Chr(13) & " Testo del messaggio : " & .SMSMESSAGE
End With
ListaOggetti.Add(RilevaEmail)
For Each Oggetto As RilevaMail In ListaOggetti
Comando_SmsPanel.Connection = Connessione
Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
'Per impostare un parametro in una clausola WHERE con SELECT bisogna Esplicitare il tipo ! e poi assegnarli il valore.
Comando_SmsPanel.Parameters.Add("@DEVICECODE", OleDbType.VarChar)
Comando_SmsPanel.Parameters("@DEVICECODE").Value = Oggetto.DEVICECODE
Comando_SmsPanel.CommandType = CommandType.Text
Connessione.Open()
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader()
While Reader_SmsPanel.Read()
Oggetto.EMAIL.Add("email")
End While
Connessione.Close()
Next
If BackgroundWorker1.CancellationPending Then
e.Cancel = True
Exit While
End If
End While
Connessione_server.Close()
End Sub
Devo aver cannato qualcosa che mi rovina il ciclo Read (Cpt. ovvio) ma cosa ?
Ok, e quello è a posto, ma riguarda il codice al tuo post #28.
A parte che leggo ancora un ExecuteScalar...
Ma il PASSAGGIO 1 deve finire dopo :
...
ListaOggetti.Add(RilevaEmail)
----> FINE Reader SmsGateway !
invece vedo che :
For Each Oggetto As RilevaMail In ListaOggetti
è ancora dentro al primo Reader.
I due PASSAGGI devono essere TOTALMENTE separati, e NON nidificati, come facevi prima.
Ok, e quello è a posto, ma riguarda il codice al tuo post #28.
A parte che leggo ancora un ExecuteScalar...
Ma il PASSAGGIO 1 deve finire dopo :
...
ListaOggetti.Add(RilevaEmail)
----> FINE Reader SmsGateway !
invece vedo che :
For Each Oggetto As RilevaMail In ListaOggetti
è ancora dentro al primo Reader.
I due PASSAGGI devono essere TOTALMENTE separati, e NON nidificati, come facevi prima.
sisi scusa è che mi ero dimenticato di separarli
oggi sono fuso :muro:
ecco il codice
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'Prendo i dati da smsservergateway e li confronto con smspanel
Dim Comando_SmsGateway As New OleDbCommand
Dim Comando_SmsPanel As New OleDbCommand
Dim Adapter_SmsGateway As New OleDbDataAdapter
Dim Adapter_SmsPanel As New OleDbDataAdapter
Dim Reader_SmsGateway As OleDbDataReader
Dim Reader_SmsPanel As OleDbDataReader
Comando_SmsGateway.Connection = Connessione_server
Comando_SmsGateway.CommandText = "SELECT * FROM INBOX"
Comando_SmsGateway.CommandType = CommandType.Text
Adapter_SmsGateway.SelectCommand = Comando_SmsGateway
Connessione_server.Open()
Reader_SmsGateway = Comando_SmsGateway.ExecuteReader()
While Reader_SmsGateway.Read()
Dim RilevaEmail As New RilevaMail
With RilevaEmail
.INBOXID = Reader_SmsGateway("INBOXID")
.ANUMBER = Reader_SmsGateway("ANUMBER")
.DEVICECODE = Reader_SmsGateway("DEVICECODE")
.SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
.RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
.TESTO = "Spedito da : " & .ANUMBER & Chr(13) & " Ricevuto il : " & .RECEIVEDDATE & Chr(13) & " Testo del messaggio : " & .SMSMESSAGE
End With
ListaOggetti.Add(RilevaEmail)
If BackgroundWorker1.CancellationPending Then
e.Cancel = True
Exit While
End If
End While
Connessione_server.Close()
For Each Oggetto As RilevaMail In ListaOggetti
Comando_SmsPanel.Connection = Connessione
Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
'Per impostare un parametro in una clausola WHERE con SELECT bisogna Esplicitare il tipo ! e poi assegnarli il valore.
Comando_SmsPanel.Parameters.Add("@DEVICECODE", OleDbType.VarChar)
Comando_SmsPanel.Parameters("@DEVICECODE").Value = Oggetto.DEVICECODE
Comando_SmsPanel.CommandType = CommandType.Text
Connessione.Open()
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader()
While Reader_SmsPanel.Read()
Oggetto.EMAIL.Add("email")
End While
Connessione.Close()
Next
End Sub
ti sto facendo disperare? :D
ora comunque dovrebbe essere a posto
Sì, mi sembra sia più o meno come l'avevo pensato io. :)
E allora funziona ?
no mi solleva l'eccezione
Impossibile utilizzare oggetti COM separati dai relativi RCW sottostanti.
:confused:
nella riga
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader()
missa che mi arrenderò , rifare il progetto da 0 significa buttare via due mesi di studio ...
missa che mi arrenderò , rifare il progetto da 0 significa buttare via due mesi di studio ...
Ma tu non eri quello che "arrendersi non è nel nostro credo" ?
Non mollare, soldato ! :D
Io credo che tu abbia pasticciato un po' troppo...
Tanto per cominciare esattamente che te ne fai del BackgroundWorker ?
Prova a separare QUEL compito che abbiamo discusso qui, ed eseguilo da solo. Lascia perdere il multithread per un attimo.
La soluzione che hai adesso DEVE funzionare.
E infine, se proprio sarai costretto a farlo : rifare il progetto da zero significa buttare 2 mesi in cui hai studiato in fretta e male. Perciò se lo vedi in un'ottica ottimista, sono 2 mesi che non ti capiteranno più. ;)
Ah, e un'altra cosa : la prossima volta che qualcuno ti dice "Studiati VB.NET, che è facile", hai il mio personale permesso di sputargli in un occhio ! :p
Ma tu non eri quello che "arrendersi non è nel nostro credo" ?
Non mollare, soldato ! :D
Io credo che tu abbia pasticciato un po' troppo...
Tanto per cominciare esattamente che te ne fai del BackgroundWorker ?
Prova a separare QUEL compito che abbiamo discusso qui, ed eseguilo da solo. Lascia perdere il multithread per un attimo.
La soluzione che hai adesso DEVE funzionare.
E infine, se proprio sarai costretto a farlo : rifare il progetto da zero significa buttare 2 mesi in cui hai studiato in fretta e male. Perciò se lo vedi in un'ottica ottimista, sono 2 mesi che non ti capiteranno più. ;)
Ah, e un'altra cosa : la prossima volta che qualcuno ti dice "Studiati VB.NET, che è facile", hai il mio personale permesso di sputargli in un occhio ! :p
il bgworker mi serve perchè mentre esegue queste cose teoricamente la mia applicazione dev essere in grado di interagire con l'utente (facendo altro , come inserire email , visualizzare il log degli eventi dei due db eccecc )
problema di db? no perchè li ho studiati entrambi bene e comunque ho fatto dei test prima di iniziare a scrivere codice
e la logica del programma che è un po "catapecchiante (se si puo dire :D) "
:doh:
in questo momento vorrei fare -->:bsod: :bsod: :bsod: :bsod: :bsod:
che alla fine il form dove risiede il bgworker fa solo quello , ha un menu da cui parte il bg worker e poi altri menu che rimandano ad altri form percio non fa altro ... bo
Ok, ma io non ti dico necessariamente "abbandona l'idea del bgWorker"...
Io ti dico : prova per un attimo a mettere l'operazione che abbiamo visto qui nello stesso thread principale.
Separa l'applicazione in passi discreti.
Solo così puoi risalire all'origine dell'errore.
ho associato tutto all evento Connetti del menu del form (o thread) principale , senza avviare nessun bgworker
stesso errore
Impossibile utilizzare oggetti COM separati dai relativi RCW sottostanti.
sempre sul executereader()
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader()
ovviamente ho tolto tutti i riferimenti a bgworker , percio significa che non è un problema legato a quest ultimo
Strano, comunque se è sicuro che adesso fai tutto dall'unico thread, ci sono ancora alcune cose che non capisco nel tuo codice al post #33.
Tu dichiari 2 DataAdapter :
Dim Adapter_SmsGateway As New OleDbDataAdapter
Dim Adapter_SmsPanel As New OleDbDataAdapter
Il primo lo usi nel passaggio 1, mentre il secondo ( Adapter_SmsPanel ) non lo vedo mai utilizzato. Già questo non va.
Tu alla fine devi fare 2 query con 2 Command che generano un DataReader a testa. Che te ne fai degli Adapter ?
Per creare un Reader non è assolutamente necessario un Adapter.
Gli oggetti essenziali sono : Connection / Command / DataReader.
Tutto il resto è superfluo.
Dai una ripulita e poi posta il codice nuovo, senza bgworker e senza gli adapters...
Strano, comunque se è sicuro che adesso fai tutto dall'unico thread, ci sono ancora alcune cose che non capisco nel tuo codice al post #33.
Tu dichiari 2 DataAdapter :
Dim Adapter_SmsGateway As New OleDbDataAdapter
Dim Adapter_SmsPanel As New OleDbDataAdapter
Il primo lo usi nel passaggio 1, mentre il secondo ( Adapter_SmsPanel ) non lo vedo mai utilizzato. Già questo non va.
Tu alla fine devi fare 2 query con 2 Command che generano un DataReader a testa. Che te ne fai degli Adapter ?
Per creare un Reader non è assolutamente necessario un Adapter.
Gli oggetti essenziali sono : Connection / Command / DataReader.
Tutto il resto è superfluo.
Dai una ripulita e poi posta il codice nuovo, senza bgworker e senza gli adapters...
ok , pulisco --> rinnovo --> trascrivo
niente ... ho deciso di riscriverlo da 0 , sono partito sta notte alle 2 e ora sono quasi alla fine (2 mesi di lavoro in quasi 13 ore ...) non lo sto copiando ma lo sto rifacendo , migliorando , :read:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.