Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
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


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
Le 10 migliori offerte Amazon di Pasqua:...
Nuove fotografie dagli astronauti di Art...
La toilette della capsula Orion Integrit...
GeForce NOW: ecco tutte le novità in arr...
Il Realme 16 5G debutta sul mercato glob...
HONOR svela tre nuovi tablet: il più int...
Tineco Floor One S9 Master: aspira e pul...
Vivo X300 Ultra, il lancio globale è ini...
Offerte robot aspirapolvere Amazon: ECOV...
L'AI genera codice in 8 minuti e i senio...
Ring Intercom Audio a 44,99€ su Amazon: ...
Apple iPhone 16 crolla a 689€: ecco perc...
Google Pixel 9 a 449,90€ con caricatore ...
Ecco la top 7 delle offerte Amazon, aggi...
Ex ingegnere ammette il sabotaggio: migl...
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: 22:03.


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