|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
[VB.NET 2010] Delucidazioni su possibili azioni con ExecuteScalar()
Ciao a tutti rieccomi a rompere
Ora sto ultimando la mia prima desktop-app. basata interamente sui miei Studi autonomi.. sono quasi alla fine e non voglio fermarmi proprio ora il mio problema sta in questa private sub che QUALCUNO mi ha aiutato a finire con tanta pazienza la subroutine funziona perfettamente ma ora vorrei aggiungere l'ultimo tassello (che spiego sotto il codice). 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
Codice:
EMAIL = Comando_SmsPanel.ExecuteScalar() Codice:
Comando_SmsPanel.CommandText = "SELECT email FROM numeri INNER JOIN email ON email.id_email = numeri.idemail WHERE numero = @DEVICECODE" mentre vi scrivo sto spulciando MSDN ma non sembra avere la risposta |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Per ora ho risolto cosi
Codice:
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
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Sì, così può andare, Ludo.
Complimenti per il .IsNullOrEmpty !
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Quote:
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 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
Codice:
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()
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 [email protected] e [email protected] 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 ? Ultima modifica di Ludo237 : 15-12-2010 alle 19:52. |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
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.
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#6 | |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Quote:
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Non sono entrato nel merito del tuo codice ( e non intendo certo farlo a mezzanotte... 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...
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#8 | ||
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Quote:
se ne ha di piu ne fa un altra si puo fare??? aiuto , pensavo che vb.net fosse facile Quote:
Ultima modifica di Ludo237 : 16-12-2010 alle 15:22. |
||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
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 : Codice:
Private Structure Persona
Dim cognome As String
Dim nome As String
'...
'...
End Structure
Codice:
Dim P As New Persona
P.nome = "ilnome"
P.cognome = "ilcognome"
'...
'...
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 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.
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#10 | |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Quote:
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
|
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Se hai già sviluppato in Object-Oriented-PHP non sei certo a zero. Quote:
Inizia dalle Structures.
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
||
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Quote:
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 stavo pensando visto che devo finirlo in qualche modo questo primo-progetto-schifoso questa è la parte incriminata Codice:
EMAIL = Comando_SmsPanel.ExecuteScalar() ) 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 ?
|
|
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Quote:
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 stavo pensando visto che devo finirlo in qualche modo questo primo-progetto-schifoso questa è la parte incriminata Codice:
EMAIL = Comando_SmsPanel.ExecuteScalar() ) 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 ?
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2285
|
ciao
per avere n risultati ti serve chiamare executereader http://msdn.microsoft.com/it-it/libr...=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);
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
|
#15 | |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Quote:
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
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()
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 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 ?
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
Ora come ora no !
) fortuna mi stanno consigliando di sbatterci la testa violentemente fino a stanotte |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Al codice ci arrivi. Se non hai capito il procedimento allora anche il codice non potrà che essere sbagliato.
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Feb 2009
Città: Varese
Messaggi: 205
|
e difatti non ho capito bene .. intanto ci provo a svilupparlo ma missa che qualcosa mi manca
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Almeno è quello che farei io se fossi al tuo posto
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:36.












aiuto , pensavo che vb.net fosse facile
al massimo finisco questo e poi lo rifaccio.








