Termos
Sellasen asian kanssa olen tässä pähkäilly jo jonkin aikaa kun kun Winsockin avulla lähetetään tekstiä toiselle clientille (Winsock1.SendData ) niin miten pystyn samalla lähetyksellä lähettämään tiedot nimi, teksti niin että vastaanottopäässä ne osataan erottaa toisistaan. Nyt siis vastaanotto tapahtuu näin (Soodan exampleista modattu http://sooda.dy.fi:8080/~sooda/foo/ceedee/ ):
Private Sub ws_DataArrival(ByVal bytesTotal As Long) Dim kaikki As String ws.GetData kaikki taulu = Split(kaikki, KOMMAND_Loppu) For i = 0 To UBound(taulu) tieto = taulu(i) If tieto = SEND_TEXT Then nimi, teksti... End If DoEvents Next End Sub
Vaikea selittää, mutta toivottavasti joku saa selkoa
Erottamalla tietokentät toisistaan jollain merkillä, vaikkapa ;.
Ja sitten Split:ssa määritellään erottimeksi tuo ";".
Kokeile tätä niin huomaat miten se menee:
Dim kaikki As String kaikki = "visuaali;pasikki" taulu = Split(kaikki, ";") For i = 0 To UBound(taulu) tieto = taulu(i) If tieto = SEND_TEXT Then 'nimi, teksti... End If DoEvents Next Print "nimi: " & taulu(0) Print "teksti: " & taulu(1)
miksi ei käytetä tietueita?
type datapaketti nimi as string teksti as string tiedot as string end type dim teksti as datapaketti teksti.nimi = "joku123" teksti.teksti = "moikka!" teksti.tiedot = "normi teksti"
Ja sitten kun lähetetään, lähetetään toi teksti-juttu. Toisessa päässä sitten vastaanotetaan:
data "teksti" vastaanotettu, tässä tapauksessa:
If teksti.tiedot = "normi teksti" then chattiteksti.text = chattiteksti.text & vbcrlf & teksti.nimi & ": " & teksti.teksti Endif
Tietääkseni winsockilla ei voi lähettää tietueita.
Tietääkseni voi, mutta joutuu kikkailemaan. Muistelisin että olisin joskus laittanut binäärinä yli ja sitten kopsannut copymemory-apilla tietue-rakenteeseen. Mahdolliset stringit piti muistaakseni olla kiinteän mittaisia... Helpointa on kyllä pistää kaikki samaan stringiin, kuten aikaisemmin ehdotettiin.
Hmmm... tietue ei ole muuta kuin datajono siinä missä mikä tahansa. Kyllä Winsockilla voi tietueen lähettää.
Helpointa on kyllä käyttää MSXML:ää. Muutat tietueen XML:ksi - heität yli ja muutat takaisin recordsetiksi...
Onkohan se tietueen muuttaminen XML:ksi miten helppoa vb6:ssa, eikö sen joudu kuitenkin tekemään kenttä kerrallaan? .NET:ssähän tuki löytyy suoraan.
Katsoppa MSXML-dokumentaatio. Myös ADO 2.8 tukee recordsetin lukemista suoraan XML:ksi:
Dim DataConn As New ADODB.Connection Dim ADOCmd As New ADODB.Command Dim strXML as String Dim rstXML As New ADODB.Recordset Dim astStream As New ADODB.Stream DataConn .ConnectionString = "...MyConnectionString..." DataConn.Open ADOCmd.ActiveConnection = DataConn ADOCmd.CommandType = adCmdText ADOCmd.CommandText = "Select * from MyTable" Set ADOCmd.ActiveConnection = DataConn Set astStream = New ADODB.Stream Set rstXML = ADOCmd.Execute If rstXML.EOF = False Then rstXML.Save astStream, adPersistXML strXML = astStream.ReadText(adReadAll) Else strXML = "" End If
tottakai recordsetistä, mutta puhe kai oli (ainakin alunperin) UDT-tietueista?
No jos nyt tarkkoja ollaan - kyse taisi olla tekstijonosta, jossa arvot oli eroteltu esim. puolipisteellä.
No mikäs ongelma sitä nyt tekstijonoa kaikenkaikkiaan on lähettää??? Ei sitä tarvitse pilkkoa eikä muutenkaan muuttaa miksikään.
Ratkaisu kysymykseen on ymmärtääkseni jo gceppoon vastauksessa.
Tietuetta siirrettäessä yleensä oletetaan sen olevan tietuemuotoinen - oli sitten tietue tuotettu tietokannasta tai ei. Recordsetin voi luoda myös muistin varaisesti, sijoittaa datan siihen ja muuttaa se XML:ksi (ks. edellinen vastaus: rstXML.Save astStream, adPersistXML).
Tällä tavoin saadaan aikaan DTD, joka itsessään sisältää tiedon jokaisesta sarakkeesta ja niiden tietotyypistä. Tieto on helposti jaettavissa ja tallennettavissa haluttuun muotoon.
Mid ja instr lauseetkin ovat käteviä tässä tapauksessa esim
if mid(data,1,4)="msg " then msgbox mid(data,4)
Aihe on jo aika vanha, joten et voi enää vastata siihen.