我是开发抽象工厂模式的新手,我希望在数据层中创建一个抽象工厂,帮助我将该层链接到任何其他数据库,例如sql和oracle。你能帮我完成这个任务吗?请注意,数据库的连接字符串将在此层中找到,而不是在演示文稿中。
谢谢
编辑
public abstract class Database
{
public string connectionString;
#region Abstract Functions
public abstract IDbConnection CreateConnection();
public abstract IDbCommand CreateCommand();
public abstract IDbConnection CreateOpenConnection();
public abstract IDbCommand CreateCommand(string commandText, IDbConnection connection);
public abstract IDbCommand CreateStoredProcCommand(string procName, IDbConnection connection);
public abstract IDataParameter CreateParameter(string parameterName, object parameterValue);
#endregion
}public class SQLDatabase : Database
{
public override IDbConnection CreateConnection()
{
return new SqlConnection(connectionString);
}
public override IDbCommand CreateCommand()
{
return new SqlCommand();
}
public override IDbConnection CreateOpenConnection()
{
SqlConnection connection = (SqlConnection)CreateConnection();
connection.Open();
return connection;
}
public override IDbCommand CreateCommand(string commandText, IDbConnection connection)
{
SqlCommand command = (SqlCommand)CreateCommand();
command.CommandText = commandText;
command.Connection = (SqlConnection)connection;
command.CommandType = CommandType.Text;
return command;
}
public override IDbCommand CreateStoredProcCommand(string procName, IDbConnection connection)
{
SqlCommand command = (SqlCommand)CreateCommand();
command.CommandText = procName;
command.Connection = (SqlConnection)connection;
command.CommandType = CommandType.StoredProcedure;
return command;
}
public override IDataParameter CreateParameter(string parameterName, object parameterValue)
{
return new SqlParameter(parameterName, parameterValue);
}
}这是我创建的两个类。
发布于 2011-05-05 14:14:05
功能已经存在。
向app/webb.config添加一个连接字符串:
<connectionStrings>
<add name="TheDatabase" providerName="System.Data.OleDb" connectionString="Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User Id=xxx;Password=yyy;Data Source=zzzz;Extended Properties="/>
</connectionStrings>使用工厂构建连接:
var connectionString = ConfigurationManager.ConnectionStrings["TheDatabase"];
var providerName = connectionString.ProviderName;
var factory = DbProviderFactories.GetFactory(providerName);建立联系:
var connection = factory.CreateConnection();得到命令:
var command == connection.CreateCommand();唯一需要做的就是切换app/web.config中的驱动程序。不需要进行其他更改。
更新
public class Database
{
public static IDbConnection CreateOpenConnection()
{
var connectionString = ConfigurationManager.ConnectionStrings["TheDatabase"];
var providerName = connectionString.ProviderName;
var factory = DbProviderFactories.GetFactory(providerName);
var connection = factory.CreateConnection();
connection.Open();
return connection;
}
}
class FlowerManager : DataWorker
{
public static void GetFlowers()
{
using (IDbConnection connection = Database.CreateOpenConnection())
{
using (IDbCommand command = connection.CreateCommand("SELECT * FROM FLOWERS", connection))
{
using (IDataReader reader = command.ExecuteReader())
{
// ...
}
}
}
}
}发布于 2011-05-05 13:59:41
所需的大部分功能可以从
System.Data.Common.DbProviderFactories在这里,您可以获得由大多数dotnet-数据库提供者实现的System.Data.Common.DbProviderFactory项。
更新
哈维格,你自己的工厂很好。如果您正在寻找工作数据库工厂的示例,请参见
发布于 2011-05-05 14:01:52
我不会有“创造”或“创造联系”的方法。
一个更好的方法是让每个访问方法(如"GetAccounts")处理它们自己的连接/命令实例化。
连接和命令对象实现IDisposable。因此,最好使用在其中创建并根据需要处理这些语句的语句。以你现在的方式,可能会导致大量的内存问题。
此外,CreateParameter方法似乎没有比在需要创建这些参数的代码中调用“新SqlParameter”更有实际好处。
我要做以下几点:
public interface IDbAccess {
String ConnectionString;
Collection<Account> GetAccountsById(Int32 id);
Boolean StoreAccount(Account acct);
}
public class SqlDatabase : IDbAccess {
public String ConnectionString {get; set;}
public SqlDatabase(String connection) {
ConnectionString = connection;
}
public Collection<Account> GetAccountsById(Int32 id) {
using (SqlConnection connect = new SqlConnection(ConnectionString)) {
using (SqlCommand cmd = new SqlCommand(connect)) {
/// etc.
}
}
}
}这样,您的数据层就特定于您所提供的功能。企业库( Enterprise )等数据库访问已经有了很好的包装器。您正在采取的方法没有增加任何内容,并引入了错误。
此外,这种方法意味着您可以实现非数据库提供程序,如XML、web服务等,代码更改为零。
https://stackoverflow.com/questions/5898711
复制相似问题