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的形式,它不插入数据表。
我将在
UICustomerHandler 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)