Jedna metoda, różne typy obiektów

0

Witam.

Piszę w C# aplikację która ma obsługiwać połączenie z bazą danych i napotkałem następujący problem. Napisałem metodę o nazwie Connect która przyjmuje nazwę użytkownika i hasło jako parametry a nastepnie łączy sie z bazą danych. Oto kod:

private MySqlConnection conn;

// ...

private void Connect(string u, string p)
{
    if (conn != null)
    {
        conn.Close();
        conn.Dispose();
    }

    string connectstring = String.Format("Server=127.0.0.1; Port=3306; User ID={0}; Password={1};", u, p);

    try
    {
        conn = new MySqlConnection(connectstring);
        conn.Open();

    }
    catch (MySqlException ex)
    {
        MessageBox.Show("Error: " + ex.Message);
    }       

}

Chciałbym jednak aby aplikacja obługiwała różne bazy danych, nie tylko MySQL. Np. do połączenia z bazą SQL Server potrzebny byłby nastepujący kod:

private SqlConnection conn;

// ...

private void Connect(string u, string p)
{
    if (conn != null)
    {
        conn.Close();
        conn.Dispose();
    }

    string connectstring = String.Format("Server=127.0.0.1; Port=1433; User ID={0}; Password={1};", u, p);

    try
    {
        conn = new SqlConnection(connectstring);
        conn.Open();

    }
    catch (SqlException ex)
    {
        MessageBox.Show("Error: " + ex.Message);
    }       

}

Jak widać powyższe kody różnią sie tylko typem obiektu "conn". I stąd moje pytanie - czy da się to jakoś sprowadzić do jednej metody? Chodzi o to aby nie powtarzać kodu i nie pisać osobnych metod obslugujących rózne typy baz danych. Jestem początkujący dlatego proszę o podrzucenie mi jakiegos pomyslu :) Z góry dziekuję.

0
//dla przykładu upubliczniłem metodę Connect, w podobny sposób postępuj z twoimi publicznymi metodami.

interface IDataBase
{
    void Connect(string u, string p);
}

class DataBase<ConnectionClass, ExceptionClass> : IDataBase
    where ConnectionClass : IDbConnection, new()
    where ExceptionClass : Exception
{
    private ConnectionClass conn = null;

    public void Connect(string u, string p)
    {
        if (conn != null)
        {
            conn.Close();
            conn.Dispose();
            conn = null; //ZWOLNIJ REFERENCJE !!!
        }

        string connectstring = String.Format("Server=127.0.0.1; Port=1433; User ID={0}; Password={1};", u, p);

        try
        {
            conn = new ConnectionClass();
            conn.ConnectionString = connectstring;
            conn.Open();

        }
        catch (ExceptionClass ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }
}
//...
class SqlDataBase : DataBase<SqlConnection, SqlException> {}
class MySqlDataBase : DataBase<MySqlConnection, MySqlException> {}
//...
IDataBase dataBase;
//...
dataBase = UseMySqlInsteadSql ? ((IDataBase ) new MySqlDataBase()) : ((IDataBase) new SqlDataBase());
//...
dataBase.Connect("user", "pass");
0

Wow, sam bym nigdy na to nie wpadł. Dzięki wielkie.

0

Tak na przyszlosc: to sie nazywa polimorfizm i jest jedna z 4 podstawowych cech programowania obiektowego.

0

Wszystko byloby super gdyby nie to ze "MySqlConnection is not convertible to DbConnection" czy cos w tym stylu [glowa]

0

Użyj sterownika zgodnego z ADO.NET.

0

Myslalem ze MySQL Connector jest zgodny [???]

0

Zamiana DbConnection na IDbConnection powinna pomóc ;) Poprawiłem też w swoim kodzie.
Podobnie możesz dodać IDbCommand, IDbDataAdapter, IDbDataReader (te, których będziesz używać).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0