【问题标题】:Generic way to test connection string of various rdbms测试各种rdbms连接字符串的通用方法
【发布时间】:2017-05-09 07:52:23
【问题描述】:

我有不同的数据源,如 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;
                }
            }
        }
    }

那么有没有更好的方法来完成上述过程??

【问题讨论】:

    标签: c# ado.net database-connectivity


    【解决方案1】:

    你可以像这样定义一个泛型方法:

    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;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您应该关闭连接。否则,您将继续打开连接并使其保持打开状态。类似于 Alessandro 的回答,但代码中包含 close:

      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;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-02-23
        • 2011-03-20
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多