【发布时间】:2015-01-23 16:04:24
【问题描述】:
统一更新: 我有一个用于处理数据库的静态类。
该类包含返回连接到数据库的方法。早期此方法返回连接到 Advantage 数据库(AdsConnection):
static private AdsConnection GetConnection(){
var conn = new AdsConnection();
conn.ConnectionString = here my connection string
return conn;
}
现在,我需要更改此方法。我需要这个方法返回连接到不同的数据库类型(Advantage 数据库、Oracle 数据库)。
该方法将在我的班级中使用公共方法。例如,从数据库中的任何表中获取数据的方法。
public static List<entity1> GetEntities(){}
进入这个方法我的第一步是解析数据库的类型,然后连接到数据库。然后从数据库中获取数据,最后一步是返回数据(List
在连接数据库的步骤中我需要使用GetConnection("Ads")的方法
此方法返回当前连接到数据库,然后我可以使用此连接工作
我改变了方法:
我的第一个版本
static private T GetConnection<T>(string dbType)
{
if (dbType.Equals("Oracle"))
{
OdbcConnection conn = new OdbcConnection
conn.ConnectionString = here my connection string
return (T)conn;
}
if (dbType.Equals("Ads"))
{
AdsConnection conn = new AdsConnection
conn.ConnectionString = here my connection string
return (T)conn;
}
return default(T);
}
但是,我的解决方案不起作用。我有错误:
- 无法将类型“System.Data.Odbc.OdbcConnection”转换为“T”
- 无法将类型“Advantage.Data.Provider.AdsConnection”转换为“T” 我不知道如何解决我的问题。
请告诉我如何解决我的问题?
现在,我使用以下代码(这个解决方案给我@khlr):
static private IDbConnection GetConnection(string dbType)
{
if (dbType.Equals("Oracle"))
{
OdbcConnection conn = new OdbcConnection
conn.ConnectionString = here my connection string
return conn;
}
if (dbType.Equals("Ads"))
{
AdsConnection conn = new AdsConnection
conn.ConnectionString = here my connection string
return conn;
}
return null;
}
谢谢。
【问题讨论】:
-
我认为您需要重新阅读您的代码。现在使用当前(不正确的)语法,我可以做到(如果我们在 5 分钟内忘记那些语法错误):
GetConnection<Integer>("Oracle"). -
.net 的大多数 Db 客户端都是从 IDbConnection 实现的。因此,您可以将 IDbConnection 作为返回类型。不一定必须是通用类型
-
我个人建议采用完全不同的方法。与其创建这个通用的连接工厂,为什么不让消费代码在一个简单的
using块中简单地实例化他们自己的连接呢?保持连接的范围/生命周期很小,而不是全局。 -
@qamar 谢谢你的回答。这个解决方案对我很有帮助。
-
同样,这并没有说明为什么您只需要一种方法。它也没有告诉我们调用代码中的 any 是否与数据库无关。您可以提供给我们的信息越多,我们在为最干净的方法提出建议方面就可以提供更多帮助。 (例如,总是有一个单一的数据库在起作用?如果是这样,为什么不把这些信息放在工厂可以检测到的地方?你可以使用依赖注入而不是静态类吗?在 中有各种各样的好处不 使用这种静态访问...)
标签: c# database oracle advantage-database-server