22

あるアプリケーションでこのコードを見つけました

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

安全ですか、SqlConnection は DbConnection から派生します。データベースは Microsoft.Practices.EnterpriseLibrary.Data から取得されます。ドキュメントによると、CreteDatabase は DbConnection を返します。

4

4 に答える 4

16

いいえ、安全ではありません。キャストは決して安全ではなく、アプリケーションの実行中にいつでも失敗する可能性があります。SqlConnectionは確かにあなたから派生していますが、これは構成ファイルでパラメーター化できるため、が返さDbConnectionれることは保証されていません。また、なぜキャストする必要があるのですか? コードを特定の実装と結合させて、コードを単独でテストできなくすることを避けるために、階層の上位にあるクラスを使用することを常にお勧めします。database.CreateConnection()SqlConnectionSqlConnection

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 クエリを記述したり、あるデータベース プロバイダーから別のデータベース プロバイダーにキャストしたりすることに時間を浪費する代わりに、アプリケーションの実際のドメインに集中することもできます。しかし、単純なアプリケーションの場合、これで問題ありません。

于 2010-09-05T19:45:43.313 に答える
11

接続文字列を変更して SQL Server データベース以外に接続しない限り、安全です。その可能性がある場合は、物事を安全にするためにもう少しロジックを追加する必要があります。

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

using(DbConnection conn = database.CreateConnection())
{    
    if(conn is SqlConnection)
    {
        var sqlConn = conn as SqlConnection;
    }
}
于 2010-09-05T19:45:17.693 に答える
6

アプリケーションで使用しているデータベースによって異なります。あなたが書いたコードから、SQL Serverのみが使用されているように見えます。そうであれば、安全にキャストできDbConnectionますSqlConnection。実際DbConnection、他のデータベース接続の基本クラスです。あなたの場合はSqlConnection(データベースの操作に使用されます) 、 、 などSQL Serverのさまざまなデータベースがあり、それらのプロバイダーには通常、接続用の独自のクラスがあります。したがって、アプリが別のデータベースを使用している場合、または将来使用する可能性がある場合、そのようなキャストは安全ではありません。OracleMysql

于 2010-09-05T19:46:21.767 に答える