Общий способ проверки строки подключения различных rdbms

У меня разные источники данных, такие как MySQL, SQL Server и Oracle, и для каждого источника данных я буду проверять, является ли успешным рукопожатие с сервером или нет на основе строки подключения.

Итак, я создал 3 класса, и у каждого из этого класса будет метод для проверки строки подключения, но код такой же, поэтому я подумал, возможно ли создать 1 универсальный метод, который будет обрабатывать все 3 источника данных, такие как mysql, SQL Server и Oracle, так что мне не нужно создавать 3 метода для каждого источника данных для проверки строки подключения.

Ниже мой код:

public class ConnectionViewModel
    {
        public string RdbmsType { get; set; }
        public string  ConnectionString { get; set; }
    }

 [HttpPost]
        public ActionResult RdbmsServerHandshake(ConnectionViewModel model)
        {
             if (model.RdbmsType =="Mysql")
                {
                     var mySqlRepo = new MysqlRepository();
                     var test = mySqlRepo.TestConnectionString(model.ConnectionString);
                }
                else if(model.RdbmsType == "SqlServer")
                {
                     var sqlServerRepo = new SqlServerRepository();
                     var test = sqlServerRepo.TestConnectionString(model.ConnectionString);
                }
                else // for oracle
                {
                   // code for oracle
                }
        }

    public class SqlServerRepository
    {
        public bool TestConnectionString(string connectionString)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                try
                {
                    connection.Open();
                    return true;
                }
                catch (SqlException)
                {
                    return false;
                }
            }
        }
    }

    public class MysqlRepository
    {
        public bool TestConnectionString(string connectionString)
        {
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                try
                {
                    connection.Open();
                    return true;
                }
                catch (SqlException)
                {
                    return false;
                }
            }
        }
    }

Так есть ли лучший способ сделать этот процесс выше?

2 ответа

Решение

Вы можете определить общий метод следующим образом:

static bool TestConnectionString<T>(string connectionString) where T : DbConnection, new()
{
    using (DbConnection connection = new T())
    {
        connection.ConnectionString = connectionString;

        try
        {
            connection.Open();
            return true;
        }
        catch (SqlException)
        {
            return false;
        }
    }
}

Вы должны закрыть соединение. В противном случае вы будете продолжать открывать соединения и оставлять их открытыми. Подобно ответу Алессандро, но с близким, включенным в код:

static bool TestConnectionString<T>(string connectionString) where T : DbConnection, new()
{
    using (DbConnection connection = new T())
    {
        connection.ConnectionString = connectionString;

        try
        {
            connection.Open();
            connection.Close();
            return true;
        }
        catch (SqlException)
        {
            return false;
        }
    }
}
Другие вопросы по тегам