C# 我遇到了两种插入员工的方法';将数据保存到下面的我的数据库中。我只是想知道区别

C# 我遇到了两种插入员工的方法';将数据保存到下面的我的数据库中。我只是想知道区别,c#,asp.net,sql,3-tier,C#,Asp.net,Sql,3 Tier,第一个(代码类型1)只是一个基本的插入,使用SqlCommand调用存储过程,并在insert Click事件处理程序下调用insert方法 第一个 代码类型1: public string InsertUserInformation() { SqlConnection con = new SqlConnection(ConnectionString); con.Open(); SqlCommand cmd = new SqlCommand("sp_userinfor

第一个(代码类型1)只是一个基本的插入,使用SqlCommand调用存储过程,并在insert Click事件处理程序下调用insert方法

第一个

代码类型1:

public string InsertUserInformation()
{

    SqlConnection con = new SqlConnection(ConnectionString);
    con.Open();

    SqlCommand cmd = new SqlCommand("sp_userinformation", con);
    cmd.CommandType = CommandType.StoredProcedure;

    try
    {
        cmd.Parameters.AddWithValue("@UserName", TextBox1.Text);
        cmd.Parameters.AddWithValue("@Password", TextBox2.Text);
        cmd.Parameters.AddWithValue("@FirstName", TextBox3.Text);
        cmd.Parameters.AddWithValue("@LastName", TextBox4.Text);
        cmd.Parameters.AddWithValue("@Email", TextBox5.Text);
        cmd.Parameters.AddWithValue("@PhoneNo", TextBox6.Text);
        cmd.Parameters.AddWithValue("@Location", TextBox7.Text);
        cmd.Parameters.AddWithValue("@Created_By", TextBox8.Text);
        cmd.Parameters.Add("@ERROR", SqlDbType.Char, 500);
        cmd.Parameters["@ERROR"].Direction = ParameterDirection.Output;

        cmd.ExecuteNonQuery();

        string strMessage = (string)cmd.Parameters["@ERROR"].Value;

        con.Close();

        return strMessage;
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        cmd.Dispose();
        con.Close();
        con.Dispose();
    }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{

    InsertUserInformation();
}
第二个(代码类型2):

这也是一个插入,但使用BEL、BLL、DAL,最后在PL的按钮插入事件处理程序下调用BLL层的insert_方法。
据我所知,3层有助于将代码组织到不同的层中,这样维护会更容易,并且还有其他x因素。
但是,第一个(代码类型1)对我来说似乎简单得多。
所以,请告诉我,
1.为什么他们会提到第二个,而第一个更简单和容易
2.两个系统的性能如何,哪一个更快?


提前感谢。

第一个示例将数据存储代码与UI代码紧密结合。如果不在编辑文本框名称后进行复制/粘贴,则无法在同一项目(或其他项目)的其他位置使用此代码。如果在sp_userinformation中添加了一个新的必需参数,并且该代码已在多个地方(或其他项目)复制,则必须找到并更新每个用法。编译器无法帮助处理缺少的参数

将此与使用对象(有时称为数据传输对象)的第二个示例进行比较。第二个示例没有直接引用用户界面对象,因此可以在单独的类中隔离。可以从应用程序的其他部分或鼓励代码重用的另一个应用程序调用相同的代码。如果在sp_userinformation中添加了一个新的必需参数,那么也可以将其添加到objBELUserDetails构造函数中。如果其他一些代码没有通过构造函数传入所需的参数,那么代码将不会编译。这允许在部署之前发现bug。还有许多其他原因,但您已经了解了其中的一些原因:组织、易于维护。数量太多,无法在此讨论

至于性能,第一个代码可能更出色,因为它只是进行数据库调用。但是,传递数据传输对象通常不会对性能造成很大影响。完成数据库调用所需的时间可能比任何c#代码都要长。但是,您可以随时测量以确保


无论如何,希望这有帮助

第二种方法帮助您在将数据插入数据库之前进行业务验证。例如,您希望添加业务验证,即Textbox1.text应以小写形式保存,最小长度为X,在这种情况下,如果您有两个位置更新/保存逻辑,则必须在两个位置写入验证,并且任何更改都需要在两个位置传播,但是拥有一个业务对象将允许您在数据流进入数据库之前控制它。在插入和创建数千个对象之前,与性能相关,没有太大区别。但是,如果您的项目规模较小,POC方法1是很好的选择,那么代码的屏幕截图就很烦人了。使用至少有语法突出显示的实际代码块。至于性能:代码升级和基准测试?(看不见,我说的是“不重要的”。)第一个可能看起来简单,但也意味着在应用程序中没有定义数据模型。使用第二种方法是因为不同的关注点应该在应用程序的不同层上处理,而在没有元编程功能的语言中,不幸的是,这意味着在没有这些额外关注点的情况下,层中会有一些委托样板。值得一提的是,第二个例子其实并不好。一般来说,我不相信编程博客会说a)不格式化代码样本,b)不解释所涉及的概念。这两个例子都应该在适当的地方使用
块(
SqlConnection
,在这种情况下)。这将确保即使发生错误,对象也已正确关闭和处置。其次,通常认为简单地重新显示异常是一个坏主意,因为您会丢失堆栈跟踪。感谢您的输入,它确实帮助我更好地理解了差异,非常感谢:)
public string InsertUserInformation(BEL objBELUserDetails)
{

    SqlConnection con = new SqlConnection(ConnectionString);
    con.Open();

    SqlCommand cmd = new SqlCommand("sp_userinformation", con);
    cmd.CommandType = CommandType.StoredProcedure;

    try
    {
        cmd.Parameters.AddWithValue("@UserName",objBELUserDetails.UserName);
        cmd.Parameters.AddWithValue("@Password", objBELUserDetails.Password);
        cmd.Parameters.AddWithValue("@FirstName", objBELUserDetails.FirstName);
        cmd.Parameters.AddWithValue("@LastName", objBELUserDetails.LastName);
        cmd.Parameters.AddWithValue("@Email", objBELUserDetails.Email);
        cmd.Parameters.AddWithValue("@PhoneNo", objBELUserDetails.Phoneno);
        cmd.Parameters.AddWithValue("@Location", objBELUserDetails.Location);
        cmd.Parameters.AddWithValue("@Created_By", objBELUserDetails.Created_By);
        cmd.Parameters.Add("@ERROR", SqlDbType.Char, 500);
        cmd.Parameters["@ERROR"].Direction = ParameterDirection.Output;

        cmd.ExecuteNonQuery();

        string strMessage = (string) cmd.Parameters["@ERROR"].Value;

        con.Close();

        return strMessage;
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        cmd.Dispose();
        con.Close();
        con.Dispose();
    }
}