Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-12-2010, 15:44   #1
Ludo237
Member
 
L'Avatar di Ludo237
 
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
[VB.NET 2010] Leggere Risultato Query Access

Ciao ragazzi !
Sto sviluppando un applicazione in Vb.Net che utilizza due thread separati (sfrutto il backgroundworker)
nel secondo thread (generato con il metodo do_work di bgworker) ho questo codice
Codice:
    <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
        Dim ANUMBER As String
        Dim SMSMESSAGE As String
        Dim RECEIVEDDATE As Date
        Dim DEVICECODE As String
        'Dim NUMERO As String
        Dim EMAIL As String
        Dim TESTO 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
            ANUMBER = Reader_SmsGateway("ANUMBER")
            DEVICECODE = Reader_SmsGateway("DEVICECODE")
            SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
            RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
            TESTO = "Ricevuto da : " & ANUMBER & Chr(13) & "Testo : " & SMSMESSAGE & Chr(13) & "Ricevuto il : " & RECEIVEDDATE
            Comando_SmsPanel.Connection = Connessione
            Comando_SmsPanel.CommandText = "SELECT * FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
            Comando_SmsPanel.CommandType = CommandType.Text
            Comando_SmsPanel.Parameters.AddWithValue("@DEVICECODE", DEVICECODE)
            Adapter_SmsPanel.SelectCommand = Comando_SmsPanel
            Connessione.Open()
            Reader_SmsPanel = Comando_SmsPanel.ExecuteReader
            Reader_SmsPanel.Read()
            EMAIL = Reader_SmsPanel.Item(4)
            Connessione.Close()
            MessageBox.Show("Ricevuto da INBOX : " & ANUMBER & " " & DEVICECODE & " " & SMSMESSAGE & " " & RECEIVEDDATE & Chr(13) & "Risultato lettura smspanel : " & TESTO & Chr(13) & "Variabile " & EMAIL)
            'InviaEmail(EMAIL, TESTO)
            System.Threading.Thread.Sleep(500)
            If BackgroundWorker1.CancellationPending Then
                e.Cancel = True
                Exit While
            End If
        End While
    End Sub
Le connessioni vengono fatte a livello globale

comunque sia io sto impazzendo nel capire come leggere il risultato della seconda query (interna al ciclo while) ed assegnarlo alla variabile EMAIL, perchè mi da sempre un errore qui

Codice:
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader
l'errore è un eccezione : "Impossibile utilizzare oggetti COM separati dai relativi RCW sottostanti."

COSA DIAMINE DEVO FAR E???
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 07:57   #2
Ludo237
Member
 
L'Avatar di Ludo237
 
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
Nessuno ha mai avuto questo problema ?
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 10:04   #3
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
E' difficile dirti cosa esattamente non vada.
Bisognerebbe replicare abbastanza fedelmente il tuo ambiente di test, soprattutto quando si ha a che fare con il multithreading...

Io faccio solo alcune considerazioni, guardando velocemente quel codice :

1.
System.Threading.Thread.Sleep(500)
Vedere una Sleep mi fa sempre pensare che la cosa non sia stata studiata proprio bene... Spesso le Sleep vengono usate impropriamente perchè ci si aspetta che una certa cosa venga eseguita "sicuramente entro un tot di tempo", e poi arrivano le brutte sorprese...

2.
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader
Reader_SmsPanel.Read()

Se ci si aspetta UN solo valore perchè fare un Reader ?!
Meglio .ExecuteScalar.

3.
Accedere ad un singolo file Access con codice Multithreaded, o comunque con comandi ADO.NET nidificati, può sempre portare a risultati inattesi, proprio a causa del fatto che Access digerisce male la concorrenza in lettura/scrittura...
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ]
Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ]

Ultima modifica di MarcoGG : 07-12-2010 alle 10:09.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 14:14   #4
Ludo237
Member
 
L'Avatar di Ludo237
 
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
E' difficile dirti cosa esattamente non vada.
Bisognerebbe replicare abbastanza fedelmente il tuo ambiente di test, soprattutto quando si ha a che fare con il multithreading...

Io faccio solo alcune considerazioni, guardando velocemente quel codice :

1.
System.Threading.Thread.Sleep(500)
Vedere una Sleep mi fa sempre pensare che la cosa non sia stata studiata proprio bene... Spesso le Sleep vengono usate impropriamente perchè ci si aspetta che una certa cosa venga eseguita "sicuramente entro un tot di tempo", e poi arrivano le brutte sorprese...

2.
Reader_SmsPanel = Comando_SmsPanel.ExecuteReader
Reader_SmsPanel.Read()

Se ci si aspetta UN solo valore perchè fare un Reader ?!
Meglio .ExecuteScalar.

3.
Accedere ad un singolo file Access con codice Multithreaded, o comunque con comandi ADO.NET nidificati, può sempre portare a risultati inattesi, proprio a causa del fatto che Access digerisce male la concorrenza in lettura/scrittura...
Ti rispondo il piu preciso possibile

Uso visual studio 2010 Ultimate con Net 4 (aggiornato a novembre 2010) , lo sleep l'ho usato solo per "Rallentare l'esecuzione" dato che utilizzo dei dati d'esempio su i due access (3-4 record a dir tanto)
Puo causare problemi? lo tolgo subito

2) uso reader perchè non sapevo come altro fare cioè mi spiego : il valore che mi aspetto è una EMAIL che si ricava dalla query
Codice:
Comando_SmsPanel.CommandText = "SELECT * FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
perciò pensavo di "leggere" il contenuto della query ma se bisogna usare executescalar , come dovrei procedere?

3) non è un unico file access ma ben due DB access diversi ovvero

la prima query
Codice:
Comando_SmsGateway.CommandText = "SELECT * FROM INBOX"
viene fatta su un DB

e la seconda query
Codice:
Comando_SmsPanel.CommandText = "SELECT * FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
viene fatta su un altro DB

Funziona tutto alla perferzione tranne la lettura del risultato della seconda query e la successiva assegnazione di tale risultato alla variabile EMAIL .
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 14:42   #5
Ludo237
Member
 
L'Avatar di Ludo237
 
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
Ho modificato questa parte di codice
ma ancora del risultato della query nessuna traccia , ma che diamine è????
Codice:
While Reader_SmsGateway.Read()
            INBOXID = Reader_SmsGateway("INBOXID")
            ANUMBER = Reader_SmsGateway("ANUMBER")
            DEVICECODE = Reader_SmsGateway("DEVICECODE")
            SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
            RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
            TESTO = "Ricevuto da : " & ANUMBER & Chr(13) & "Testo : " & SMSMESSAGE & Chr(13) & "Ricevuto il : " & RECEIVEDDATE
            Comando_SmsPanel.Connection = Connessione
            Comando_SmsPanel.CommandText = "SELECT * FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE "
            Comando_SmsPanel.CommandType = CommandType.Text
            Comando_SmsPanel.Parameters.AddWithValue("@DEVICECODE", DEVICECODE)
            Connessione.Open()
            EMAIL = Comando_SmsPanel.ExecuteNonQuery()
            Connessione.Close()
            MessageBox.Show("Ricevuto da INBOX : " & ANUMBER & " " & DEVICECODE & " " & SMSMESSAGE & " " & RECEIVEDDATE & Chr(13) & "Risultato lettura smspanel : " & TESTO & Chr(13) & "Variabile " & EMAIL)
            'InviaEmail(EMAIL, TESTO)
            'System.Threading.Thread.Sleep(500)
            If BackgroundWorker1.CancellationPending Then
                e.Cancel = True
                Exit While
            End If
        End While
Nel mesagebox.show() mi mostra tutto perfetto e cambia (in modo congruo al DB) tutte le variabili ad ogni ciclo while , fatta eccezione per EMAIL che rimane sempre a 0 (con executenonquery)
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 15:11   #6
Ludo237
Member
 
L'Avatar di Ludo237
 
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
Durante il debug nella finestra delle "variabili locali" la variabile EMAIL rimane con valore "nothing"
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 15:20   #7
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da Ludo237 Guarda i messaggi
2) uso reader perchè non sapevo come altro fare cioè mi spiego : il valore che mi aspetto è una EMAIL che si ricava dalla query
Codice:
Comando_SmsPanel.CommandText = "SELECT * FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE"
perciò pensavo di "leggere" il contenuto della query ma se bisogna usare executescalar , come dovrei procedere?
Allora, come già detto in precedenza, se la query restituisce sempre un valore, NON usare il DataReader.
Inizierei provando con .ExecuteScalar().
Il metodo è semplice, del tipo :
variabile = nomeCommand.ExecuteScalar().

Non entro nel merito della correttezza della query, ma vedo subito qualcosa che non quadra : perchè fai "SELECT *" se vuoi avere come risultato UNA stringa rappresentante UN indirizzo mail ?!
Select-Star restituisce un record ( e quindi un insieme di valori ), non un valore. Tu devi estrarre un valore solo, ossia un CAMPO, perciò dovresti avere una "SELECT nomeCampoEmail".
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ]
Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ]
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 15:36   #8
Ludo237
Member
 
L'Avatar di Ludo237
 
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Allora, come già detto in precedenza, se la query restituisce sempre un valore, NON usare il DataReader.
Inizierei provando con .ExecuteScalar().
Il metodo è semplice, del tipo :
variabile = nomeCommand.ExecuteScalar().

Non entro nel merito della correttezza della query, ma vedo subito qualcosa che non quadra : perchè fai "SELECT *" se vuoi avere come risultato UNA stringa rappresentante UN indirizzo mail ?!
Select-Star restituisce un record ( e quindi un insieme di valori ), non un valore. Tu devi estrarre un valore solo, ossia un CAMPO, perciò dovresti avere una "SELECT nomeCampoEmail".
si scusa quella era la vecchia query , è SELECT email From...

Ora provo
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 15:43   #9
Ludo237
Member
 
L'Avatar di Ludo237
 
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
FUNZIONAAAAAAAAAAAAAAA

in parte

cioè mi spiego

Codice:
 While Reader_SmsGateway.Read()
            INBOXID = Reader_SmsGateway("INBOXID")
            ANUMBER = Reader_SmsGateway("ANUMBER")
            DEVICECODE = Reader_SmsGateway("DEVICECODE")
            SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
            RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
            TESTO = "Ricevuto da : " & ANUMBER & Chr(13) & "Testo : " & SMSMESSAGE & Chr(13) & "Ricevuto il : " & RECEIVEDDATE
            Comando_SmsPanel.Connection = Connessione
            Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = '335******' "
            Comando_SmsPanel.Parameters.AddWithValue("@DEVICECODE", DEVICECODE)
            Comando_SmsPanel.CommandType = CommandType.Text
            Connessione.Open()
            EMAIL = Comando_SmsPanel.ExecuteScalar()
            Connessione.Close()
            MessageBox.Show("Ricevuto da INBOX : " & ANUMBER & " " & DEVICECODE & " " & SMSMESSAGE & " " & RECEIVEDDATE & Chr(13) & "Risultato lettura smspanel : " & TESTO & Chr(13) & "Variabile " & EMAIL)
            'InviaEmail(EMAIL, TESTO)
            'System.Threading.Thread.Sleep(500)
            If BackgroundWorker1.CancellationPending Then
                e.Cancel = True
                Exit While
            End If
        End While
se lascio la clausola WHERE statica (ovvero senza @DEVICECODE) funziona e mi visualizza l'email ma , ovviamente, non è quello che cerco perchè il where dev 'essere dinamico

il bello che la variabile DEVICECODE cambia ad ogni ciclo ed è (come scritto sopra) congrua ai dati ... risolto un problema se ne presenta un altro
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 16:03   #10
Ludo237
Member
 
L'Avatar di Ludo237
 
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
RISOLTO , ora posto le modifiche effettuate

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


        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()
            INBOXID = Reader_SmsGateway("INBOXID")
            ANUMBER = Reader_SmsGateway("ANUMBER")
            DEVICECODE = Reader_SmsGateway("DEVICECODE")
            SMSMESSAGE = Reader_SmsGateway("SMSMESSAGE")
            RECEIVEDDATE = Reader_SmsGateway("RECEIVEDDATE")
            TESTO = "Ricevuto da : " & ANUMBER & Chr(13) & "Testo : " & SMSMESSAGE & Chr(13) & "Ricevuto il : " & RECEIVEDDATE
            Comando_SmsPanel.Connection = Connessione
            Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE "
            Comando_SmsPanel.Parameters.Add("@DEVICECODE", OleDbType.VarChar)
            Comando_SmsPanel.Parameters("@DEVICECODE").Value = DEVICECODE
            Comando_SmsPanel.CommandType = CommandType.Text
            Connessione.Open()
            '
            EMAIL = Comando_SmsPanel.ExecuteScalar()
            Connessione.Close()
            MessageBox.Show("Ricevuto da INBOX : " & ANUMBER & " " & DEVICECODE & " " & SMSMESSAGE & " " & RECEIVEDDATE & Chr(13) & "Risultato lettura smspanel : " & TESTO & Chr(13) & "Variabile " & EMAIL)
            'InviaEmail(EMAIL, TESTO)
            'System.Threading.Thread.Sleep(500)
            If BackgroundWorker1.CancellationPending Then
                e.Cancel = True
                Exit While
            End If
        End While
    End Sub

Alla fine i bug erano

1) Dichiarazione esplicita della variabile per la clausola WHERE nella seconda query

2) utilizzo del metodo ExecuteScalar()

Ringrazio MarcoGG per le illuminazioni

AGGIUNGETELO SU FACEBOOK http://www.facebook.com/pages/MarcoGG/176216775722284 non vi costa nulla !
Ludo237 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 17:24   #11
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da Ludo237 Guarda i messaggi
FUNZIONAAAAAAAAAAAAAAA
Quote:
Originariamente inviato da Ludo237 Guarda i messaggi
Ringrazio MarcoGG per le illuminazioni

AGGIUNGETELO SU FACEBOOK http://www.facebook.com/pages/MarcoGG/176216775722284 non vi costa nulla !
Beh, è un piacere aiutare chi ringrazia e reagisce ai post con tanto entusiasmo !
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ]
Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ]
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Avio si prepara ai test del Dimostratore...
Space Pioneer ha annunciato le cause del...
Anthropic avrebbe nuovi antibiotici cont...
Scoperto un 'moltiplicatore nascosto' ne...
DREO: a IFA 2026 4 novità fra cui...
Slackbot genera dashboard e microsite de...
Idrogeno, nuova cella a combustibile rag...
Con la NASA fuori dai giochi, l'ESA risc...
Una falla di ChatGPT permette di estrapo...
Piano clima, 1,34 miliardi per il bonus ...
Porsche esce definitvamente da Bugatti R...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:40.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v