Avatar billede dk_akj Nybegynder
26. oktober 2011 - 11:36 Der er 12 kommentarer og
2 løsninger

Dele databaseforbindelse på tværs af classes

Hejsa,

Hvordan deler jeg bedst en databaseforbindelse på tværs af klasser, forms og usercontrols ?

Jeg har en class med det jeg skal bruge for at connecte, select insert update osv.:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OracleClient;
using System.Data;

namespace Oracle
{
    class OracleClass
    {
        public OracleDataAdapter adapter = new OracleDataAdapter();
        private string OraErr;

        public OracleConnection cnOra = new OracleConnection("Data Source=xxxxxxx;"
                                        + "user id=yyyy;password=zzzzzzzz;"
                                        + "persist security info=false;");

        OracleTransaction transaction;


        public int DbConnect()
        {
            //opret forbindelse til Oracle
            try
            {
                cnOra.Open();
            }

            catch (Exception ex)
            {
                OraErr = ex.Message;
                return -1;

            }
            return 1;

        }

...
}


Den instacierer jeg på min form;

Oracle.OracleClass Ora = new Oracle.OracleClass();

  public partial class Form1 : Form
    {

        Oracle.OracleClass Ora = new Oracle.OracleClass();
...
...


og opretter forbindelse
private void Form1_Load(object sender, EventArgs e)
        {
           
      // connect til oracle.
            Ora.DbConnect();
           
Men.. nu åbner jeg så en en ny form der har 5 usercontrols som alle skal bruge forbindelsen, jeg kan selvfølgeligt bare oprette forbindelsen igen fra usercontrols, men det giver jo så ialt 6 connection til Oracle.

I PowerBuilder (som er mit primære prog sprog) har man nogle globale variabler som bruges til f.eks databaseforbindelser ol.

Hvordan gør jeg bedst i c# ?

//akj
Avatar billede dk_akj Nybegynder
26. oktober 2011 - 12:06 #1
Har flyttet instancen til Program.cs, det virker, men er det måden at gøre det på ?

//akj
Avatar billede Syska Mester
26. oktober 2011 - 12:26 #2
Ja, du opretter 6 instancer af Oracle klassen, men jeg er ret overbevist om den bruger ConnectionPooling.

Læs eventuelt: http://msdn.microsoft.com/en-us/library/aa719767(v=vs.71).aspx

Du skal bare huske at lukke din forbindelse så snart du er færdig med den, så skal den nok tage sig af resten.

Du skal for alt i verden holde dig væk fra Singleton.
Avatar billede arne_v Ekspert
26. oktober 2011 - 14:23 #3
Som buzzzz siger saa bruger .NET database connections per default connection pooling.

Med connection pooling boer man:
- aabne connection lige inden man skal bruge den
- lukke connection lige efter at man har brugt den
Avatar billede arne_v Ekspert
26. oktober 2011 - 14:25 #4
Derudover ville jeg undgaa den konbstruktion med at:
- catche Exception
- gemme message i en variabel
- returnere en fejl kode

Brug exceptions som de er tiltaenkt.
Avatar billede dk_akj Nybegynder
26. oktober 2011 - 19:56 #5
1000 tak for det.

@Buzzzz,Singleton, er det det med at lægge den i program.cs ?

@Arne, jeg er 1000% sikker på du har ret mht exceptions, men jeg ved ikke hvordan jeg ellers skal gøre.

Eksemplet med DbConnect, funktionen returnerer -1 ved fejl og 1 ved succes, men derfra hvor jeg kalder funktionen vil jeg gerne have mulighed for at vise fejlkoden fra Oracle (tns name could not be resolved osv.)

Mit funktionskald i Form1:
// connect til Oracle.
            if (Ora.DbConnect() < 0)
            {
                MessageBox.Show("Could not connect to Oracle:\n\n" + Ora.GetLastError(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            };
           


Funktionen i Oracleklassen:
        public int DbConnect()
        {
            //opret forbindelse til Oracle
            try
            {
                cnOra.Open();
            }
            catch (Exception ex)
            {
                OraErr = ex.Message;
                return -1;
            }
            return 1;
        }



//akj
Avatar billede arne_v Ekspert
26. oktober 2011 - 20:11 #6
Avatar billede arne_v Ekspert
26. oktober 2011 - 20:11 #7
Hvorfor ikke undlade at catche den exception og lade kalderen af DbConnect catche den og goere noget ved den?
Avatar billede Syska Mester
26. oktober 2011 - 20:55 #8
#dk_akj
Læs det link arne_v posted. Jeg tror det er noget ala singleton du prøver at lave ... hvilket ikke er så smart igen.

Du kan nemlig deraf ikke smide din Oracle class i et andet projekt, da du er bundet af at den kender Prorgam klassen.

Du kan heller ikke teste det ... der er mange ting der ikke er så smarte ved static ting.

mvh
Avatar billede dk_akj Nybegynder
26. oktober 2011 - 21:06 #9
Super, tak for hjælpen,

Arne, den med at catche i kaldet er jo så simpel at det er pinligt.... sorry ;-)

Rent resourcemæssigt lærte jeg engang (hvor ram ikke var ad libitum) at man skulle tænke på hvor meget man instancierede.
Er det ikke nødvendigt mere ? Denne app skal køre på en alm workstation med win7.

Vil I lægge svar ?

//akj
Avatar billede arne_v Ekspert
26. oktober 2011 - 21:18 #10
Smaa objekter fylder maaske 100-1000 bytes.

Paa en 32 bit CPU+OS+CLR har du 2 GB memory tilgaengelig. Paa en 64 bit CPU+OS+CLR har du mere maaske 8 GB.

Proev og divider.
Avatar billede Syska Mester
26. oktober 2011 - 21:20 #11
Don't do premature optimization.

Find ud af om det er et problem, og optimer derefter ... alt andet er spild af tid.

Næsten alle desktop i dag sælges med 8 GB og laptop med 4 GB.

Problemet er måske mere relevant på mobiles. Men der er masser af andre "best practices"

mvh
Avatar billede dk_akj Nybegynder
26. oktober 2011 - 21:20 #12
Point taken :-)
Avatar billede arne_v Ekspert
26. oktober 2011 - 21:27 #13
svar
Avatar billede dk_akj Nybegynder
31. oktober 2011 - 20:48 #14
Tak.

//akj
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