【问题标题】:ASP.NET C# Data Access Layer function issueASP.NET C# 数据访问层函数问题
【发布时间】:2011-07-20 23:17:17
【问题描述】:

我在我的 .NET 站点中使用 3 层架构。目前在我的 DAL(数据访问层)中,我有 Load、Update、Insert 和 Delete,一切正常。但是我现在想创建一个函数来通过电子邮件地址获取数据。

下面是我的 loadinsertgetByEmailAddress,它们位于我的数据访问层中

 public DataTable Load()
    {
        SqlConnection conn = new SqlConnection(MyGlobals.conString);
        SqlDataAdapter dAd = new SqlDataAdapter("administratorGetAll", conn);
        dAd.SelectCommand.CommandType = CommandType.StoredProcedure;
        DataSet dSet = new DataSet();
        try
        {
            dAd.Fill(dSet, "AdministratorsTable");
            return dSet.Tables["AdministratorsTable"];
        }
        catch
        {
            throw;
        }
        finally
        {
            dSet.Dispose();
            dAd.Dispose();
            conn.Close();
            conn.Dispose();
        }
    }

    /// <summary>
    /// Used to load records from database by email address
    /// </summary>
    public int GetByEmailAddress(AdministratorsBO administrator)
    {
        SqlConnection conn = new SqlConnection(MyGlobals.conString);
        SqlCommand dCmd = new SqlCommand("administratorGetByEmailAddress", conn);
        dCmd.CommandType = CommandType.StoredProcedure;
        DataSet dSet = new DataSet();
        try
        {
            dCmd.Parameters.AddWithValue("@emailAddress", administrator.EmailAddress);

            SqlDataAdapter dAd = new SqlDataAdapter(dCmd);

            dAd.Fill(dSet, "AdministratorsTable");
            return Convert.ToInt32(dSet.Tables["AdministratorsTable"]);
        }
        catch
        {
            throw;
        }
        finally
        {
            dSet.Dispose();
            conn.Close();
            conn.Dispose();
        }
    }

    /// <summary>
    /// Used to insert records into database
    /// </summary>
    public int Insert(AdministratorsBO administrator)
    {
        SqlConnection conn = new SqlConnection(MyGlobals.conString);
        conn.Open();
        SqlCommand dCmd = new SqlCommand("administratorInsert", conn);
        dCmd.CommandType = CommandType.StoredProcedure;
        try
        {
            dCmd.Parameters.AddWithValue("@userName", administrator.UserName);
            dCmd.Parameters.AddWithValue("@emailAddress", administrator.EmailAddress);
            dCmd.Parameters.AddWithValue("@password", administrator.Password);
            dCmd.Parameters.AddWithValue("@firstName", administrator.FirstName);
            dCmd.Parameters.AddWithValue("@lastName", administrator.LastName);
            dCmd.Parameters.AddWithValue("@isActive", administrator.IsActive);
            return dCmd.ExecuteNonQuery();
        }
        catch
        {
            throw;
        }
        finally
        {
            dCmd.Dispose();
            conn.Close();
            conn.Dispose();
        }
    }

接下来是我的业务访问层:

public DataTable Load()
    {
        AdministratorsDAL aDAL = new AdministratorsDAL();
        try
        {
            return aDAL.Load();
        }
        catch
        {
            throw;
        }
        finally
        {
            aDAL = null;
        }
    }

    /// <summary>
    /// Load records from database
    /// </summary>
    /// <returns></returns>
    public DataTable GetByEmailAddress(AdministratorsBO administrator)
    {
        AdministratorsDAL aDAL = new AdministratorsDAL();
        try
        {
            return aDAL.GetByEmailAddress(administrator);
        }
        catch
        {
            throw;
        }
        finally
        {
            aDAL = null;
        }
    }

    /// <summary>
    /// Insert records into database
    /// </summary>
    /// <param name="person"></param>
    public int Insert(AdministratorsBO administrator)
    {
        AdministratorsDAL aDAL = new AdministratorsDAL();
        try
        {
            return aDAL.Insert(administrator);
        }
        catch
        {
            throw;
        }
        finally
        {
            aDAL = null;
        }
    }

Load 和 Insert 非常标准并且可以正常工作。但是,getByEmailAddress 配置不正确。我尝试混合加载和插入中的代码,但没有成功。谁能给我一个提示、想法或可以解决这个问题的东西,以便我可以使用getByEmailAddress

顺便说一句,该函数应该命中一个存储过程,该过程通过发送任何 emailAddress 输入来收集所有信息。

提前致谢!

【问题讨论】:

  • 定义“未正确配置”。它怎么不工作?当你调试它时,它在哪里失败了?
  • 捕捉 { 扔; } 语句不是必需的。
  • 您能否详细说明发生的错误以及它在哪里抛出(在 BusinessLayer 或 DAL 中)?
  • 在 BAL 中,try/catch/finally 不是必需的。请注意,aDAL = null,什么也不做。只需返回 (new AdministratorsDal()).Load();

标签: c# asp.net 3-tier


【解决方案1】:

您的业务层正在为 GetByEmailAddress 返回一个 DataTable,但您的数据访问层正在为 GetByEmailAddress 返回一个 int。你不想在你的 DAL 中:

public DataTable GetByEmailAddress(AdministratorsBO administrator)

并且返回变为:

return dSet.Tables["AdministratorsTable"];

【讨论】:

    【解决方案2】:

    从你的业务层引用你应该返回一个数据表而不是一个整数

    public DataTable GetByEmailAddress(AdministratorsBO administrator)
    {
        Using (SqlConnection conn = new SqlConnection(MyGlobals.conString))
        {
            SqlCommand dCmd = new SqlCommand("administratorGetByEmailAddress", conn);
            dCmd.CommandType = CommandType.StoredProcedure;
            DataSet dSet = new DataSet();
    
            dCmd.Parameters.AddWithValue("@emailAddress", administrator.EmailAddress);
    
            SqlDataAdapter dAd = new SqlDataAdapter(dCmd);
    
            dAd.Fill(dSet);
            return dSet.Tables[0];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 2011-12-10
      • 2011-02-14
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      相关资源
      最近更新 更多