MySql和SQlite类实现接口

时间:2012-07-24 17:19:23

标签: c# mysql sqlite interface

这不应该难以回答,但我非常绝望和困惑。我创建了用于从数据库执行读取查询的接口

interface IDatabase
{
    DataTable ExecuteReaderCommand(IDbCommand command);
    IDbCommand GetNewCommand();
}

接下来,我在接口上创建了两个不同的类实现。

class MysqlDatabase : IDatabase
{
    public DataTable ExecuteReaderCommand(MySqlCommand command)
    {
        DataTable dt = new DataTable();
        // ... read db
        return dt;
    }

    public MySqlCommand GetNewCommand()
    {
        cnn.Open();
        return cnn.CreateCommand();
    }
}

class SQLiteDatabase : IDatabase
{
String dbConnection;
    SQLiteConnection cnn;

    public DataTable ExecuteReaderCommand(SQLiteCommand command)
    {
        DataTable dt = new DataTable();
        // ... read db
        return dt;
    }

    public SQLiteCommand GetNewCommand()
    {
        cnn.Open();
        return cnn.CreateCommand();
    }
}

但是我收到这些类没有实现IDatabase接口的错误:

 MysqlDatabase does not implement interface member 'Database.GetNewCommand()'
 MysqlDatabase.GetNewCommand() cannot implement 'Database.GetNewCommand()' because it does not have the matching return type of 'System.Data.IDbCommand'.

 SQLiteDatabase does not implement interface member Database.ExecuteReaderCommand(System.Data.IDbCommand)
 SQLiteDatabase does not implement interface member 'Database.GetNewCommand()'. SQLiteDatabase.GetNewCommand() cannot implement Database.GetNewCommand() because it does not have the matching return type of 'System.Data.IDbCommand'.

当我查看SQLiteCommandMySqlCommand时,他们都会实现IDbCommand

如何在常用界面下使用这些类,以便我们轻松切换它们?

我非常感谢任何答案。

1 个答案:

答案 0 :(得分:4)

  

当我查看SQLiteCommand和MySqlCommand时,它们都实现了IDbCommand

不,他们没有。他们声称他们这样做,但他们实际上并没有提供正确的方法。看看IDatabase.GetNewCommand()

IDbCommand GetNewCommand();

和您的实施:

public MySqlCommand GetNewCommand()
{
    ... 
}

他们有不同的回报类型。同样,ExecuteReaderCommand方法参数在IDbCommand中为IDatabase,在MySqlCommand中为MysqlDatabase

选项:

  • 对“弱类型”版本使用显式接口实现,在具体类上公开“强类型”版本。这就是SqlCommand在.NET框架中的作用,例如。

  • 使IDatabase在其创建和使用的命令类型中具有通用性:

    public interface IDatabase<TCommand> where TCommand : IDbCommand
    {
        DataTable ExecuteReaderCommand(TCommand command);
        TCommand GetNewCommand();
    }