Laden...

OledDBConnection - Best Use ?

21 Antworten
1,679 Aufrufe
Letzter Beitrag: vor 17 Jahren
OledDBConnection - Best Use ?

verwendetes Datenbanksystem: Jet Engine (MS Access)

Hallo

angenommen ich hab eine OleDBConnection in einer Klasse, nennen wir sie

quelle ..

quelle.DBConn <-- OleDBConnection ..

wenn ich diese DBConn in einigen verschiendenen Funktionen verwende und verschiedenen Klassen, in dem ich sie übergebe ..

in diesen funktionen hab ich dann jeweils ein dbcomm und dbreader mit dem ich arbeite ..

BISHER hab ich einfach die connection IMMER offen gelassen bis zum programmende und dann halt immer wieder neue dbcommands instanziert mit dbreader ..

Fragen dazu:

  1. Soll ich bei der Connection dauernd Open() und Close() aufrufen immer vor und nach dem dbcomm oder immer offen lassen ?
  2. Bringt das using in dem fall bei dbcomm was? Wird damit die ressourcen trotz geschlossener Verbindung freigegeben ?
  3. wenn ich im using eine if abfrage mache die dann zu einem return führt, wird das using vorher ausgeführt ? .. wenn ja was passiert mit offenen oledbconnection ? ... muss ich die im if immer jeweils auch closen ?

Fragen über fragen seufz

Vielen Dank für alle Antworten schon mal 🙂

Hi,

in diesem Link: wie sieht der "perfekte" Datenbank-Zugriff aus siehst du wie ich das meistens mache.

Einfach die Daten für die Connection (den ConnectionString) in einer seperaten Klasse speicher, damit man von allen Methoden aus den selben ConnectionString zurückbekommt.

Weiters erstelle ich dann bei jedem Zugriff auf die Datenbank eine neue Connection, welche automatisch geschlossen wird (durch das using -> dispose).
Die Verbindung wird also erst geschlossen, wenn der Ganze using-Block durchlaufen wurde, du kannst darin also machen was du willst (weitere Methode aufrufen, If-Abfragen usw. einbauen).

Das ist jetzt zwar ein Beispiel mit der SQLConnection, da ändert sich aber nicht viel zur OleDBConnection.

mfg
michlG

//EDIT: HÄ, wie ist das jetzt passiert (ein Doppelpost)??

Mhm ..

Es ist so, dass die seperate Klasse (mit dem OleDBConnection objekt) eine nicht antastbare Klasse ist, weil sie von einem Kollegen aus der Arbeit in VB6 geschrieben wurde und die ganzen Algotrithmen sollte ich in C# übernehmen damit beide Versionen (C# und VB6) gleich sind ..

Sprich auf gut deutsch, das oledbconnection objekt ist leider da ..

Die frage ist nun .. soll ich es einfach schließen und dann wie du beschrieben hast mit der Klasse arbeiten oder ist es gscheiter das OleDBConnection objekt mitzuschleifen ?

Hi,

Die frage ist nun .. soll ich es einfach schließen und dann wie du beschrieben hast mit der Klasse arbeiten oder ist es gscheiter das OleDBConnection objekt mitzuschleifen ?

Ja, das ist schwer zu sagen.
Aber wenn das bereits vom Kollegen programmierte gut funktioniert, dann kannst du das auch verwenden.
Ich weiss jetzt nicht genau wie dieses Objekt aussieht, aber ich nehme mal an, dass das Grundprinzip das ich vorher beschrieben habe das selbe bleibt.

Ich würde die Verbindung aber bei jedem Zugriff auf die Datenbank immer neu aufbauen (sofern das mit dem objekt möglich ist).

mfg
michlG

naja ..

es is keine hexerei ..

es is einfach ein Public Propertie OleDBconnection

sprich


class Oledbclass
{

private OleDBConnection m_DBConn;

public OleDBConnection DBConn
{ 
get { return this.m_DBConn; }
}

}

c'est câ

Aso,

ja dann kannste das natürlich verwenden.
Denn da hast du ja alle Möglichkeiten und Freiheiten die du auch hättest, wenn du das selbst machen würdest.

mfg
michlG

ja ..

aber die frage ist halt nun

ich verwende DIESE klasse mit diesem objekt andauernd ..

soll ich da jedes mal so machen:


this.quelle.DBConn.Open();
using (DBComm = new OleDBCommand())
{
   DBComm.Connection = this.quelle.DBConn;
}
this.quelle.DBConn.Close();

oder einfach


DBComm = new OleDBConnection();
DBComm.Connection = this.quelle.DBConn;

ersteres hätte das problem wenn ich ein if innerhalb des usings hab, was ein "return" auslöst -> wird dann das using abgearbeitet .. und was passiert mit der offenen connection ? die muss ich ja händisch zumachen oder ?

Ich würde da schon die Lösung mit dem Using vorziehen.

Du musst da nicht das DBCommand beim Using verwenden, sondern die OleDBConnection.
Diese öffnest du dann im Using, und geschlossen wird die automatisch.
(siehe den von mir geposteten Link)

Das müsste also so aussehen:


using(OleDbConnection conn = this.quelle.DBConn)
{
    conn.Open();
    //Hier kannste dann deine Commands usw. ausführen
}

Dann innerhalb dem Using kannst du deine OleDBCommands ausführen.
Auch wenn die Methode mit return beendet wird, wird die Connection automatisch geschlossen.

mfg
michlG

ha ...

DAS is eine gute lösung

danke dir ..

sry 4 doppelpost aber denke sonst haben das schon alle abgeschlossen angesehen ^^

Also ich kann NICHT


using (OleDBConnection conn = this.quelle.DBConn)
{
    conn.Open();
}

Weil dann wirft er mir eine exception mit -> ConnectionString nicht initialisiert


using (OleDBConnection conn = this.quelle.DBConn)
{
    conn.ConnectionString = this.quelle.DBConn.ConnectionString;
    conn.Open();
}

dito Fehlermeldung

Einzig und allein:


using (OleDBConnection conn = new OleDBConnection(this.quelle.DBConn.ConnectionString))
{
    conn.Open();
}

funktioniert ...

Aber das is ein Ressourcenfresser (dauernd neues Connection Objekt) oder ? Zumindest bild ich mir ein, dass meine Anwendung jetzt länger braucht 🙁

Hi,

Weil dann wirft er mir eine exception mit -> ConnectionString nicht initialisiert

Ok, das ist klar...

Aber das is ein Ressourcenfresser (dauernd neues Connection Objekt) oder ? Zumindest bild ich mir ein, dass meine Anwendung jetzt länger braucht

Nönö, so ein Ressourcenfresser wird das wohl nicht sein.
Ausser du machst sehr sehr viele Abfragen hintereinander, und so muss dann die Verbindung immer wieder neu aufgebaut werden. Was natürlich eine gewisse Zeit für sich beansprucht. Wenn du wirklich extrem viele Abfragen hintereinander ausführst, so wäre es wohl wirklich besser die Verbindung geöffnet zu lassen, bis du deine ganzen Abfragen ausgeführt hast.
Kann man hier nicht mehrere Abfragen zu einer zusammenfügen, denn das würde auch schneller sein.

mfg
michlG

Was natürlich eine gewisse Zeit für sich beansprucht.

Das ist so nicht ganz richtig. Die Verbindung ist immer noch aktiv, sobald man ein SqlConnection Objekt disposed, oder Close aufruft. Da die Verbindung im Connection Pool liegt. Die Verbindung wird erst nach einer gewissen Zeit getrennt.
Deswegen spielt es keine Rolle, ob man nun 1x oder 10x ein SqlConnection Objekt erzeugt. Nur der Connection String muss immer derselbe sein, denn das ist sozusagen der Primary Key für den Connection Pool.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Mhm ..

Also ich hab pro "aufruf" ca. 10 verschiedene Funktionen, die oledbconnection brauchen ..

daher 10x ca. using (oledbconnection conn = new ....)

demnach ist das nicht so wichtig ?

Hi,

demnach ist das nicht so wichtig ?

Nö, das ist nicht so wichtig....
Denn wie schon Khalid beschrieben hat, wird die Verbindung nicht sofort geschlossen. Und wenn du dann die nächste Abfrage machst, so ist noch die offene Verbindung im ConnectionPool.

@Khalid
Danke für die Info, das habe ich nicht gewusst

mfg
michlG

Verstehe,

Danke

Hallo zusammen

Das von Kahlid geschriebene bezieht sich aber nur auf Datenbanksysteme die Connection Pooling unterstützen. Im speziellen hier Sql Server.

Access und AFAIK auch MySql unterstützen das nicht. Dort gilt diese Regel dann wieder nicht.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

Oh, Access hat kein Connection Pool?

Sorry, das wusste ich nicht. Dann nehm ich alles zurück (jedenfalls für diesen Thread).
Dann sollte wohl wirklich eine Connection geöffnet werden und alle Abfragen hintereinander abgefuert werden.

Wieder ein Grund weniger für Access 😛

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Hallo Khalid

Oh, Access hat kein Connection Pool?

Ich wüsste nichts anders 🙂
Siehe ggf. auch:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

Aja, wieder was gelernt ^^ ..

Also ist


using(DBCommand = new OleDBCommand())
{
    DBCommand.Connection = this.quelle.DBConn;
    ....
}

Doch besser ?? ..

Weil dann lass ich this.quelle.DBConn immer offen und schließe es am Ende des programms ?

Hallo Phil

Wenn du Access benutzt, ja.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

Alles klar 🙂

Danke