我有一个应用程序,允许我的用户针对他们选择的数据库运行查询。数据库可以是SQL Server或Oracle。此方法接受来自另一个类的两个参数,第一个参数是用户选择的数据库的连接字符串,第二个参数是数据库类型。那部分工作正常。我想要做的是削减我需要编写的代码,而不是一遍又一遍地输入查询和连接的东西。所以,我想做这样的事情。显然这不会起作用,但我对大多数解决方案持开放态度。
public void createTable(string connectstring, string rdbms)
{
if (rdbms == "oracle")
{
con = new OracleConnection(connectionString);
con.Open();
OracleCommand query = con.CreateCommand();
}
else if (rdbms == "SQL Server")
{
con = new SqlConnection(connectionString);
con.Open();
SqlCommand query = con.CreateCommand();
}
else
{
// broke
}
query.CommandText = "CREATE TABLE " + RndName +
" (Col0 Varchar(10),Col1 Varchar(10), Col2 Varchar(10))";
query.ExecuteNonQuery();
con.Close();
executeInsertTransactions(connectstring);
}
答案 0 :(得分:2)
此问题通常通过接口解决。可能有这些常见的接口:
IConnection IDataProvider IRepository
使用MySql数据库实现接口,例如类MySqlConnection:IConnection。对于Oracle,添加类MsOracleConnection:IConnection。
理想情况下,您应该将所有功能抽象为通用接口。您必须为要支持的每个数据库/存储引擎提供实现。在运行时,您将使用IoC容器和DI原则来设置当前实现。所有子依赖项都将使用作为参数传入的接口到构造函数(或属性或方法)
答案 1 :(得分:2)
您可以通过利用框架的DbProviderFactory
并使用获得的Db*
类来创建更抽象的代码。
答案 2 :(得分:0)
Dim con As System.Data.IDbConnection
Dim cmd As System.Data.IDbCommand
Select Case ConDBType
Case TypeDatabase.SqlServer
con = New OleDbConnection(CN.ConnectionString)
cmd = New OleDbCommand
Case TypeDatabase.MySql
con = New MySqlConnection(CNMySql.ConnectionString)
cmd = New MySqlCommand
Case TypeDatabase.Access
Call InitNameing()
ConDBAccess.DataSource = PreparToRootNameing() & "\T" & NAME_SYSTEMDB
con = New OleDbConnection(CN.ConnectionString)
cmd = New OleDbCommand
End Select
cmd.Connection = con
con.Open()
cmd.CommandText = SQLUpdate
cmd.ExecuteNonQuery()