动态选择SQL Server或Oracle数据库

本文关键字:Oracle 数据库 Server 选择 SQL 动态 | 更新日期: 2023-09-27 18:16:43

我有一个应用程序,允许我的用户对他们选择的数据库运行查询。数据库类型为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);
}

动态选择SQL Server或Oracle数据库

这个问题一般通过接口来解决。可能有这些常用接口:

IConnectionIDataProviderIRepository

使用MySql数据库实现接口,如MySqlConnection: IConnection类。对于Oracle,添加类msoraclecconnection: IConnection

理想情况下,你应该将所有的功能抽象到公共接口中。您必须为希望支持的每个数据库/存储引擎提供实现。在运行时,您将使用IoC容器和DI原则来设置当前实现。所有的子依赖将使用接口作为参数传递给构造函数(或属性或方法)

您可以通过利用框架的DbProviderFactory和使用获得的Db*类来创建更抽象的代码。

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()