ADO connection close MSSQL

ADO connection close MSSQL
2009-10-01T17:25:38+02:00
2009-10-01T18:04:48+02:00
2022-11-15T04:41:54+01:00
DanteVb
Sziasztok!

Most ismerkedek a témával és ACCESS-ben szeretnék elérni egy szervert, ami sikerül is. Úgy terveztem hogy egy adott lekérdezés után azonnal zárja le a kapcsolatot a szerverrel, hogy ne terheljem azt.(bár lehet, hogy a sok nyitás-zárás jobban terheli?)

Ha listbox-nak beállítom a rekordset-et akkor az MSSQL2000-ben a Current Activitik között szerepel a process.

Ha ehelyett: Set Me.listbox1.Recordset = rst
ezt írom: msgbox rst.fields("id") akkor meg eltűnik a process.

Illetve ha bezárom az űrlapot ami tartalmazza a listbox-ot akkor is eltünik a process, de minek van jelen? lekérdeztem azt töltse be és zárjon

Valaki légyszíves segítsen ezt nem nagyon értem. Lehet, hogy így a normális, vagy csak valamilyen beállítás hiányzik.
itt a részlet:



dim conn As New ADODB.Connection dim rst As New ADODB.Recordset conn.Open "PROVIDER=SQLOLEDB.1;PASSWORD=jelszo;PERSIST SECURITY INFO=false;USER ID=user;INITIAL CATALOG=Teszt;DATA SOURCE=SERVER01;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;" conn.CursorLocation = adUseClient Set rst = conn.Execute("select ID, oszlop1 from teszttabla") Set Me.listbox1.Recordset = rst Rekord.Close Set rst = Nothing Conn.Close Set conn = Nothing

sziasztok: egy kezdő
Mutasd a teljes hozzászólást!
Írtam, hogy használj disconnected recordset-et!
...
Set rst = conn.Execute("select ID, oszlop1 from teszttabla")
Set Me.listbox1.Recordset = rst
Set Me.listbox1.Recordset.ActiveConnection=Nothing
...
Mutasd a teljes hozzászólást!

  • Megoldás: connection pool. A lényeg az, hogy a kapcsolódás (különösen régebben) nem volt egy "olcsó" művelet, ezért az ADO-t úgy alakította ki az MS, hogy a kapcsolatokat lehetőleg újra felhasználja. A Conn.Close hatására a kapcsolat a program szempontjából ugyan lezárul, de a kapcsolat az ún. connection pool-ba kerül be. Ha utána a programodból megint kiadsz egy Conn.Open-t, akkor nem feltétlenül az alapoktól jön létre a kapcsolat, hanem az ADO a Connection pool-ból adja a kapcsolatot (ha van a connection pool-ban szabadon használható kapcsolat).

    Ha ehelyett: Set Me.listbox1.Recordset = rst
    ezt írom: msgbox rst.fields("id") akkor meg eltűnik a process.


    Itt meg az a lényeg, hogy a recordset lesz a vezérlő adatforrása és ez folyamatosan nyitott kapcsolatot jelenthet a recordset paraméterezésétől függően (recordset-en végzett módosítások ugye át is kerülhetnek a szerverre). Pontosan ezért tűnik el a process, ha zárod az űrlapot. Ha csak lekérdezést szeretnél, akkor disconnected recordset-re van szükséged (ActiveConnection tulajdonságot állítsad nothing-ra).
    Mutasd a teljes hozzászólást!
  • szia Árnyék köszi kezdem érteni. Tehát ha rekordset-et átadom az űrlapnak, akkor ugye nyitott a kapcsolat, mert ahogy írtad módosíthatunk a rekordset-en ami az adatbázisban közvetlenül módosul és amíg nyitva az űrlap a kapcsolat is megvan.

    Akkor nincs más mód mint egy listboxot feltölteni értékkel rekordset helyett?
    valahogy így

    'listbox sorforrás típus= lista Do While Not rst.EOF ListBox1.itemsadd rst.Fields(0) & ";" & rst.Fields(1) rst.MoveNext Loop

    kipróbáltam ilyenkor nincs kapcsolat a szerverrel, mert ugye rekordset-et felhasználtam értékbeírásra utána meg lezártam. De így meg listboxba 30 ezer sor után hibát dob ki az access (hogy túl nagy neki)

    nem tudom most mit tegyek , ezt hogy szokták accessben?
    Mutasd a teljes hozzászólást!
  • Írtam, hogy használj disconnected recordset-et!
    ...
    Set rst = conn.Execute("select ID, oszlop1 from teszttabla")
    Set Me.listbox1.Recordset = rst
    Set Me.listbox1.Recordset.ActiveConnection=Nothing
    ...
    Mutasd a teljes hozzászólást!
  • azta!!!!!!!!!!! ez nagyon nagy!!!!
    ez kellett ezt "kerestem"



    köszönöm!!!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd