Toon posts:

ASP.NET C# The connection is already Open (state=Open).

Pagina: 1
Acties:

Verwijderd

Topicstarter
Iedere keer, als ik een connectie maak naar de db. Moet ik steeds dit schrijven.
try
{

if (Conn.State == ConnectionState.Closed)

Conn.Open();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}

Maar omdat nou steeds dit te gaan schrijven lijkt me zonde!
Iemand eerder hier wat voor bedacht?

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Yup, de verbinding sluiten als je hem niet meer gebruikt of een Data Access Layer maken die dit soort dingen netjes voor je afhandelt.

My personal website


  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

^^ eens is, vooral het de tweede optie :)

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:19
Zo dus:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
conn.Open();

try
{
   // blaat
}
catch( ... )
{
  // Miep
}
finally
{
   conn.Close();
}

https://fgheysels.github.io/


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Kies voor optie 2 : al je database access code centraal in 1 class.
Wanneer je dan bv een nieuwe database engine gebruikt, moet je enkel die class gaan aanpassen.

Ten tweede kan je ook de functionaliteit (logging, smart client maken,...) veel makkelijker uitbreiden, gezien al je code op 1 locatie zit.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static class DataManager {

public static string connectionstring='".....";

public static DataTable OpenTable(string sql)
{
... open connectie, lees gegevens, sluit connectie
}

public static void SaveTable(string tablename,DataTable dt) 
{
.. open connectie, maak dataadapter,dataadapter.update(dt),close connectie
}

...
}


Vervolgens, bij het aanroepen :

C#:
1
DataTable customers=DataManager.OpenTable("select * from customers where ...");


Nog beter zou zijn om een singleton te maken van je datamanager class, en dit mbt multithreading etc...

[ Voor 3% gewijzigd door D4Skunk op 07-03-2005 16:55 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:19
D4Skunk schreef op maandag 07 maart 2005 @ 15:51:
Nog beter zou zijn om een singleton te maken van je datamanager class, en dit mbt multithreading etc...
Ik zie in jouw voorbeeld dat je alles 'static' gemaakt hebt; ik vraag me dan af wat een singleton in dit geval meer te bieden heeft mbt multi-threading dan jouw voorbeeld-class.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

D4Skunk schreef op maandag 07 maart 2005 @ 15:51:
Kies voor optie 2 : al je database access code centraal in 1 class.
Wanneer je dan bv een nieuwe database engine gebruikt, moet je enkel die class gaan aanpassen.

[.... knip....]

Vervolgens, bij het aanroepen :

code:
1
DataTable customers=DataManager.OpenTable("select * from customers where ...");
Dus om DBMS portable te blijven schrijf je vervolgens alsnog je SQL in de app zelf?

En wat is nu het nut van die DAL in dit voorbeeld? 8)7

Professionele website nodig?


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

curry684 schreef op maandag 07 maart 2005 @ 16:16:
[...]

Dus om DBMS portable te blijven schrijf je vervolgens alsnog je SQL in de app zelf?

En wat is nu het nut van die DAL in dit voorbeeld? 8)7
:P

Is slechts een voorbeeldje... uit de losse pols geschreven, dus het zou wel eens kunnen dat er hier en daar een hiaat in zit
Normaalgezien moet je ofwel met stored procedures werken, of met een tussenclass die je gegevens mapt naar je business class... Merk op dat je per entiteit één sourcefile hebt, waar enkel de dataaccess in vervat zit.
Hier een vb voor je datamapping class :
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static class DMCustomers:DMBase {
     public static Customers GetAllCustomers(){
        DataTable dt=DataManager.OpenTable("Select * from customers");
        return MapDataTableToCustomers(dt);
     }
     public static Customers GetActiveCustomers(){
        DataTable dt=DataManager.OpenTable("Select * from customers where....");
        return MapDataTableToCustomers(dt);
     }
     private static Customers MapDataTableToCustomers(DataTable dt) {
        Customers cs=new Customers();
        foreach (DataRow dr in dt.rows) {
            Customers c=new Customer(dr["id"]);
            c.Name=dr["Name"];
            ...
           cs.Add(c);
        }
     }
     ...
}


en in je hoofdprogramma roep je dan een instance van alle customers als volgt op :
C#:
1
   Customers allCustomers=DMCustomers.GetAllCustomers()


Je kan natuurlijk ook deze aparte laag laten vallen, en ipv op deze manier te werken, werken met stored procedures.

Ik zeg niet dat dit de enige manier is, maar wel dat dit een manier is die wel degelijk in de praktijk zijn nut al heeft bewezen. (bij mij toch althans :) )

@whoami : mbt tot multithreading : ik heb zelf niet veel ervaring mbt multithreading, maar zo zou je toch om god-weet-welke-reden-dan-ook twee verschillende instances van je class kunnen aanmaken, zodat bv 1 thread constant een statustabel controleert, en de andere het reguliere werk doet, bv berekeningen etc..., en op die manier vermijd je dan dat je berekeningen gestopt worden omdat er ondertussen een controle op een bepaalde status moet gebeuren...

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:19
curry684 schreef op maandag 07 maart 2005 @ 16:16:
[...]

Dus om DBMS portable te blijven schrijf je vervolgens alsnog je SQL in de app zelf?
Jah, dat vond ik ook. :P
Wat je wel kunt doen is zo'n 'helper class' schrijven, en deze dan gebruiken binnen (een echte) DAL.

https://fgheysels.github.io/


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

whoami schreef op maandag 07 maart 2005 @ 17:00:
[...]

Jah, dat vond ik ook. :P
Wat je wel kunt doen is zo'n 'helper class' schrijven, en deze dan gebruiken binnen (een echte) DAL.
Zoals deze hierboven ? ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:19
D4Skunk schreef op maandag 07 maart 2005 @ 16:52:
[...]

@whoami : mbt tot multithreading : ik heb zelf niet veel ervaring mbt multithreading, maar zo zou je toch om god-weet-welke-reden-dan-ook twee verschillende instances van je class kunnen aanmaken,
Maar het is een static class...
zodat bv 1 thread constant een statustabel controleert, en de andere het reguliere werk doet, bv berekeningen etc..., en op die manier vermijd je dan dat je berekeningen gestopt worden omdat er ondertussen een controle op een bepaalde status moet gebeuren...
Euhm, threads lopen ook niet 'tegelijkertijd' hoor. Het lijkt alleen maar zo.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:19
D4Skunk schreef op maandag 07 maart 2005 @ 16:52:
[...]
Je kan natuurlijk ook deze aparte laag laten vallen, en ipv op deze manier te werken, werken met stored procedures.
En dan? Dan ga je de namen van je SP's in je app staan hebben.
Zelfs als je werkt met SP's, en je wilt je data-laag gescheiden houden, heb je zo een 'tussenlaag' nodig.

https://fgheysels.github.io/


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

whoami schreef op maandag 07 maart 2005 @ 17:02:
[...]

Maar het is een static class...
Wanneer je een singleton maakt, laat je natuurlijk het keyword 'static' vallen imho.
Ehhrm, het kan toch altijd zijn dat je je model ombouwt naar 'meerdere connecties, static is imho bijna nooit de beste aanpak voor een class.
Bij een singleton heb je controle over de aanmaak van een class instance, bij statics niet...Ook zou je een singleton gemakkelijker kunnen omvormen naar een niet-singleton, zonder al je code moeten aan te passen (veronderstel maar eens dat je nu toch besluit om connecties naar verschillende db's tegelijk te maken, wanneer je het singleton pattern gebruikt hebt, moet je dan nergens je code gaan aanpassen, behalve in DataManager.cs zelf)
[...]

Euhm, threads lopen ook niet 'tegelijkertijd' hoor. Het lijkt alleen maar zo.
idd maar database queries lopen imho wel asynchroon, dus als jij je connectie-object gelocked hebt omdat een berekening een update aan het uitvoeren is vanuit de ene thread, kan ondertussen de andere thread wel degelijk zijn query niet lanceren omdat het connectie-object al gelocked is, terwijl de db dit wel perfect aankan. (denk bv aan data die over verschillende servers gespreid is)

  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

whoami schreef op maandag 07 maart 2005 @ 17:04:
[...]

En dan? Dan ga je de namen van je SP's in je app staan hebben.
Zelfs als je werkt met SP's, en je wilt je data-laag gescheiden houden, heb je zo een 'tussenlaag' nodig.
Je moet toch ERGENS een link hebben naar je database ? In het voorbeeld hierboven is die perfect gescheiden...

offtopic:
Ik vind dit een zeer interessante discussie, maar denk dat ze voor de TS al lang niet interessant meer is...
Misschien kunnen we deze discussie via MSN (D4Skunk@hotmail.com) of email (Tom@corebvba.be) voortzetten ?


trouwens, nog een idiotie in de code die ik vermeld had :
C#:
1
2
3
4
5
6
7
8
9
private static Customers MapDataTableToCustomers(DataTable dt) { 
        Customers cs=new Customers(); 
        foreach (DataRow dr in dt.rows) { 
            Customers c=new Customer(dr["id"]); 
            c.Name=dr["Name"]; 
            ... 
           cs.Add(c); 
        } 
     } 


Moet natuurlijk zijn :

C#:
1
2
3
4
5
6
7
8
9
10
11
12
private static Customers MapDataTableToCustomers(DataTable dt) { 
        Customers cs=new Customers(); 
        foreach (DataRow dr in dt.rows) { 
           cs.Add(MapDataRowToCustomer(dr)); 
        } 

private static Customer MapDataRowToCustomer(DataRow dr) { 
            Customers c=new Customer(dr["id"]); 
            c.Name=dr["Name"]; 
            ... 
}
     } 

[ Voor 40% gewijzigd door D4Skunk op 07-03-2005 17:31 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:19
D4Skunk schreef op maandag 07 maart 2005 @ 17:27:
[...]


Je moet toch ERGENS een link hebben naar je database ? In het voorbeeld hierboven is die perfect gescheiden...
Dat zeg ik niet; ik zeg gewoon dat je die SP-namen ook niet zo in je applicatie moet gooien, maar dat je in dat geval ook een gebruik moet maken van die DAL-laag zoals je ze gebruikt in het geval van 'dynamic' queries; alleen ga je dan in die classes geen SQL - queries hebben, maar de namen van je SP's.
offtopic:
Ik vind dit een zeer interessante discussie, maar denk dat ze voor de TS al lang niet interessant meer is...
Misschien kunnen we deze discussie via MSN (D4Skunk@hotmail.com) of email (Tom@corebvba.be) voortzetten ?
Ik denk niet dat dat zo handig is; op die manier sluit je anderen nl. uit, en trouwens; mijn bak gaat binnenkort uit. :P

https://fgheysels.github.io/

Pagina: 1