Arquitectura de tres niveles de implementación en la aplicación de formularios Windows forms

Estoy tratando de insertar datos en una base de datos utilizando una arquitectura de tres niveles, pero me he atascado y no puedo continuar.

Este es mi código

Primera es la parte de interfaz de usuario:

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

Siguiente es el nivel medio:

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

y última es la de acceso a datos de nivel:

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

Aquí con el procedimiento almacenado, no hay ningún problema y a partir de SQL Server puedo insertar datos en la tabla fácilmente. Pero a partir de windows forms, no insertar datos en la tabla. Que me ayude Plz.

  • Este bit no se ve bien: cmd.Parameters.Add("@Age", SqlDbType.Int.ToString()); – seguramente usted sólo quiere SqlDbType.Int
  • Pequeña sugerencia: Auto-propiedades de la brevedad = menos errores (no el problema con el código, pero todo el mundo debería utilizar este): msdn.microsoft.com/en-us/library/bb384054.aspx
  • Sugerencia: si ya tener un CustomerDataType – a continuación, utilice! En la capa de interfaz de usuario, crear una instancia de ella y establezca sus propiedades, y en la capa de acceso a datos, el uso de ese tipo en su insertCustomerInfo método – no todos los parámetros separados para cada propiedad…..
  • Al iniciar sesión en SQL Server que están utilizando el mismo usuario que utiliza su aplicación? Si no, asegúrese de que el usuario que ejecuta el SP en la aplicación tiene permiso para ejecutar.
  • Este es un artículo mayores, pero vale la pena leerlo. Su «sabor» es «Pasar Personalizado Componentes de Entidad Empresarial Como Entradas y Salidas»
  • Gracias por su ayuda.Soy capaz de almacenar datos en la base de datos.

2 Kommentare

  1. 3

    Voy a hacer algo como la siguiente

    Interfaz de usuario

    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
    }

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

    En MI 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 
        }
    }
  2. 1

    El nivel medio se compone de clases de la celebración de los valores que se requieren en propiedades. En lugar de escribir los datos de acceso de forma manual, trate de usar Entity Framework (EF), que lo hace por ti.
    Aquí (en MSDN) usted puede encontrar un tutorial de ejemplo que muestra cómo se puede utilizar.

    Lugar de mapeo de los campos manualmente y la ejecución de una consulta, en el Marco de la Entidad hace que lo que significa que usted sólo tiene que asignar los valores a las propiedades del objeto y llamar a SaveChanges() – el código SQL se crea y ejecuta de forma automática por el EF.

    Para leer más, también hay un montón encontrar aquí (en Stackoverflow).

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea