2017-02-01 3 views
2

Я создал класс в своей программе для обработки соединения с базой данных. Этот класс включает метод с именем OpenConnection(), чтобы открыть соединение с базой данных. Я не уверен, что моя программа соответствует стандарту чистого кода. Вот этот метод.Подключение к базе данных из другого класса

public void OpenConnection() 
{ 
    if(connection==null || connection.State != Connection.Open) 
    { 
    connection = new OracleConnection(this.connectionString); 
    connection.Open(); 
    } 
} 

Этот метод работает хорошо, но я просто хочу, чтобы убедиться, если это безопасный способ, и я не эксплуатируя свою программу в любом случае. Спасибо заранее

Update

Я также добавил следующие методы в классе, чтобы закрыть соединение и утилизировать его.

public void CloseConnection() 
    { 
     if (dbconnect != null | dbconnect.State != ConnectionState.Closed) 
     { 
      dbconnect.Close(); 
     } 
    } 

    //Here the IDsiposable method is implemented 
    public void Dispose() 
    { 
     CloseConnection(); 
    } 
+0

@Igor Я обновил свой вопрос с помощью оставшихся методов, которые я объявил в своем классе. мог бы посмотреть на это сейчас и сказать мне, все ли в порядке. Я использую метод dispose для закрытия экземпляров SqlConnection (OracleConnection)? –

+0

@Igor вы любезно предложите мне улучшение? спасибо –

+0

@Igor Я не понял ваше решение в третьем комментарии. –

ответ

0

У вас есть возможная утечка ресурсов из-за того, что OracleConnection реализует IDisposable. Кроме того, вызов close в соединении в ConnectionState.Executing или Fetching может быть плохим, поскольку он откатит все незафиксированные транзакции.

public void OpenConnection() 
{ 
    if (connection == null) 
    { 
    connection = new OracleConnection(this.connectionString); 
    connection.Open(); 
    return; 
    } 

    switch (connection.State) 
    { 
    case ConnectionState.Closed: 
    case ConnectionState.Broken: 
     connection.Close(); 
     connection.Dispose(); 
     connection = new OracleConnection(this.connectionString); 
     connection.Open(); 
     return; 
    } 
} 
+1

, поэтому нет необходимости в методах 'CloseConnection()' и 'Dispose()'? –

+0

Вы добавили их после моего ответа;) Возможно, вы захотите предотвратить закрытие соединения, которое находится в состоянии Executing, но лично я никогда не нуждался в нем. – hoodaticus

2

Вы можете использовать предложение use, и оно будет обрабатывать Dispose автоматически.

using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 

    connection.Open(); 
    SqlCommand command = new SqlCommand("UpdateEmployeeTable", connection); 
    command.CommandType = CommandType.StoredProcedure; 
    command.Parameters.Add(new SqlParameter("@EmployeeID", 123)); 
    command.CommandTimeout = 5; 

    command.ExecuteNonQuery(); 

    connection.close(); 
} 
1

Ваше решение, как кодируются кажется, нормально, если добавить случаи предложенные в this answer и , если он предназначен для использования в одном потоке и в очень ограниченном объеме. Это говорит, что кажется, как вы готовитесь использовать этот класс в качестве параметра во многих вызовы методы, потому что вы хотите бизнес-логику

  • смеси и упорство относится
  • или разделить экземпляр таким образом, что другие методы не нужно беспокоиться о том, следует ли открывать соединение (например, более высокий вызов в стеке вызовов еще не вызвал Open) или нет (например, предыдущий вызов в стеке вызовов сделал, чтобы открыть соединение (что бы мы вызовите «окружающее» соединение)).

Любая из этих стратегий обычно приводит к проблемам. Это лучше, чтобы область применения небольшой, где вы знаете, что соединение открыто, и когда, чтобы закрыть его:

using (var connection = new OracleConnection(...)) 
{ 
    connection.Open(); 
    ... 
} 

Если у вас есть этот небольшой объем, ваша абстракция в настоящее время не дает никакой ценности.

+0

Очень хорошие комментарии Kit. – hoodaticus

Смежные вопросы