【问题标题】:Enterprise Library 6.0 Data Access issue with GetStoredProcCommandEnterprise Library 6.0 与 GetStoredProcCommand 的数据访问问题
【发布时间】:2015-04-22 06:49:50
【问题描述】:

我正在尝试使用 Enterprise Library 6.0 数据块构建数据访问层。下面是我的配置文件

<configuration>  
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true"/>
  </configSections>
  <dataConfiguration defaultDatabase="db"/>
  <connectionStrings>
      <add name="db" connectionString="..." providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

下面是我的类文件

public class MasterRepo
{
    Database db = null;
    static MasterRepo()
    {
        DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory());
    }

    public MasterRepo()
    {
        db = DatabaseFactory.CreateDatabase("db");
    }

    public int Save(int param1, int param2)
    {
        using (DbCommand cmd = db.GetStoredProcCommand("Save", param1, param2))
        {
            return cmd.ExecuteNonQuery();
        }
    }
}

但我们收到错误“ExecuteNonQuery:连接属性尚未初始化。”在 cmd.ExecuteNonQuery() 处 如果我们将 cmd.ExecuteNonQuery() 替换为 db.ExecuteNonQuery(cmd) 那么它就可以工作了。

那么为什么它首先失败了,什么是处理这个问题的好方法?

【问题讨论】:

  • 它失败了,因为你还没有初始化连接属性 :-) coonectionstring,打开连接,工作并再次关闭它。

标签: enterprise-library enterprise-library-6


【解决方案1】:

至少,请检查一下,以便您知道您的数据库已初始化。

public int Save(int param1, int param2)
{
    if(null!=db)
    {
        using (DbCommand cmd = db.GetStoredProcCommand("Save", param1, param2))
        {
            return cmd.ExecuteNonQuery();
        }
    }
    else
    {
        throw new NullReferenceException("Database (db) was null.  This was not expected.");
    }
}

我通常这样做:

public abstract class DataLayerBase
{
    private string _instanceName = string.Empty;

    public DataLayerBase()
    {
    }

    public DataLayerBase(string instanceName)
    {
        this._instanceName = instanceName;
    }

    protected Database GetDatabase()
    {
        Database returnDb = null;
        if (this._instanceName.Length > 0)
        {
            returnDb = DatabaseFactory.CreateDatabase(this._instanceName);
        }
        else
        {
            returnDb = DatabaseFactory.CreateDatabase();
        }
        return returnDb;
    }
}



public class ZebraData : DataLayerBase
{
    //Procedures
    private readonly string PROC_ZEBRA_GET_ALL = "[dbo].[uspZebraGetAll]";

    public ZebraData() : base()
    {
    }
    public ZebraData(string instanceName) : base(instanceName)
    {
    }

    public IDataReader ZebraGetAll()
    {
        IDataReader idr = null;
        try
        {
            Database db = base.GetDatabase();
            DbCommand dbc = db.GetStoredProcCommand(this.PROC_ZEBRA_GET_ALL);
            idr = db.ExecuteReader (dbc);
            return idr;
        }
        finally
        {
        } 
    }

}

每次通话我都会得到一个“新鲜”的数据库。使用后,让它超出范围并收集垃圾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2014-11-02
    相关资源
    最近更新 更多