Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - VB.NET - Tcp/ip riempire dataset
Forum - C# / VB.NET - VB.NET - Tcp/ip riempire dataset

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
peteruncle9 (Normal User)
Rookie


Messaggi: 26
Iscritto: 30/05/2009

Segnala al moderatore
Postato alle 15:17
Giovedì, 03/12/2009
Ho un'applicazione windows form VB.NET che gestisce un database SQL Compact. Avrei bisogno di riuscire ad accedere al database tramite un altro computer collegato in rete, riempendo un dataset, attraverso l'applicazione (poichè non uso SQL server).

In pratica l'applicazione client chiede i dati al server (attraverso TCP) che prende i dati dal database sql compact e li invia al client tenenedo traccia di quali dati sono inviati.


Ho due problemi:
1) Come inviare i dati al client (convertire la tabella di dati in Byte()?)
2) Come riempire il dataset con quei dati



PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:58
Giovedì, 03/12/2009
WriteXml e ReadXml. Se vuoi qualcosa di più compatto:
http://blogs.objectsharp.com/cs/blogs/datasetfaq/archive/2 ...


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
peteruncle9 (Normal User)
Rookie


Messaggi: 26
Iscritto: 30/05/2009

Segnala al moderatore
Postato alle 15:17
Sabato, 05/12/2009
Ok, ma ho un problema.
Nel client ho la sequente funzione: il client manda al server la stringa RQ_Table1 e il server rimanda          DbDataset.Table1.WriteXml(networkStream)

Codice sorgente - presumibilmente VB.NET

  1. Function RQ_Table1() As System.IO.Stream
  2.         Dim networkStream As NetworkStream = MyServer.GetStream
  3.         Dim sendBytess As Byte() = Encoding.ASCII.GetBytes("RQ_Table1")
  4.         networkStream.Write(sendBytess, 0, sendBytess.Length)
  5.         Return networkStream
  6.     End Function



Il server manda l'oggetto, ma il programma client va in blocco: nessun errore, ma non procede; se interrompo l'esecuzione e vado in debug resta fermo (evidenziato in verde) sull'istruzione:
Codice sorgente - presumibilmente Plain Text

  1. DbDataSet.Table1.ReadXml(RQ_Table1)


Ultima modifica effettuata da peteruncle9 il 05/12/2009 alle 15:18
PM Quote
Avatar
peteruncle9 (Normal User)
Rookie


Messaggi: 26
Iscritto: 30/05/2009

Segnala al moderatore
Postato alle 11:46
Domenica, 06/12/2009
Ho capito il mio problema: l'oggetto da mandare occupa 2 o 3 MB. Provando a salvare lo Stream in un file ho visto che si ferma a 9 Kb. C'è un problema con il buffer, receiveBufferSize e SendbufferSize che interrompono il messaggio? Come risolvere il problema?

Nel server ho

Codice sorgente - presumibilmente C# / VB.NET

  1. If clientdata = "RQ_Table1" Then
  2. Table1TableAdapter.Fill(DbDataset.Table1)
  3. myClient.SendBufferSize = 0 'e qui??? quanto mettere?
  4. DbDataset.Table1.WriteXml(networkStream)
  5. End if



A quanto aumentare la dimensione del buffer? Se la aumento troppo mi crea un file vuoto alla fine. Come sapere la dimensione esatta?

Ultima modifica effettuata da peteruncle9 il 06/12/2009 alle 11:58
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 12:07
Domenica, 06/12/2009
Invece di aumentare la dimensione del buffer, mantieni uno stream temporaneo ed esegui delle verifiche cicliche sui nuovi dati in arrivato: man mano accodi i nuovi dati sullo stream temporaneo e alla fine leggi il tutto.
Per essere sicuro di ottenere le informazioni giuste, sarebbe opportuno usare una porta riservata a questo. Per eseguire i controlli puoi usare un timer o un ciclo. In entrambi i casi, sarebbe opportuno introdurre un qualche sistema di controllo per verificare la fine e l'attendibilità dei dati, come ad esempio un checksum.
Se non vuoi fare questo, basta inviare la dimensione del buffer, leggerla dallo stream e impostarla sulla nuova ricevuta, ma te lo sconsiglio.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
peteruncle9 (Normal User)
Rookie


Messaggi: 26
Iscritto: 30/05/2009

Segnala al moderatore
Postato alle 12:32
Domenica, 06/12/2009
Potresti fare qualche esempio pratico?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:08
Lunedì, 07/12/2009
Esempio grezzo:
Codice sorgente - presumibilmente VB.NET

  1. Private XmlStream As IO.MemoryStream
  2.  
  3. '...
  4. If clientdata = "RQ_Table1" Then
  5.    Table1TableAdapter.Fill(DbDataset.Table1)
  6.    XmlStream = New IO.MemoryStream()
  7.    DbDataset.Table1.WriteXml(XmlStream)
  8.    XmlStream.Position = 0
  9.    Dim T As New Threading.Thread(AddressOf SendXml)
  10.    T.Start()
  11. End If
  12.  
  13. '...
  14.  
  15. Private Sub SendXml()
  16.    Dim Buffer(myClient.SendBufferSize - 1) As Byte
  17.    Do
  18.       XmlStream.Read(Buffer, 0, Buffer.Length)
  19.       networkStream.Write(Buffer, 0, Buffer.Length)
  20.       'Threading.Thread.Sleep(10) < potrebbe essere utile
  21.    Loop Until XmlStream.Position >= XmlStream.Length
  22. End Sub



"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
peteruncle9 (Normal User)
Rookie


Messaggi: 26
Iscritto: 30/05/2009

Segnala al moderatore
Postato alle 12:28
Lunedì, 07/12/2009
Perfetto, ma così non c'è comunque alcuna verifica che il flusso sia arrivato correttamente.
Sul client, invece, devo creare un memorystream che continua a leggere finchè non finisce di trasmettere, ma come dirgli che è finita la trasmissione?

Sul client:
Codice sorgente - presumibilmente VB.NET

  1. Overloads Function RQ_table1() As System.IO.Stream
  2.         Dim networkStream As NetworkStream = MyServer.GetStream
  3.         Dim sendBytess As Byte() = Encoding.ASCII.GetBytes("RQ_Table1")
  4.         Dim bytes(MyServer.ReceiveBufferSize) As Byte
  5.         networkStream.Write(sendBytess, 0, sendBytess.Length)
  6.  
  7.  
  8.         Do
  9.             networkStream.Read(bytes, 0, CInt(MyServer.ReceiveBufferSize))
  10.         Loop 'fino a quando continuare?
  11.  
  12.         Return networkStream
  13.     End Function


Ultima modifica effettuata da peteruncle9 il 07/12/2009 alle 16:29
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 19:05
Martedì, 08/12/2009
Quando la funzione Read restituisce un numero inferiore alla dimensione del buffer, significa che sono stati letti meno dati di quelli che ci si aspettava. Ergo, non c'è più niente altro da leggere: la trasmissione è finita.
Dovrebbe funzionare...
Codice sorgente - presumibilmente C# / VB.NET

  1. Do
  2.   ReadBytes = networkStream.Read(...)
  3. Loop Until ReadBytes < MyServer.ReceiveBufferSize



"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo