Expandable
2005-07-27, 01:11:55
Hallo,
wie Ihr ja vielleicht durch meinen letzten Thread noch wisst, beginne ich gerade, mich etwas in C# einzuarbeiten.
Ich bin gerade dabei für mich persönlich ein kleines Kundenverwaltungs-Programm zu schreiben. Folgendes Problem: Es basiert auf MySQL als Datenbank. Ich hätte gerne alle MySQL-Aufrufe in einer Klasse um den Rest des Codes von der Datenbank zu isolieren. Die Klasse sieht bislang so aus (ist noch nicht fertig):
using MySql.Data.MySqlClient;
using System.Windows.Forms;
using System;
namespace ClientManagement
{
class MyDatabase
{
private static MyDatabase myObject = null;
private MySqlConnection dbConn;
private MySqlCommand tmpQuery;
private MySqlDataReader tmpQueryRead = null;
// Implements SingleTon design pattern
public static MyDatabase GetObj()
{
if (myObject == null)
myObject = new MyDatabase();
return myObject;
}
public MyDatabase()
{
string strConnection = "Data Source=localhost;Database=kundenverwaltung;User ID=root;Password=";
dbConn = new MySqlConnection(strConnection);
try
{
dbConn.Open();
}
catch (Exception)
{
MessageBox.Show("Verbindung zur Datenbank fehlgeschlagen!", "Fehler!");
}
}
public void PrepareQuery(string queryStr)
{
if (tmpQueryRead != null)
tmpQueryRead.Close();
tmpQuery = new MySqlCommand(queryStr, dbConn);
}
public void QueryWithoutResults()
{
tmpQuery.ExecuteNonQuery();
}
public MySqlDataReader GetQueryResults()
{
tmpQueryRead = tmpQuery.ExecuteReader();
return tmpQueryRead;
}
}
}
Wenn ich jetzt also Daten aus einer Tabelle laden will, sieht der dazugehörige Code so aus:
MyDatabase.GetObj().PrepareQuery("SELECT " + fields +
" FROM clients " +
" WHERE ID='" + id + "'");
MySqlDataReader tmpInfo = MyDatabase.GetObj().GetQueryResults();
while (tmpInfo.Read())
{
Address = tmpInfo.GetString(0);
Contact = tmpInfo.GetString(1);
ContactMail = tmpInfo.GetString(2);
}
Das ist natürlich extremst unschön, dass ich den Objekt-Typ "MySqlDataReader" hier notieren muss um dann umständlich über eine While-Schleife die Daten zu erhalten. Ginge das noch irgendwie einfacher?
Das Problem existiert ja nicht, wenn Daten nur gelösch/eingefügt/aktualisiert werden sollen, wie z.B. hier:
try
{
MyDatabase.GetObj().PrepareQuery("UPDATE clients " +
"SET organisation='" + organisation + "', " +
"address='" + address + "', " +
"contact='" + contact + "', " +
"contactMail='" + contactMail + "' " +
"WHERE ID='" + id + "'");
MyDatabase.GetObj().QueryWithoutResults();
}
catch (Exception e)
{
MessageBox.Show("Die eingegebenen Daten konnten leider nicht gespeichert werden!\n\n" + e.ToString(), "Fehler");
}
Dieser Code wird von der Datenbank-Klasse komplett versteckt, so hätte ich das eben auch gerne beim Auslesen von Daten.
Irgendwelche Ideen?
Die Frage ist ja auch: Ist es sinnvoll, so wie ich's jetzt lösen musste, vor jedem neuen Query (also Aufruf der Methode PrepareQuery()) die Funktion tmpQueryRead.Close(); aufzurufen? Leider kann ich nicht gleich in der Funktion GetQueryResults() diesen Aufruf machen, das wäre wohl eleganter.
Außerdem ist die Frage: Wann soll ich die Datenbank-Verbindung wieder schließen? Das geht ja überhaupt nicht, oder? In dem Fall ist es kein großes Problem, da die Datenbank nur von mir als einzigem Benutzer beansprucht wird, aber falls ich mal größere Anwendungen schreibe, würde ich die Verbindung gerne schnellstmöglich wieder schließen. Aber das müsste natürlich auch innerhalb der Datenbank-Klasse geschehen, ohne irgendwelche Aufrufe "von außen". Würde mich auch hierzu über Ideen freuen!
PS: Bitte zereißt mich nicht falls die Fragen irgendwie lächerlich sind. Wie gesagt, bin erst seit kurzem dabei in C# und der Windows-Programmierung!
DANKE!
wie Ihr ja vielleicht durch meinen letzten Thread noch wisst, beginne ich gerade, mich etwas in C# einzuarbeiten.
Ich bin gerade dabei für mich persönlich ein kleines Kundenverwaltungs-Programm zu schreiben. Folgendes Problem: Es basiert auf MySQL als Datenbank. Ich hätte gerne alle MySQL-Aufrufe in einer Klasse um den Rest des Codes von der Datenbank zu isolieren. Die Klasse sieht bislang so aus (ist noch nicht fertig):
using MySql.Data.MySqlClient;
using System.Windows.Forms;
using System;
namespace ClientManagement
{
class MyDatabase
{
private static MyDatabase myObject = null;
private MySqlConnection dbConn;
private MySqlCommand tmpQuery;
private MySqlDataReader tmpQueryRead = null;
// Implements SingleTon design pattern
public static MyDatabase GetObj()
{
if (myObject == null)
myObject = new MyDatabase();
return myObject;
}
public MyDatabase()
{
string strConnection = "Data Source=localhost;Database=kundenverwaltung;User ID=root;Password=";
dbConn = new MySqlConnection(strConnection);
try
{
dbConn.Open();
}
catch (Exception)
{
MessageBox.Show("Verbindung zur Datenbank fehlgeschlagen!", "Fehler!");
}
}
public void PrepareQuery(string queryStr)
{
if (tmpQueryRead != null)
tmpQueryRead.Close();
tmpQuery = new MySqlCommand(queryStr, dbConn);
}
public void QueryWithoutResults()
{
tmpQuery.ExecuteNonQuery();
}
public MySqlDataReader GetQueryResults()
{
tmpQueryRead = tmpQuery.ExecuteReader();
return tmpQueryRead;
}
}
}
Wenn ich jetzt also Daten aus einer Tabelle laden will, sieht der dazugehörige Code so aus:
MyDatabase.GetObj().PrepareQuery("SELECT " + fields +
" FROM clients " +
" WHERE ID='" + id + "'");
MySqlDataReader tmpInfo = MyDatabase.GetObj().GetQueryResults();
while (tmpInfo.Read())
{
Address = tmpInfo.GetString(0);
Contact = tmpInfo.GetString(1);
ContactMail = tmpInfo.GetString(2);
}
Das ist natürlich extremst unschön, dass ich den Objekt-Typ "MySqlDataReader" hier notieren muss um dann umständlich über eine While-Schleife die Daten zu erhalten. Ginge das noch irgendwie einfacher?
Das Problem existiert ja nicht, wenn Daten nur gelösch/eingefügt/aktualisiert werden sollen, wie z.B. hier:
try
{
MyDatabase.GetObj().PrepareQuery("UPDATE clients " +
"SET organisation='" + organisation + "', " +
"address='" + address + "', " +
"contact='" + contact + "', " +
"contactMail='" + contactMail + "' " +
"WHERE ID='" + id + "'");
MyDatabase.GetObj().QueryWithoutResults();
}
catch (Exception e)
{
MessageBox.Show("Die eingegebenen Daten konnten leider nicht gespeichert werden!\n\n" + e.ToString(), "Fehler");
}
Dieser Code wird von der Datenbank-Klasse komplett versteckt, so hätte ich das eben auch gerne beim Auslesen von Daten.
Irgendwelche Ideen?
Die Frage ist ja auch: Ist es sinnvoll, so wie ich's jetzt lösen musste, vor jedem neuen Query (also Aufruf der Methode PrepareQuery()) die Funktion tmpQueryRead.Close(); aufzurufen? Leider kann ich nicht gleich in der Funktion GetQueryResults() diesen Aufruf machen, das wäre wohl eleganter.
Außerdem ist die Frage: Wann soll ich die Datenbank-Verbindung wieder schließen? Das geht ja überhaupt nicht, oder? In dem Fall ist es kein großes Problem, da die Datenbank nur von mir als einzigem Benutzer beansprucht wird, aber falls ich mal größere Anwendungen schreibe, würde ich die Verbindung gerne schnellstmöglich wieder schließen. Aber das müsste natürlich auch innerhalb der Datenbank-Klasse geschehen, ohne irgendwelche Aufrufe "von außen". Würde mich auch hierzu über Ideen freuen!
PS: Bitte zereißt mich nicht falls die Fragen irgendwie lächerlich sind. Wie gesagt, bin erst seit kurzem dabei in C# und der Windows-Programmierung!
DANKE!