работать с уже открытым подключением к базе данных - PullRequest
2 голосов
/ 22 октября 2010

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

sqlconnection conn = new sqlconnection("string ...");

Можно ли это сделать? Я знаю строку подключения и имя подключения тоже. Я хочу сначала проверить, доступно ли это соединение, а затем продолжить.

Ответы [ 4 ]

8 голосов
/ 22 октября 2010

Если вы знаете строку подключения, то самый простой способ получить новое используемое соединение sql - создать новый экземпляр класса SqlConnection:

using (SqlConnection conn = new SqlConnection("MyConnectionString"))
{
    conn.Open();
    // Use the connection
}

.NET Framework использует пул соединений и поэтомуВам не нужно беспокоиться об эффективности открытия и множественных соединениях - приведенный выше код будет либо повторно использовать имеющееся существующее соединение, либо создавать новое по мере необходимости.

Если вы хотите сэкономить при печати, вы можетеполезно создать небольшой вспомогательный метод или свойство:

class SqlHelper
{
    public static SqlConnection GetConn()
    {
        SqlConnection returnValue = new SqlConnection("MyConnectionString");
        returnValue.Open();
        return returnValue;
    }
}

Использование:

using (SqlConnection conn = SqlHelper.GetConn())
{
    // Use the connection
}
2 голосов
/ 22 октября 2010

Вы смотрели документацию для SqlConnection?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx

Я считаю, что свойство "State" скажет вам, что вы хотите.

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

Если вы просто пытаетесьизбегайте написания избыточного кода, затем поместите его в класс и используйте его повторно.

1 голос
/ 22 октября 2010

Шаблон проектирования Façade должен помочь вам здесь. Вот пример.

  1. Образец фасада (Википедия) ;
  2. Шаблон дизайна фасада (Банда четырех) .

«Интеллектуальный» фасад знает, какой метод должен соединяться, где и т. Д. Фасад открывает соединение и передает его в базовый фрагмент кода, обычно содержащийся в фабричном классе или чем-то подобном.

public class DoSomethingFacade {
    private static readonly DoSomethingFactory _doSomethingFactory = new DoSomethingFactory();

    public static IList<T> GetList<T>() {
        using(IDbConnection connection = OpenConnection("string..."))
            return _doSomethingFactory.GetList<T>(connection);
    }

    public static IDbConnection OpenConnection(string connectionString) {
        IDbConnection openedConnection = new SqlConnection(connectionString);
        openedConnection.Open();
        return openedConnection;
    }
}

internal class DoSomethingFactory {
    internal DoSomethingFactory() { }

    internal IList<T> GetList<T>(IDbConnection connection) {
        IList<T> results = new List<T>();

        // use connection here without caring about it, 
        // as it should be provided as an opened available connection.

        return results;
    }
}
1 голос
/ 22 октября 2010

Хотя вы, вероятно, просто используете SQL Server, рекомендуется ознакомиться со всеми основными интерфейсами в System.Data, поскольку все поставщики данных их реализуют. Я считаю, что свойство State в IDbConnection возвращает запрашиваемую информацию ( IDbConnection )

Также вы можете скрыть эту логику в каком-то централизованном методе:

public static IDbConnection RetrieveConnection(){
    if(DataAccess.Connection.State == ConnectionState.Open) return DataAccess.Connection;

    conn.Dispose(); //to be clean, I believe this is safe if it's already disposed
    //retrieve configured connection string
    //create and open connection
    return DataAccess.Connection;
}

Так что, возможно, DataAccess - это место, куда вы можете поместить и получить свой объект подключения, но я бы не хотел, чтобы все использовали его напрямую. Вместо этого попросите их пройти этот метод, который может гарантировать, что соединение можно использовать. Я просто пытаюсь дать вам идеи.

Также вы можете пойти дальше и использовать что-то вроде NHibernate, которое будет управлять соединениями и всем этим для вас. Хотя это не всегда стоит усилий, если проект небольшой.

РЕДАКТИРОВАТЬ: сделал код немного более явным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...