Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-12-2010, 16: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, 08: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, 11: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 11:09.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2010, 15: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, 15: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, 16: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, 16: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, 16: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, 16: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, 17: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, 18: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


DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
Kaspersky punta su IA e servizi gestiti ...
Già sfruttata la falla Brotli che...
Potrebbe essere stato scoperto un nuovo ...
Claude Code, il prompt per scovare telec...
Palit e GALAX smentiscono le voci sulla ...
Fujifilm annuncia la Instax Mini Evo 2, ...
Tailscale chiude le falle SSH verso root...
Il tuo Galaxy laggava nei giochi? Samsun...
Arrivano i nuovi Amazon Echo: prezzi da ...
Il nuovo pickup elettrico Ford può alime...
Opera WebAI: così l'intelligenza artific...
Copilot nella Sidebar di Edge sparisce p...
X terrorizza gli utenti con una mano gig...
Firmware UEFI, embargo saltato per error...
Android 18 limiterà le modifiche alla ru...
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: 16:01.


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