C# 如何使用ASP.NET C使用三层体系结构从数据库返回数据#

C# 如何使用ASP.NET C使用三层体系结构从数据库返回数据#,c#,asp.net,datatable,dataset,C#,Asp.net,Datatable,Dataset,假设我有一个用C#编写的三层ASP.NET应用程序。您应该如何正确使用DAL、BLL和PL 例如,假设我有一个存储过程,它要求在返回结果之前传入customer ID的参数。在我的数据访问层中,我可以具有以下功能: public DataTable GetCustomerInfo(collection b) { DataTable table; try { string returnValue = string.Empty; DB = C

假设我有一个用C#编写的三层ASP.NET应用程序。您应该如何正确使用DAL、BLL和PL

例如,假设我有一个存储过程,它要求在返回结果之前传入customer ID的参数。在我的数据访问层中,我可以具有以下功能:

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中,我将得到返回的表并填充数据集

我尝试在没有名为“table”的
DataTable
的情况下填充数据集

但是,我得到以下错误:


另外:如何绑定数据集,以便将数据返回到文本框?

数据集有一个表集合-您只需要从数据集中返回第一个表:

var dataSet = new DataSet();
adapt.Fill(dataSet, "table");
return dataSet.Tables["table"];
另外,不要这样做,因为:

如果您不打算进行任何异常处理,那么就完全放弃try/catch。如果您要进行处理,然后重新引发,则可以只抛出
或(例如
抛出新的SomeException(“Wrapped”,ex);

最后,请注意,DAL中的许多对象都是IDisposable
——DataReaders、SqlConnection和SqlCommand都应该被释放——我建议使用范围将调用包装在
中。

我在一个类中实现了BL(业务层)和DAL(数据访问层)

例如,我的数据库中有一个表调用“Clarity_Master”。因此,我在VisualStudio名称中添加了一个类“Clarity_BLL.cs”

清晰性\u 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;
    }
  }
 }
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();
    }

如果您有任何问题,请告诉我。

Re:如何将DataTable绑定到Asp.Net UI-您没有提到WebForms还是MVC,但在WebForms中,我认为DAL、BLL、PL的全部要点是,您不需要从PL中的代码触发SQL。。。分离!是的,我们同意不希望Sql从数据层泄漏出去。通常,folk已经从弱模式(如
DataTable
(和类型化数据集))转向从数据/存储库返回实体POCO,例如通过ORM的类实体框架和Linq2Sql。此外,您还可以查看而不是“N层”-例如,通常很难为获取和查询活动证明“业务层”的合理性。洋葱也是通过依赖注入解耦层的自然副作用。
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;
    }
  }
 }
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();
    }