C#DbConnection转换为SqlConnection
我在一个应用程序中发现了这段代码C#DbConnection转换为SqlConnection,c#,sqlconnection,C#,Sqlconnection,我在一个应用程序中发现了这段代码 Database database = DatabaseFactory.CreateDatabase("connection string"); DbConnection connection = database.CreateConnection(); connection.Open(); SqlConnection sqlConnection = (SqlConnection)connection; 安全吗,SqlConnection从DbConnecti
Database database = DatabaseFactory.CreateDatabase("connection string");
DbConnection connection = database.CreateConnection();
connection.Open();
SqlConnection sqlConnection = (SqlConnection)connection;
安全吗,SqlConnection从DbConnection派生。数据库来自Microsoft.Practices.EnterpriseLibrary.Data。根据文档,CreteDatabase返回DbConnection 只要不更改连接字符串以连接到SQL Server数据库以外的任何对象,就应该是安全的。如果有可能的话,那么你应该增加一点逻辑来保证事情的安全:
Database database = DatabaseFactory.CreateDatabase("conn string");
using(DbConnection conn = database.CreateConnection())
{
if(conn is SqlConnection)
{
var sqlConn = conn as SqlConnection;
}
}
不,这是不安全的,铸造永远都不安全,它可能会在应用程序运行时随时爆炸。虽然
SqlConnection
确实是从DbConnection
派生的,但不能保证database.CreateConnection()
将返回SqlConnection
,因为这可以在配置文件中参数化。另外,为什么需要强制转换到SqlConnection
?最好使用层次结构中较高的类,以避免将代码与特定实现耦合,从而使代码无法单独测试
虽然企业图书馆在保持事物抽象方面做得相当好,但你用这个演员阵容正在扼杀一切。此外,您还应确保始终正确处置可支配资源。这个怎么样
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查询和从一个数据库提供者转换到另一个数据库提供者。但是对于一个简单的应用程序,这是可以的。这取决于您在应用程序中使用的数据库。从您编写的代码来看,似乎只使用了SQL Server。如果是这样,那么您可以安全地将
DbConnection
强制转换为SqlConnection
。实际上,DbConnection
是任何其他数据库连接的基类。在您的例子中,它是SqlConnection
(用于sqlserver
数据库),也有不同的数据库,如Oracle
、Mysql
等,它们的提供者通常有自己的连接类。因此,如果您的应用程序使用其他数据库或将来可能使用,则进行此类转换是不安全的。您可以随时进行检查,并使用C#pattern matching(C#7.0+)将其转换为SqlConnection
它不仅取决于所使用的数据库,更直接地取决于工厂根据所使用的数据库返回的类型。如果他们决定创建一个使用SQL server的新连接类,那么代码可能会失败。此代码中使用的一种方法需要使用SqlConnection作为参数。没有太大区别,使用“as”而不使用“is”,然后检查null更有效。
Database database = DatabaseFactory.CreateDatabase("conn string");
using(DbConnection connection = database.CreateConnection())
{
if(connection is SqlConnection sqlConnection)
{
// do something with sqlConnection
}
else
{
throw new InvalidOperationException("Connection is not to a SQL Database");
}
}