Avatar billede kerbou Nybegynder
10. december 2003 - 10:57 Der er 15 kommentarer

Reader vs. at lukke connection efter hver SQL

Hej
Jeg er OK til Java og har nu kastet mig over C#, men jeg er løbet ind i problemer... Forestil dig dette:

reader = et-eller-andet-fra-min-database der henter 3 resultater ud
while (!reader.Read()) {
    UPDATE myTabel SET dimmer = 0 WHERE descr = 'hest'
}

Pointen er, at jeg efter hvert kald til databasen lukker forbindelsen igen, da jeg har forstået, at dette er den rigtige måde at gøre tingene på.

Den kode dør og kaster en exception, når jeg kommer til while-løkken 2. gang, fordi jeg lukker min forbindelse efter hvert kald til databasen, her en fake-UPDATE. Readeren er åbenbart knyttet til en åben forbindelse og lukker jeg forbindelsen, så lukker jeg samtidig readeren, hvilket giver problemer.

Hvordan omgår jeg dette, så readeren forbliver åben, men jeg kan knalde x antal SQL-statements af inde i while-løkken? Åbne en ny forbindelse, så jeg har 2 sideløbende forbindelser? Det kan blive en farlig omgang cowboykodning, så jeg vil gerne høre om "best practice" på området

/ Kristian
Avatar billede clausjul Nybegynder
10. december 2003 - 11:00 #1
Ja, jeg plejer at oprette en ny connection før løkken og denne benyttes til operationer inden i løkken.
Avatar billede arne_v Ekspert
10. december 2003 - 11:01 #2
Mit råd vil være enten:
  - en connection til query og reader
  - en anden connection til update
eller:
  - en connection
  - læs alle data
  - luk reader
  - lave alle updates
Avatar billede kerbou Nybegynder
10. december 2003 - 11:05 #3
Hvis jeg har en connection til readers og en til updates - hvad sker der så, hvis jeg skal have gang i 2 readers - eller 10 for den sags skyld på et senere tidspunkt? En connection til hver? Det må kunne gøres smartere....
Avatar billede arne_v Ekspert
10. december 2003 - 11:08 #4
Du kan ikke have gang i 2 readers på samme connection samtidigt.

Sådan er det bare.

Det smartere skal laves i din kode.
Avatar billede arne_v Ekspert
10. december 2003 - 11:09 #5
I en mere prof. applikation vil man bruge en connection pool, så
man undgår den fysiske connection hver gang man skal bruge en
connection.
Avatar billede clausjul Nybegynder
10. december 2003 - 11:09 #6
Det er nemlig derfor jeg mener, at der skal to connections til, hvis man vil lave SQL-operationer i en løkke.
Avatar billede repsak Nybegynder
10. december 2003 - 11:16 #7
arne_v -> så vidt jeg har forstået så sker det med connectionpooling automatisk (altså pr. default)
Avatar billede kerbou Nybegynder
10. december 2003 - 11:21 #8
repsak: Ja, sådan læser jeg det også.... På MSDN
Avatar billede arne_v Ekspert
10. december 2003 - 11:21 #9
Jeg checkede dokumentationen.

Du har ret.

Der ligger en connection pool bagved.

Og så er der slet ikke nogen grund til ikke at bruge mange connections.
Avatar billede kerbou Nybegynder
10. december 2003 - 11:28 #10
Skal jeg så selv styre, hvornår jeg lukker forbindelsen på den enkelte reader med en closeConn(String name) ?  Det lyder som det bedste alternativ p.t.
Avatar billede arne_v Ekspert
10. december 2003 - 11:32 #11
Du bør lukke readeren med Close() ligeså snart du er færdig med at
læse fra query output.

Du bør lukke connection med Close() når du er færdig og at det varer
lidt inden du skal igang med nye SQL sætninger.
Avatar billede kerbou Nybegynder
10. december 2003 - 11:33 #12
Sakset fra MSDN - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdataoledboledbconnectionclassclosetopic.asp

******************

DataTable schemaTable = myReader.GetSchemaTable();

foreach (DataRow myRow in schemaTable.Rows)
{
  foreach (DataColumn myCol in schemaTable.Columns)
    Console.WriteLine(myCol.ColumnName + " = " + myRow[myCol]);
  Console.WriteLine();
}

****************************

Nogen erfaringer med den?
Avatar billede arne_v Ekspert
10. december 2003 - 11:40 #13
Linket er til OleDbConnection Close() som er en normal close af en
OLE DB connection.

Bruger man hele tiden.

GetSchemaTable returnerer info om kolonnerne i readeren, således at
man dynamisk kan undersøge hvilke kolonner der er (navn, type etc.).

Har jeg aldrig brugt, men den ser meget lige til ud.
Avatar billede arne_v Ekspert
26. december 2003 - 16:37 #14
Tid at afslutte spørgsmålet ?
Avatar billede stefan_v Nybegynder
08. januar 2004 - 19:56 #15
Jeg ved at der i MS SQL Server bliver oprettet en ConnectionPOOL for hver ConnectioString man benytter. Benytter man derfor altid den samme string altså fx ("pass=pass login=loginnavn ...") vil der stå en Pool åben hele tiden, som sørger for at der ikke skal åbnes og lukkes forbindelse til databasen hele tiden (ret smart) - Så nej, det er ikke nødvendigt at prøve at samle det hele i én stor pærevælling - Det sørger serveren for :)
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