首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据层抽象工厂

数据层抽象工厂
EN

Stack Overflow用户
提问于 2011-05-05 13:43:56
回答 4查看 12.2K关注 0票数 5

我是开发抽象工厂模式的新手,我希望在数据层中创建一个抽象工厂,帮助我将该层链接到任何其他数据库,例如sql和oracle。你能帮我完成这个任务吗?请注意,数据库的连接字符串将在此层中找到,而不是在演示文稿中。

谢谢

编辑

代码语言:javascript
复制
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
}
代码语言:javascript
复制
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);
    }
}

这是我创建的两个类。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-05 14:14:05

功能已经存在。

向app/webb.config添加一个连接字符串:

代码语言:javascript
复制
<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>

使用工厂构建连接:

代码语言:javascript
复制
var connectionString = ConfigurationManager.ConnectionStrings["TheDatabase"];
var providerName = connectionString.ProviderName;
var factory = DbProviderFactories.GetFactory(providerName);

建立联系:

代码语言:javascript
复制
var connection = factory.CreateConnection();

得到命令:

代码语言:javascript
复制
var command == connection.CreateCommand();

唯一需要做的就是切换app/web.config中的驱动程序。不需要进行其他更改。

更新

代码语言:javascript
复制
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())
                {
                    // ...
                }
            }
        }
    }
}
票数 9
EN

Stack Overflow用户

发布于 2011-05-05 13:59:41

所需的大部分功能可以从

代码语言:javascript
复制
 System.Data.Common.DbProviderFactories

在这里,您可以获得由大多数dotnet-数据库提供者实现的System.Data.Common.DbProviderFactory项。

更新

哈维格,你自己的工厂很好。如果您正在寻找工作数据库工厂的示例,请参见

  • 查询快车一个工作的数据库-查询gui,
  • [医]黄豆是queryexpress的一个旋翼
  • 成肌是一个连接到许多不同数据库的代码生成器
  • 用于许多数据库的具有复杂驱动程序的NHibernate
票数 4
EN

Stack Overflow用户

发布于 2011-05-05 14:01:52

我不会有“创造”或“创造联系”的方法。

一个更好的方法是让每个访问方法(如"GetAccounts")处理它们自己的连接/命令实例化。

连接和命令对象实现IDisposable。因此,最好使用在其中创建并根据需要处理这些语句的语句。以你现在的方式,可能会导致大量的内存问题。

此外,CreateParameter方法似乎没有比在需要创建这些参数的代码中调用“新SqlParameter”更有实际好处。

我要做以下几点:

代码语言:javascript
复制
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服务等,代码更改为零。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5898711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档