1

3 層アーキテクチャーを使用してデータベースにデータを挿入しようとしていますが、行き詰まり、先に進むことができません。

これは私のコードです

最初は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 フォームからは、テーブルにデータを挿入しません。助けてください。

4

2 に答える 2

3

私は以下のようなことをします

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
}

私のBLでは

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;
    }
}

マイダルで

// 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 
    }
}
于 2013-05-20T07:25:06.600 に答える
1

中間層は、プロパティで必要な値を保持するクラスで構成されます。データ アクセスを手動で記述する代わりに、それを行う Entity Framework (EF) を使用してみてください。 ここ (MSDN) では、その使用方法を示すクイックスタートの例を見つけることができます。

フィールドを手動でマッピングしてクエリを実行する代わりに、Entity Framework がそれを行います。つまり、値をオブジェクトのプロパティに割り当てて SaveChanges() を呼び出すだけで済みます。SQL コードは EF によって自動的に作成および実行されます。

さらに読むために、ここ (Stackoverflow)にも多くの情報があります。

于 2013-05-20T07:24:45.880 に答える