Toon posts:

[asp.net] dataset uit webservice

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik ben bezig met een webservice waardoor mijn clients data kunnen ophalen via ssl.

Waarom een webservice en niet een directe db connectie?

Omdat het server gedeelte verschillende db providers kan gebruiken, en voor de client is het dus onzichtbaar, en hoeft enkel de webservice aan te roepen.

Zelf ben ik heel erg gewent aan datareaders, dus gebruik ik niet al te vaak datasets maarja readers zijn niet serializable vandaar:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    <WebMethod()> _
    Public Function QueryToDataSet(ByVal strSQL As String) As DataSet

        ' get a connection
        Dim myConn As OdbcConnection = MySQL.GetConnection

        ' create the command
        Dim myComm As OdbcCommand = New OdbcCommand(strSQL, myConn)

        ' create an adapter
        Dim myAdapter As OdbcDataAdapter = New OdbcDataAdapter(myComm)

        Dim myDataSet As DataSet = New DataSet
        myAdapter.Fill(myDataSet, "Customers")

        Return myDataSet

    End Function


dit was even een testje, maar de vraag is nu, wordt mij db connectie nu gesloten of gaat die op de garbage? normaal sluit ik de connectie d.m.v. reader.close maar heb nu even geen idee wat er precies mee gebeurt. Is dit de goede manier om een webservice te gebruiken of zijn er betere mogelijkheden? heb net wat artikelen op 4guysfromrolla gelezen, maar dit is nogal nieuw voor me.

alvast bedankt,
Martin

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Je moet zelf je connectie sluiten. Je connectie gaat dan naar de connection pool, zodat die kan hergebruikt worden. (Mits je connection pooling ondersteund natuurlijk, bij Sql Server wordt connection pooling automatisch ondersteund).

Echter, zoals jij het nu doet wordt de connectie door de dataadapter geopend. Als de dataadapter jouw connectie moet openen, zal hij er ook voor zorgen dat ze gesloten wordt.

Als je echter zelf je connectie opent, dmv de Open() method v/d connectie aan te roepen, dan moet je ze zelf ook weer sluiten.

https://fgheysels.github.io/


Verwijderd

Topicstarter
dat kan ook

zodra ik myconn.open, maar als ik dan de dataset heb gevuld, kan ik dan ook de connectie sluiten voor dat ik de data return? bij een reader kan je deze niet meer lezen als de connectie is gesloten.

-- edit
dus als ik nu de data return wordt de verbinding automatisch terug gegeven naar de pool?

[ Voor 20% gewijzigd door Verwijderd op 11-12-2003 11:12 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Verwijderd schreef op 11 december 2003 @ 11:11:
dat kan ook

zodra ik myconn.open, maar als ik dan de dataset heb gevuld, kan ik dan ook de connectie sluiten voor dat ik de data return? bij een reader kan je deze niet meer lezen als de connectie is gesloten.
Je mag je connectie sluiten van zodra je de DataSet opgevuld hebt. Maar, aangezien jij de connectie niet expliciet opent, zal de DataAdapter zowel het openen als het sluiten van de connectie voor z'n rekening nemen.
(Om het 100% zeker te zijn, kan je het misschien eens opzoeken in de SDK).
dus als ik nu de data return wordt de verbinding automatisch terug gegeven naar de pool?
Als je Sql Server gebruikt, en je geeft niet expliciet aan in je connectiestring dat je connection pooling niet wilt gebruiken, dan wordt de connectie aan de pool toegevoegd als ze gesloten wordt (als dat nu expliciet door jou is, of door de dataadapter).

https://fgheysels.github.io/


Verwijderd

Topicstarter
pooling gebeurt automatisch wanneer je dit aangeeft in myODBC (voor mysql dan) hij laat hem 180 seconden staan op sleep, anders wordt er een nieuwe aangemaakt.

In de SDK staat een voorbeeld dat dezelfde methodiek gebruikt als ik:

Visual Basic:
1
2
3
4
5
6
7
Public Function SelectOdbcSrvRows(dataSet As DataSet, connection As String, query As String) As DataSet
    Dim conn As New OdbcConnection(connection)
    Dim adapter As New OdbcDataAdapter()
    adapter.SelectCommand = new OdbcCommand(query, conn)
    adapter.Fill(dataset)
    Return dataset
End Function


voor de rest is het jammer dat ik niet alle opties van de dataadapter kan gebruiken, ik zie dat die zeker makkelijk is in forms, als je namelijk alle sql statements voor insert,update en delete in de adapter stopt en samen met een dataset aan een grid bind, scheelt een boel programmeer werk.

Nu nog even bekijken hoe ik hem ga consumen en dan weer verder. Alvast bedankt voor de hulp.

Martin

Verwijderd

Topicstarter
volgende probleem nu, is er een mogelijkheid om het adres van de webservice in te stellen? Ik maak nu een proxie d.m.v. een web reference aan te maken, maar het gaat er in de toekomst om dat mensen zelf moeten aangeven waar de webservice zich bevind, kan nog wel iets verschillen in de domein naam.

Is het ook mogelijk om de proxie vanuit code aan te maken?

Verwijderd

Topicstarter
antwoord op de vraag hierboven:

er wordt een app.config aangemaakt waarin de adressen van de services vast liggen, deze kunnen dus worden aangepast zonder de code te veranderen.

code:
1
2
3
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings><add key="cStore.remote.DBProvider" value="http://localhost/cStore.NET/services/DBProvider.asmx"/></appSettings></configuration>

Verwijderd

Topicstarter
nog een opmerking:

de verbinding wordt dus niet gesloten op de manier die ik gebruik, de adapter sluit dus niet de verbinding, na wat testjes stonder er nog zo'n 20 verbindingen open, voor meer dan 15 minuten.

  • tijn
  • Registratie: Februari 2000
  • Laatst online: 25-05 12:24
De adapter geeft te verbinding terug aan de connection pool en voor de database kan het dan nog best wel lijken of er vele connecties open staan, maar dat geeft in de regel niet omdat een volgende verbinding gewoon weer uit de pool wordt gehaald.

Anders test je het ook even met een datareader waar je wel expliciet de connectie sluit. Als het goed is blijven dan ook die connecties voor de DB openstaan.

Cuyahoga .NET website framework


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Verwijderd schreef op 11 december 2003 @ 21:50:
nog een opmerking:

de verbinding wordt dus niet gesloten op de manier die ik gebruik, de adapter sluit dus niet de verbinding, na wat testjes stonder er nog zo'n 20 verbindingen open, voor meer dan 15 minuten.
Ik heb altijd gelezen dat een DataAdapter een connectie opent, als die nog niet open is, en deze dan ook sluit.
Slechts als de connectie al expliciet geopend werd, zal de connectie niet gesloten worden door de data-adapter.
Doe anders eens een test zoals tijn zegt, of open en sluit je connectie zelf expliciet:
code:
1
2
3
4
5
6
7
8
9
conn.Open();
try
{
   myAdapter.Fill( .... );
}
finally
{
  conn.Close();
}

Wat tijn verder zegt ivm de connectie-pool is wel plausibel.

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik heb het dus nog een keer geprobeert, maar er wordt gewoon een nieuwe connectie aangemaakt iedere keer, maar ik sluit nu zelf de connectie en dan werkt het prima, kan aan ODBC liggen, ik heb geen idee.
Pagina: 1