Windows窗体应用程序的三层架构实现

本文关键字:三层 实现 窗体 应用程序 Windows | 更新日期: 2023-09-27 18:14:18

我正在尝试使用三层架构将数据插入数据库,但我被卡住了,无法继续进行。

这是我的代码

首先是UI部分:

    public void assignField()
    {
        string maritalCondition = "";
        string sex = "";
        assignObj.Registered_Date = dateTimePicker1_Date.Value;
        assignObj.First_Name = txt_FirstName.Text;
        if (comboBox2_MaritalStatus.SelectedIndex == 0)
        {
            maritalCondition = "Single";
        }
        else
            maritalCondition = "Married";
        assignObj.Marital_Status = maritalCondition;
        if (RadioButton_Male.Checked == true)
            sex = "Male";
        else
            sex = "Female";
        assignObj.Gender = sex;
        this.txt_Age.Text = Convert.ToInt32(age).ToString();
    }
    private void btnRegister_Click(object sender, EventArgs e)
    {
        assignField();
    }

下一个是中间层:

public class CustomerDataType
{
    private DateTime registered_Date;
    private string first_Name;
    private int age;
    private string marital_Status;
    private string gender;
    public DateTime Registered_Date
    {
        get { return registered_Date; }
        set { registered_Date = value; }
    }
    public string First_Name
    {
        get { return first_Name; }
        set { first_Name = value; }
    }
    public int Age
    {
        get { return age; }
        set { age = value; }
    }
    public string Marital_Status
    {
        get { return marital_Status; }
        set { marital_Status = value; }
    }
    public string Gender
    {
        get { return gender; }
        set { gender = value; }
    }
    public void insertInfo()
    {
        CustomerDataAccess insertObj = new CustomerDataAccess(Registered_Date, First_Name, Age, Marital_Status, Gender);
        insertObj.insertCustomerInfo();
    }
}

,最后是数据访问层:

public class CustomerDataAccess
{
    public CustomerDataAccess(DateTime Registered_Date, string First_Name, int Age, string Marital_Status, string Gender)
    {
        this.registrationDate = Registered_Date;
        this.fName = First_Name;
        this.userAge = Age;
        this.marriageStatus = Marital_Status;
        this.userGender = Gender;
    }
    SqlConnection con;
    SqlCommand cmd;
    DateTime registrationDate;
    string fName = "";        
    int userAge;
    string marriageStatus;
    string userGender;
    public void insertCustomerInfo()
    {
         try
         {  
            con = new SqlConnection("Data Source=LAKHE-PC;Initial Catalog=Sahakari;Integrated Security=True");
            con.Open();
            cmd = con.CreateCommand();
            cmd.CommandText = "sp_registerCust";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Registered_Date", SqlDbType.DateTime);
            cmd.Parameters["@Registered_Date"].Value = registrationDate;
            cmd.Parameters.Add("@First_Name", SqlDbType.VarChar);
            cmd.Parameters["@First_Name"].Value = fName;
            cmd.Parameters.Add("@Age", SqlDbType.Int.ToString());
            cmd.Parameters["@Age"].Value = userAge;
            cmd.Parameters.Add("@Marital_Status", SqlDbType.VarChar);
            cmd.Parameters["@Marital_Status"].Value = marriageStatus;
            cmd.Parameters.Add("@Gender", SqlDbType.VarChar);
            cmd.Parameters["@Gender"].Value = userGender;
            cmd.ExecuteNonQuery();
            con.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
}

这里的存储过程,没有问题,从SQL Server我可以很容易地插入数据到表。但是从windows的形式,它不插入数据表。

Windows窗体应用程序的三层架构实现

我将在

UI

CustomerHandler custHandler = new CustomerHandler();
// create Customer object and pass to insert method
if (custHandler.InsertCustomer(new Customer(){
    FirstName = txt_FirstName.Text, Registered_Date =dateTimePicker1_Date.Value,
    //decalare other parameters....
    ))
{
    // insert Success, show message or update label with succcess message
}

public  class CustomerHandler
{
    // in BL you may have to call several DAL methods to perform one Task 
    // here i have added validation and insert 
    // in case of validation fail method return false
    public bool InsertCustomer(Customer customer)
    {
        if (CustomerDataAccess.Validate(customer))
        {
            CustomerDataAccess.insertCustomer(customer);
            return true;
        }
        return false;
    }
}

In MY DAL

// this is the class you going to use to transfer data across the layers 
public class Customer
{
    public DateTime Registered_Date { get; set; }
    public string FirstName { get; set; }
    //so on...
}
public class CustomerDataAccess
{
    public static void insertCustomer(Customer customer)
    {
        using (var con = new SqlConnection("Data Source=LAKHE-PC;Initial Catalog=Sahakari;Integrated Security=True"))
        using (var cmd = con.CreateCommand())
        {
            con.Open();
            cmd.CommandText = "sp_registerCust";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Registered_Date", customer.Registered_Date);
            cmd.Parameters.AddWithValue("@FirstName", customer.FirstName);
            // so on...
            cmd.ExecuteNonQuery();
        }
    }
    internal static bool Validate(Customer customer)
    {
        // some validations before insert 
    }
}

中间层由包含属性所需值的类组成。而不是手动编写数据访问,尝试使用实体框架(EF),它为您做的。在这里(在MSDN),你可以找到一个快速入门的例子,告诉你如何使用它。

实体框架不是手动映射字段并执行查询,而是这样做,这意味着你只需要将值分配给对象的属性并调用SaveChanges() - SQL代码由EF自动创建和执行。

要进一步阅读,也有很多可以在这里找到(在Stackoverflow)