gpt4 book ai didi

c# - 覆盖方法(返回类型 DBDataReader)并返回不同的类型(SQLDBDataReader)

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:15 25 4
gpt4 key购买 nike

我目前正在实现一个可以从不同数据库读取数据的小软件。以下是代码:

interface Fetch
{
Dictionary<string, DbDataReader> GetData();
}

abstract class Conn : Fetch
{
abstract public void Connect();
abstract public Dictionary<string, SqlDataReader> GetData();
}

class SqlConn : Conn
{
public override void Connect()
{
_connection = new SqlConnection(_connectionString);
try
{
_connection.Open();
}
catch (SqlException dbe)
{
throw dbe;
}
}
public override Dictionary<string, SqlDataReader> GetData()
{
using (_connection)
{
Dictionary<string, SqlDataReader> dataDictionary = new Dictionary<string, SqlDataReader>();
_xmlDoc.Load("Queries.xml");
XPathNavigator navigator = _xmlDoc.CreateNavigator();
XPathNodeIterator iterator = navigator.Select("//query");
while (iterator.MoveNext())
{
_command = new SqlCommand(iterator.Current.ToString());
_command.Connection = _connection;
_command.CommandText = iterator.Current.ToString();
SqlDataReader reader = _command.ExecuteReader() as SqlDataReader;

dataDictionary.Add(iterator.Current.GetAttribute("name", ""), reader);
}
return dataDictionary;
}
}
}

class OraConn : Conn
{
public override void Connect()
{
_connection = new OracleConnection(_connectionString);
}
public override Dictionary<string, OracleDataReader> GetData()
{
using (_connection)
{
Dictionary<string, OracleDataReader> dataDictionary = new Dictionary<string, OracleDataReader>();
_xmlDoc.Load("Queries.xml");
XPathNavigator navigator = _xmlDoc.CreateNavigator();
XPathNodeIterator iterator = navigator.Select("//query");
while (iterator.MoveNext())
{
_command = new OracleCommand(iterator.Current.ToString());
_command.Connection = _connection;
_command.CommandText = iterator.Current.ToString();
OracleDataReader reader = _command.ExecuteReader() as OracleDataReader;

dataDictionary.Add(iterator.Current.GetAttribute("name", ""), reader);
}

return dataDictionary;
}
}
}

但是我的问题是返回类型,派生类中的SQLDataReader和OraDataReader。这会导致编译器错误,指出

‘Error 2 'DashBoard.Connection.OraConn.GetData()': return type must be 'System.Collections.Generic.Dictionary' to match overridden member 'DashBoard.Connection.Conn.GetData() ’.

我该如何解决这个问题?或者还有其他方法可以实现这个功能吗?谢谢!

最佳答案

方法签名必须保持不变,但只要您的子类继承自 DbDataReader,您就可以返回其他 DbDataReader 类型,例如 SqlDataReader 它将编译。

例如:

abstract class DbDataReader
{
// ...
}

class SqlDataReader : DbDataReader
{
}

// ...

class SqlConn : Conn
{
public override Dictionary<string, DbDataReader> GetData()
{
return new Dictionary<string, DbDataReader>
{
{ "Key", new SqlDataReader() }
}
}
}

关于c# - 覆盖方法(返回类型 DBDataReader)并返回不同的类型(SQLDBDataReader),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33341435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com