Avatar billede neocron Nybegynder
23. september 2007 - 16:41 Der er 9 kommentarer og
1 løsning

Returnering af DataSet/DataTable fra webservice til klient

Hej,
Jeg er igang med at lave et lille program, og dette har en bagvedliggende Oracle database hvor data lagres og trækkes.

Det, jeg har lavet indtil videre virker fint. Men nu sidder jeg med noget som jeg ikke er helt klar over. Jeg har gjort et par forsøg uden dog at være sikker på om jeg er på rette spor.

Mit mål er at jeg vil undgå at implementere Oracle i klientapplikationen (skrevet i VB.net) og alt godkendelse,database-halløj m.v. foregår via webservice. Kort og godt er det for at undgå at alle mulige komponenter skal inkluderes med programmet.

Jeg har en test, hvor jeg har et datagridview i min klient. Denne skal gerne fyldes med data (SELECT * FROM tabel) og der har jeg lidt praktiske problemer med, hvordan jeg skal lave funktionen i webservice og få den til at returnere et dataset eller datatable, som jeg så kan sætte til DataSource i klientprogrammet. Er dette muligt?

Her er der et funktionelt eksempel på at få det til at virke _hvis_ det hele holdes i et program - altså uden webservice o.l:

Public Sub popDataGrid()
    Dim con As OracleConnection = New OracleConnection()
    con.ConnectionString = constr
    Dim da As OracleDataAdapter = New OracleDataAdapter
    Dim ds As New DataSet
    da.SelectCommand = New OracleCommand("SELECT * FROM testTabel", con)

    Try
        If con.State = ConnectionState.Closed Then
            con.Open()
            da.Fill(ds, "myDataset")
            Form1.minDataGrid.DataSource = ds.Tables("myDataset")
            con.Close()
        End If
    Catch ex As OracleException
        MsgBox("Fejl under udførsel (" & ex.Number & "): " & vbCrLf & ex.Message, MsgBoxStyle.Critical, "Fejl")
    End Try
End Sub

Nogle der har nogle forslag til hvordan jeg kan omskrive denne til at returnerer datasettet så jeg kan assigne DataSource i klientapplikationen? Som I kan se her assignes DataSource direkte til minDataGrid.

Håber, der er til at forstå. Ellers uddyber jeg gerne.
Avatar billede neoman Novice
23. september 2007 - 17:04 #1
Public Function GetData() as DataTable
    Dim con As OracleConnection = New OracleConnection()
    con.ConnectionString = constr
    Dim da As OracleDataAdapter = New OracleDataAdapter
    Dim dt As New DataTable
    da.SelectCommand = New OracleCommand("SELECT * FROM testTabel", con)

    Try
        If con.State = ConnectionState.Closed Then
            con.Open()
            da.Fill(dt)
            con.Close()
        End If
    Catch ex As OracleException
        MsgBox("Fejl under udførsel (" & ex.Number & "): " & vbCrLf & ex.Message, MsgBoxStyle.Critical, "Fejl")
    End Try
Return dt
End Function

og du ved godt at MsgBox kun funker på din egen maskine ?
Avatar billede neoman Novice
23. september 2007 - 17:16 #2
Og datadapterne åbner/lukker for forbindelsen selv, når de møder en lukket connection, ellers lader de den være åben (f.eks. hvis du åbner selv, så skal du selv lukke). I det sidste tilfælde bør din con.Close sidde i en Finally (den kode som køres uanset om der var fejl som blev Catch'et eller ej) ellers får du ikke lukket forbindelsen i tilfælde af fejl.
Avatar billede arne_v Ekspert
23. september 2007 - 18:02 #3
neoman har vist dækket det spurgte nemlig hvordan man returnerer et DataSet.

Men jeg vil lige pointere at efter min mening bør du returnere et array af din egen klasse
fremfor et DataSet.

Fordi:
1) en sådan kan også bruges som DataSource
2) den vil generere en mindre respons som skal sendes over netværket
3) din web service kan så gen bruges i andre sprog (alt fra Java til Python)
Avatar billede neocron Nybegynder
23. september 2007 - 22:04 #4
Jeg får en fejl når jeg forsøger at køre programmet.
Jeg har opdateret min funktion som neoman har lavet,

"Server was unable to process request. ---> There was an error generating the XML document. ---> Cannot serialize the DataTable. DataTable name is not set".

Det er åbenbart ikke tilladt, som jeg forsøgte, at navngivne den som "da.Fill(dt, "test")".

Jeg kalder funktionen fra min klient på følgende måde:
minDataGrid.DataSource = programnavn.My.Webservices.Service.GetData

Hvordan får jeg navngivet mit DataTable som - umiddelbart - ser ud til at være problemet?

Arne - lyder interessant med arrays, jeg lavede en lign. funktion som returnerer en brugers oplysninger i et array (dog ikke til brug som datasource) - men jeg har ikke erfaring med arrays som datasource. Kunne jeg evt. lokke et eksempel ud af dig med dette, hvis du har noget liggende?
Avatar billede neoman Novice
23. september 2007 - 22:19 #5
du kunne da name den sådan http://msdn2.microsoft.com/en-us/library/system.data.datatable.tablename(vs.80).aspx
med
da.Fill(dt)
dt.TableName="myTable", hvis det nu er det eneste der skal til:)
Avatar billede neocron Nybegynder
23. september 2007 - 22:35 #6
Nu kommer der ingen fejl, men datagriden opdateres ikke.
Måske, jeg lige bør poste min kode igen så vi er sikre på at vi er på rette spor :)

    ' ligger i webservice
    <WebMethod()>
    Public Function PopulateGridView() As DataTable
        Dim con As OracleConnection = New OracleConnection()
        con.ConnectionString = connectionString
        Dim da As OracleDataAdapter = New OracleDataAdapter
        Dim dt As New DataTable
        da.SelectCommand = New OracleCommand("SELECT * FROM testbrugere", con)

        Try
            If con.State = ConnectionState.Closed Then
                con.Open()
                da.Fill(dt)
                dt.TableName = "test" ' dummy :)
                con.Close()
            End If
        Catch ex As OracleException
            ' TODO.. gør noget
        End Try
        Return dt
    End Function

Og for god ordens skyld - koden der i test-klienten anmoder:

    ' ligger i klienten
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
            dgv.DataSource = klienttest.My.WebServices.Service.PopulateGridView
        Catch ex As Exception
            MsgBox("popError: Fejl under operationen." & vbCrLf & ex.Message, MsgBoxStyle.Exclamation, "Error")
        End Try
    End Sub
Avatar billede neoman Novice
23. september 2007 - 22:55 #7
Jeg har ikke styr på webservices, så måske melder der sig en anden på banen. Ellers får du sikkert et indlæg fra arne_v på et tidspunkt;)

Det eneste jeg kunne foreslå i mellemtiden er lige at lave en ny aspx side med et gridview, for at se om du kan få dit GridView fyldt op fra din webservice.
Avatar billede neoman Novice
23. september 2007 - 22:56 #8
Så lige noget: Ved ikke hvordan det fungerer  i DataGridView, men i et gridview så skal man tit kalde GridView.DataBind - skal man ikke det med et datagridview ?
Avatar billede neocron Nybegynder
23. september 2007 - 23:19 #9
Jeg vil ikke umiddelbart tro den er nødvendig her, men da jeg er "ny i gårde" skal jeg dog heller ikke afvise det.

Men jeg lavede et eksempel, uden DataBind, som virker fint. Forskellen er bare at her findes det hele i én applikation og er ikke afhængig af webservice. Så det kan godt være at det er her at noget går galt :) Jeg må prøve at se om jeg kan få en aspx til at virke.
Avatar billede neocron Nybegynder
07. oktober 2007 - 02:38 #10
Sorry, jeg glemte denne. Problemet er ikke løst, men har til gengæld ikke haft tid til at teste alternativer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester