23. september 2007 - 16:41Der 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.
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 ?
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.
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)
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?
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
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.
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 ?
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.
Sorry, jeg glemte denne. Problemet er ikke løst, men har til gengæld ikke haft tid til at teste alternativer.
Synes godt om
Ny brugerNybegynder
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.