Oppure

Loading
03/12/09 14:17
peteruncle9
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


aaa
03/12/09 15:58
Il Totem
WriteXml e ReadXml. Se vuoi qualcosa di più compatto:
blogs.objectsharp.com/cs/blogs/datasetfaq/archive/2004/06/10/…
aaa
05/12/09 14:17
peteruncle9
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)

   Function RQ_Table1() As System.IO.Stream
        Dim networkStream As NetworkStream = MyServer.GetStream
        Dim sendBytess As Byte() = Encoding.ASCII.GetBytes("RQ_Table1")
        networkStream.Write(sendBytess, 0, sendBytess.Length)
        Return networkStream
    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:
DbDataSet.Table1.ReadXml(RQ_Table1)
Ultima modifica effettuata da peteruncle9 05/12/09 14:18
aaa
06/12/09 10:46
peteruncle9
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

If clientdata = "RQ_Table1" Then
Table1TableAdapter.Fill(DbDataset.Table1)
myClient.SendBufferSize = 0 'e qui??? quanto mettere?
DbDataset.Table1.WriteXml(networkStream)
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 06/12/09 10:58
aaa
06/12/09 11:07
Il Totem
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.
aaa
06/12/09 11:32
peteruncle9
Potresti fare qualche esempio pratico?
aaa
07/12/09 10:08
Il Totem
Esempio grezzo:
Private XmlStream As IO.MemoryStream

'...
If clientdata = "RQ_Table1" Then
   Table1TableAdapter.Fill(DbDataset.Table1)
   XmlStream = New IO.MemoryStream()
   DbDataset.Table1.WriteXml(XmlStream)
   XmlStream.Position = 0
   Dim T As New Threading.Thread(AddressOf SendXml)
   T.Start()
End If

'...

Private Sub SendXml()
   Dim Buffer(myClient.SendBufferSize - 1) As Byte
   Do
      XmlStream.Read(Buffer, 0, Buffer.Length)
      networkStream.Write(Buffer, 0, Buffer.Length)
      'Threading.Thread.Sleep(10) < potrebbe essere utile
   Loop Until XmlStream.Position >= XmlStream.Length
End Sub
aaa
07/12/09 11:28
peteruncle9
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:
    Overloads Function RQ_table1() As System.IO.Stream
        Dim networkStream As NetworkStream = MyServer.GetStream
        Dim sendBytess As Byte() = Encoding.ASCII.GetBytes("RQ_Table1")
        Dim bytes(MyServer.ReceiveBufferSize) As Byte
        networkStream.Write(sendBytess, 0, sendBytess.Length)


        Do
            networkStream.Read(bytes, 0, CInt(MyServer.ReceiveBufferSize))
        Loop 'fino a quando continuare? 

        Return networkStream
    End Function
Ultima modifica effettuata da peteruncle9 07/12/09 15:29
aaa