[VB.NET] DataSet updaten met XML file

Pagina: 1
Acties:

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
ik ben nu bezig met een client-server app, waarbij de client de database wijzigt en deze wil doorvoeren op de server. (client = VB6 / server = ASP.NET)

Volgens mij zijn er meerdere manieren om dit voor elkaar te krijgen, ik zou graag wat tips hebben wat het eenvoudigs/beste is.

Dit heb ik tot nu gedaan:
1) Ik wijzig op de client wat records in een tabel
2) schrijf de gehele tabel weg naar een XML file
3) lees deze XML in op de server en vul hiermee Dataset1
4) vul Dataset2 met oude tabel op de server

En dan moet ik per row controleren wat de status is en dan de juiste actie nemen? :?
zoals een rij toevoegen:

Visual Basic .NET:
1
2
3
4
5
For Each row In table.Rows
     If row.RowState <> DataRowState.Unchanged Then
           changedRows.Add(row)
     End If
Next


Ik zou graag weten of ik in de goede richting zit, of dat ik het anders moet aanpakken.

[ Voor 3% gewijzigd door CaptBiele op 08-06-2004 15:53 . Reden: client is VB6... wel handig om te weten ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Wat bedoel je met die tabel in punt 1 ?

Waarom schrijf je die 'tabel' weg als een XML file, en ga je vervolgens heel wat operaties doen?
Waarom maak je geen gebruik van de DataAdapter.Update() method, en geef je die dataset of datatable mee als argument?
Je moet er gewoon voor zorgen dat je DataAdapter dan een SelectCommand etc... heeft. (Als ie een select command heeft, kan je de update/insert/delete commands laten genereren).

Als je geen gebruik wilt maken van de DataSet/DataAdapter aproach, dan kan je ook dit doen:

code:
1
2
3
4
5
6
7
8
9
DataSet toInsert = theDataSet.GetChanges (DataRowState.Added);
foreach( DataRow dr in toInsert.Tables[0] )
{
   // doe hier een insert voor ieder record.
}
DataSet toUpdate = theDataSet.GetChanges (DataRowState.Updated);
{
   // update command uitvoeren voor iedere row
}

[ Voor 60% gewijzigd door whoami op 08-06-2004 15:51 ]

https://fgheysels.github.io/


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
sorry whoami, was vergeten te vermelden dat client VB6 gebruikt. Geldt je verhaal dan nog steeds? }:O

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Hmm, nee.

Maar dan vraag ik me nog af: wat voor zin heeft die web-applicatie dan als je een VB6 client wilt gebruiken? (Of omgekeerd, waarom kan je die ASP.NET app niet gebruiken om je updates te doen ? )

https://fgheysels.github.io/


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
we gebruiken hardware die alleen uit te lezen is in VB6. I know, heel erg irritant.
De clients (multi-company support) kunnen nieuwe informatie naar de server up- en downloaden.

Nu ben ik bezig met het upload gedeelte. De client stuurt een XML file van de gewijzigde tabel, en die lees ik uit op de server. Ik kan de XML file in een datagrid tonen, dus het heeft een format waar .NET mee overweg kan (lijkt me). Dan maakt het eigenlijk toch niet uit of de client VB6 is?

Ik wil dus alleen weten hoe ik het beste met een XML file een DataSet kan updaten....
(iets wat me toch vaak voor lijkt te komen)

Misschien is het beter om de XML regel voor regel in te lezen en dan met de bijbehorende tablerow te vergelijken :|

[ Voor 10% gewijzigd door CaptBiele op 08-06-2004 16:57 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
En gebruik maken van webservices, is dat een optie? Lekker met het SOAP protocol stoeien? Ik ga ervan uit dat er wel SOAP objecten beschikbaar zijn voor VB6.

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
we gebruiken al WebServices om de XML file over te pompen. Dit heeft niets te maken met de update van de database....

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
ok nu ben ik denk ik al verder.

Ik heb de input XML in een dataset gelezen: dsClient
Ik heb de originele data op de server ook in een dataset gelezen: dsServer (gebruik makend van de fill-methode)

Dan controleer ik handmatig per row (zelfs per item) of de rijen van de client overeenkomen met die van de server. Als er verschillen zijn worden de nieuwe records toegevoegd. (wijzigen is niet toegestaan)
De wijzigingen voer ik door naar de database met de da.Update() methode.

Als ik de update functie de eerste keer aanroep, lijkt het goed te gaan. Als ik daarna een simpele refresh doe, lijkt het precies dezelfde werking te hebben, alhoewel de db is gewijzigd en dat dus niet meer zou mogen.

Dus ik heb de indruk dat de in-memory ds nog gebruikt wordt oid? ik heb al ds.clear() geprobeerd, maar geen verschil. Moet ik hierop letten?

[ Voor 63% gewijzigd door CaptBiele op 10-06-2004 07:27 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Je zal waarschijnlijk nog de AcceptChanges method van de DataSet moeten aanroepen. Die method zet oa de rowstate op UnChanged oid.

https://fgheysels.github.io/


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 23-05 16:11

CaptBiele

No Worries!

Topicstarter
whoami schreef op 10 juni 2004 @ 08:18:
Je zal waarschijnlijk nog de AcceptChanges method van de DataSet moeten aanroepen. Die method zet oa de rowstate op UnChanged oid.
Dat heb ik al gedaan. Zie mijn code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
        '---------- Client ----------
        'Create reader for XML file 
        Dim stream As New StreamReader(strPath)
        Dim dsClient As New DataSet
        Dim drClient As DataRow

        'Read XML into client-dataset object 
        dsClient.ReadXml(stream)
        stream.Close()

        '---------- Server ----------
        Dim strConnection As String = ConfigurationSettings.AppSettings("ConnString")
        Dim cnn As New OdbcConnection(strConnection)
        Dim strSQL As String = "SELECT * FROM idevice_grouptype"
        Dim da As New OdbcDataAdapter(strSQL, cnn)
        Dim CmdBld As New OdbcCommandBuilder(da) 'object that generates the SQL commands for updating the data
        Dim dsServer As New DataSet 'contains the original data
        Dim dsToInsert As New DataSet 'contains the rows that should be added 
        Dim drServer As DataRow 'a single row in the server dataset
        Dim dcServer As DataColumn 'a single column in the server dataset

        da.Fill(dsServer, "ServerData")

        Dim intRow As Integer = 0
        Dim intTemp As Integer = 0
        Dim intItem As Integer = 1
        Dim strStatus As String = ""

        Try
            'This loops checks how long the serverrows are similar to the clientrows
            For intRow = 0 To dsServer.Tables(0).Rows.Count - 1
                drServer = dsServer.Tables(0).Rows(intRow)  'current row of server data
                drClient = dsClient.Tables(0).Rows(intRow) 'current row of client data

                intItem = 1 'Item 0 is autonumber and is always different
                While (intItem < drServer.ItemArray.Length - 1)
                    'check voor "s_" columnname of current row
                    If (drServer.Item(intItem) <> drClient.Item(intItem)) Then
                        Exit For
                    End If
                    intItem = intItem + 1
                End While
                intTemp = intTemp + 1
            Next

            'Cursor in server table should always be at the end, as only INSERT commands are allowed
            'The cursor position in the client table is critical. From this point the INSERTS are executed
            For intRow = intTemp To dsClient.Tables(0).Rows.Count - 1
                drClient = dsClient.Tables(0).Rows(intRow) 'current row of client data
                dsServer.Tables(0).ImportRow(drClient) 'the client rows are imported
            Next

            'Check in the dataset which rows have the status added
            If dsServer.HasChanges(DataRowState.Added) Then
                dsToInsert = dsServer.GetChanges(DataRowState.Added)
                Dim ChangeRecords As Integer = 0 ' can be used to check if rows are really added, or update is not necessary
                ChangeRecords = da.Update(dsToInsert, "ServerData")
            End If

            'Persist changes to the database
            dsServer.AcceptChanges()

            cnn.Close()
            dsClient.Clear()
            dsServer.Clear()
            dsToInsert.Clear()

            strReturn = "success"

        Catch ex As Exception
            Throw New Exception("No : " & ex.Message)
        End Try

        Return strReturn


Sorry dat het zo`n brok is, maar ik denk dat het allemaal wel relevant is ....
Pagina: 1