Проблема с доступом к данным Enterprise Library 6.0 с помощью GetStoredProcCommand

Я пытаюсь создать уровень доступа к данным с блоком данных 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), то это сработает.

так почему же он терпит неудачу в первую очередь и как с этим справиться?


person user4817931    schedule 22.04.2015    source источник
comment
это не удается, потому что вы не инициализировали свойство соединения :-) coonectionstring, открыть соединение, выполнить работу и снова закрыть его.   -  person Legends    schedule 23.04.2015


Ответы (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
        {
        } 
    }

}

Я бы получал «свежую» базу данных при каждом вызове. После использования позвольте ему выйти из области видимости и собрать мусор.

person granadaCoder    schedule 24.04.2015