C#方法returns连接不同的数据库
C# method returns connect to different databases
更新:
我有一个用于处理数据库的静态 class。
此 class 包含 return 连接到数据库的方法。早期此方法 returns 连接到 Advantage 数据库 (AdsConnection):
static private AdsConnection GetConnection(){
var conn = new AdsConnection();
conn.ConnectionString = here my connection string
return conn;
}
现在,我需要改变这个方法。我需要此方法 returns 连接到不同的数据库类型(Advantage 数据库、Oracle 数据库)。
该方法将用于我的 class 中的 public 方法。例如,从数据库中的任何 table 获取数据的方法。
public static List<entity1> GetEntities(){}
进入这个方法我的第一步是解析数据库的类型,然后连接到数据库。然后从数据库中获取数据最后一步是return数据(List).
在连接数据库的步骤中我需要使用方法GetConnection("Ads")
此方法return当前连接到数据库,然后我可以使用此连接进行工作
我改变了方法:
我的第一个版本
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;
}
谢谢。
您可以执行以下操作,因为两个连接都继承自 IDbConnection
:
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;
}
抽象连接实例化的一种方法是使用 ADO.Net 的 DbProviderFactory。您基本上可以将提供者名称传递给它,它会根据提供者提供连接。这基本上减少了对 dbtype 等的检查,我认为当您需要针对多个数据库时,它是明智的方法。部分代码片段复制自MSDN。
在您的配置文件中,您可以使用不同的数据库类型和提供程序设置多个连接字符串。
<configuration>
<add name="NorthwindAccess"
providerName="System.Data.OleDb"
connectionString=
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Northwind.mdb;"
/>
然后在您的方法中您可以执行以下操作:
static DbConnection CreateDbConnection(
string providerName, string connectionString)
{
// Assume failure.
DbConnection connection = null;
// Create the DbProviderFactory and DbConnection.
if (connectionString != null)
{
try
{
DbProviderFactory factory =
DbProviderFactories.GetFactory(providerName);
connection = factory.CreateConnection();
connection.ConnectionString = connectionString;
}
catch (Exception ex)
{
// Set the connection to null if it was created.
if (connection != null)
{
connection = null;
}
Console.WriteLine(ex.Message);
}
}
// Return the connection.
return connection;
}
更新: 我有一个用于处理数据库的静态 class。
此 class 包含 return 连接到数据库的方法。早期此方法 returns 连接到 Advantage 数据库 (AdsConnection):
static private AdsConnection GetConnection(){
var conn = new AdsConnection();
conn.ConnectionString = here my connection string
return conn;
}
现在,我需要改变这个方法。我需要此方法 returns 连接到不同的数据库类型(Advantage 数据库、Oracle 数据库)。
该方法将用于我的 class 中的 public 方法。例如,从数据库中的任何 table 获取数据的方法。
public static List<entity1> GetEntities(){}
进入这个方法我的第一步是解析数据库的类型,然后连接到数据库。然后从数据库中获取数据最后一步是return数据(List
在连接数据库的步骤中我需要使用方法GetConnection("Ads")
此方法return当前连接到数据库,然后我可以使用此连接进行工作
我改变了方法:
我的第一个版本
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;
}
谢谢。
您可以执行以下操作,因为两个连接都继承自 IDbConnection
:
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;
}
抽象连接实例化的一种方法是使用 ADO.Net 的 DbProviderFactory。您基本上可以将提供者名称传递给它,它会根据提供者提供连接。这基本上减少了对 dbtype 等的检查,我认为当您需要针对多个数据库时,它是明智的方法。部分代码片段复制自MSDN。
在您的配置文件中,您可以使用不同的数据库类型和提供程序设置多个连接字符串。
<configuration>
<add name="NorthwindAccess"
providerName="System.Data.OleDb"
connectionString=
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Northwind.mdb;"
/>
然后在您的方法中您可以执行以下操作:
static DbConnection CreateDbConnection(
string providerName, string connectionString)
{
// Assume failure.
DbConnection connection = null;
// Create the DbProviderFactory and DbConnection.
if (connectionString != null)
{
try
{
DbProviderFactory factory =
DbProviderFactories.GetFactory(providerName);
connection = factory.CreateConnection();
connection.ConnectionString = connectionString;
}
catch (Exception ex)
{
// Set the connection to null if it was created.
if (connection != null)
{
connection = null;
}
Console.WriteLine(ex.Message);
}
}
// Return the connection.
return connection;
}