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:
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.
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
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 😛
Hallo Khalid
Oh, Access hat kein Connection Pool?
Ich wüsste nichts anders 🙂
Siehe ggf. auch:
Gruss Peter
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
Alles klar 🙂
Danke