Скажем, у меня есть трехуровневое приложение ASP.NET, написанное на С#. Как вы должны правильно использовать DAL, BLL и PL?
Например, скажем, у меня есть хранимая процедура, для которой требуется передать идентификатор клиента, прежде чем он вернет результаты. На моем уровне доступа к данным я мог бы иметь следующее:
public DataTable GetCustomerInfo(collection b)
{
DataTable table;
try
{
string returnValue = string.Empty;
DB = Connect();
DBCommand = connection.Procedure("sp_getCust");
DB.AddInParameter(DBCommand, "@CustomerID", DbType.String, b.CustomerID);
DbDataReader reader = DBCommand.ExecuteReader();
table = new DataTable();
table.Load(reader);
return table;
}
catch (Exception ex)
{
throw (ex);
}
}
Тогда в моем BLL я бы получил эту возвращенную таблицу и заполнил набор данных?
Я попытался заполнить набор данных без моего имени DataTable
, "table",
public static DataTable returnCustomer(collection b)
{
try
{
SqlDataAdapter adapt = new SqlDataAdapter();
DataSet table = new DataSet();
adapt.Fill(table, "table");
return table;
}
catch (Exception ex)
{
throw ex;
}
}
Однако я получаю следующие ошибки:
Также: как привязать набор данных, чтобы я мог вернуть данные в мои текстовые поля?
DataSet имеет коллекцию таблиц - вам нужно вернуть только первую таблицу из DataSet:
var dataSet = new DataSet();
adapt.Fill(dataSet, "table");
return dataSet.Tables["table"];
Кроме того, не делайте этого, поскольку он разрушает стек:
catch (Exception ex)
{
throw (ex);
}
Если вы не собираетесь выполнять обработку исключений, то полностью удалите try/catch. Если вы собираетесь делать обработку, а затем повторно поднимать, то либо просто throw
, либо обертываете и бросаете (например, throw new SomeException("Wrapped", ex);
)
Наконец, обратите внимание, что многие объекты в вашем DAL являются IDisposable
- все должны быть удалены DataReaders, SqlConnection и SqlCommand - я бы рекомендовал обернуть вызов в области using
.
У меня есть BL (Business Layer) и DAL (уровень доступа к данным) в одном классе.
Например, у меня есть один столбец "Clarity_Master" в моей базе данных. Итак, я добавлю один класс в визуальную студию под названием "Clarity_BLL.cs",
Clarity_BLL.cs
namespace DAL
{
public class Clarity_BLL
{
public int PURITY_ID { get; set; }
public string PURITY_NAME { get; set; }
public string PURITY_CODE { get; set; }
public int DISPLAY_ORDER { get; set; }
public bool IDELETE { get; set; }
public DataTable GET_CLARITYBYNAME()
{
ExceptionManager exManager;
exManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
DataTable dt = null;
try
{
exManager.Process(() =>
{
Database sqlDatabase = DBConnection.Connect();
DataSet ds = sqlDatabase.ExecuteDataSet("StoreProcedureName",PURITY_NAME_Para1, IDELETE_Para2);
dt = ds.Tables[0];
}, "Policy");
}
catch (Exception ex)
{
throw ex;
}
return dt;
}
}
}
И используйте эти классы BL & DAL, как показано ниже в моем PL (Presentation Layer).
Clarity_MST.aspx.cs
public void bindgrid()
{
Clarity_BLL obj_CLARITY_BLL = new Clarity_BLL();
obj_CLARITY_BLL.PURITY_ID = 0;
obj_CLARITY_BLL.IDELETE = true;
grdClarity.DataSource = obj_CLARITY_BLL.GET_CLARITYBYNAME();
grdClarity.DataBind();
}
Пожалуйста, дай мне знать, если возникнут какие-либо вопросы.