Подтвердить что ты не робот

С# DbConnection отсылается к SqlConnection

Я нашел этот фрагмент кода в одном приложении

Database database = DatabaseFactory.CreateDatabase("connection string");
DbConnection connection = database.CreateConnection();
connection.Open();
SqlConnection sqlConnection = (SqlConnection)connection;

Безопасно ли SqlConnection получить из DbConnection. База данных поступает из Microsoft.Practices.EnterpriseLibrary.Data. Согласно документации CreteDatabase возвращает DbConnection.

4b9b3361

Ответ 1

Нет, это не безопасно, литье никогда не будет безопасным, и оно может взорваться в любое время во время работы вашего приложения. В то время как SqlConnection происходит от DbConnection, вам не гарантируется, что database.CreateConnection() вернет SqlConnection, поскольку это может быть параметризовано в файле конфигурации. Также почему вам нужно отбрасывать на SqlConnection? Всегда лучше работать с классами, которые выше в иерархии, чтобы не связывать ваш код с конкретной реализацией, что сделает ваш код невозможным для тестирования изолированно.

В то время как EnterpriseLibrary делает прилично хорошую работу по сохранению абстракции, вы все это убиваете. Также вы должны убедиться, что располагаемые ресурсы всегда расположены правильно. Как об этом:

Database database = DatabaseFactory.CreateDatabase("connection string");
using (var conn = database.CreateConnection())
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "SELECT id FROM foo";
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // TODO: work with the results here
        }
    }
}

Таким образом, ваш код будет менее хрупким для изменений базы данных в файле конфигурации. Ну, конечно, у вас все еще есть жесткий SQL-код, и есть ORM, которые позаботятся об этой ситуации. Они также позволят вам сосредоточиться на реальном домене вашего приложения, а не тратить время на запись SQL-запросов и кастинг от одного поставщика базы данных к другому. Но для простого приложения это нормально.

Ответ 2

Он должен быть безопасным, если вы никогда не меняете строку подключения для подключения к чему-либо, кроме базы данных SQL Server. Если это когда-либо возможно, тогда вы должны добавить немного больше логики, чтобы сделать вещи безопасными:

Database database = DatabaseFactory.CreateDatabase("conn string");

using(DbConnection conn = database.CreateConnection())
{    
    if(conn is SqlConnection)
    {
        var sqlConn = conn as SqlConnection;
    }
}

Ответ 3

Это зависит от баз данных, которые вы используете в своем приложении. Из кода, который вы написали, похоже, что используется только SQL Server. Если это так, вы можете безопасно использовать DbConnection до SqlConnection. Фактически DbConnection является базовым классом для любого другого соединения с базой данных. В вашем случае это SqlConnection (который используется для работы с базой SQL Server), также существуют разные базы данных, такие как Oracle, Mysql и т.д., И их поставщики обычно имеют собственные классы для соединений. Поэтому, если ваше приложение использует другие базы данных или может использовать его в будущем, это небезопасно, чтобы иметь такой приведение.