viernes, 6 de septiembre de 2013

Crear-modificar un procedimiento almacenado con parámetros de entrada SQL Server

Se explica cómo se crea un procedimiento almacenado (a partir de ahora SP, Stored Procedure) en una Base de Datos de SQL SERVER y como se introducen parámetros de entrada en dicho procedimiento.

Para crear el procedimiento almacenado se pone la palabra clave CREATE, y se ejecuta el siguiente código o similar. Los parámetros de entrada van  después del nombre del SP precedidos de @ y separados por comas excepto el último.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


CREATE PROC [PROPIETARIO].[sp_Nombre_Procedimiento] 
@strParametro1      char(14),    
@strParametroN      char(14)
   
AS

Begin transaction
update propietario.tbTabla set strVariable1 = @strParametro1 where strVariableN =  @strParametroN     
Commit transaction

Ejecutamos el código en el analizador de consultas de SQL SERVER, eligiendo la Base de Datos sobre la cual se creará.

Crear modificar un procedimiento almacenado SQL server

Hecho esto, dice que se ha creado correctamente.

Crear modificar un procedimiento almacenado SQL server

Para modificarlo posteriormente se cambia la palabra clave CREATE por ALTER y se pulsa ejecutar de nuevo. Para ver el SP creado o modificado lo buscamos en el explorador de objetos, en programación -> Procedimientos almacenados.

Crear modificar un procedimiento almacenado SQL server

Para ver su código y modificarlo si procede, nos posicionamos sobre el procedimiento almacenado y con el botón derecho del ratón -> modificar

modificar un procedimiento almacenado SQL server


O bien Incluir procedimiento almacenado como

Crear un procedimiento almacenado SQL server


Lo que nos abrirá una ventana con el script para crear, modificar o borrar el SP , también nos permite elegir si deseamos una nueva ventana, un archivo o llevarlo al portapapeles.

viernes, 30 de agosto de 2013

Trabajar con métodos

Este artículo es la continuación de la implementación de un Primer Programa Orientado a Objetos. Aquí veremos cómo crear métodos de la clase, cómo sobrecargarlos y cómo rellenar un ListBox utilizando el objeto ArrayList de .NET. También veremos como agregar un control a un formulario en tiempo de ejecución. Finalmente utilizaremos los métodos para arrastrar y soltar objetos dentro de un formulario.

Consideraciones en el diseño de clases reutilizables


La idea de la POO es hacer que nuestro código pueda ser reutilizable o incluso exportable a otros programas a través del conocido Copiar y Pegar, para hacer esto posible hay que tener en cuenta algunos conceptos importantes:


Abstracción


Cuando se crea una clase, existe la tentación de agregar una gran cantidad de funciones de apoyo, no obstante hay que tener en cuenta que cada método, propiedad o evento que se añada a la clase va a limitar las opciones de reutilización de la clase. También es necesario saber que una clase debe hacer una cosa bien. Si utilizamos una abstracción clara, será más fácil para los desarrolladores, pues sus métodos y propiedades tendrán sentido y su comportamiento será más predecible.


Contención


Una clase es una especie de caja negra donde se almacena un tipo de objeto con datos diversos y los métodos que trabajan con ellos, por ejemplo La clase CHospital puede almacenar Nombres, direcciones, Números de habitación, Historias clínicas o cualquier otra cosa. Por lo tanto, hay que tener cuidado de no hacer ninguna suposición sobre el contexto de la clase. A pesar de que se va a desarrollar una clase en un contexto de una aplicación de Windows, la clase no debe contener ninguna referencia a un formulario.

Es posible que se desee añadir un comportamiento que dependa del código de cliente. Se podría añadir un método que tome un argumento para especificar una forma de tratar la infoirmación. En este caso es mejor agregar un método que cree un objeto específico de .NET
De tal forma que sea utilizable a través de una serie de códigos de cliente más amplia.

Por ejemplo, si se desea agregar código que muestre un dibujo de un hospital para cada hospital agregado. Se puede añadir un método que cree un objeto de .NET Graphics. Esto nos va permitir escribir código para dibujar el hospital en cualquier objeto que contenga un objeto Graphics de .NET.

Código Cliente


Si la clase está bien diseñada, el código de cliente se simplificará mucho, las estructuras de decisión y los bucles estarán contenidos en los métodos de la clase, de este modo no aparecerán en el código de cliente que se limitará a llamadas a los métodos de las clases.


Interfaz


Hay que proporcionar una interfaz completa, pero sin exajerar. Implementar el interfaz lo suficientemente bien como para que un posterior desarrollador  pueda extenderla. Por ejemplo, la clase CHospital tiene un método para dar de alta a un Médico en un hospital y otro para Ubicar un paciente en una sala, pero posteriormente se puede seguir completando, añadiéndo metodos por ejemplo para asignar una especialidad a un médico o un paciente a un médico.


A continuación continuamos añadiendo funcionalidad a la Clase CHospital, en este caso agregaremos un constructor y más métodos.

métodos el la programación orientada a objetos


jueves, 1 de agosto de 2013

Curso básico de análisis orientado a objetos (AOO)

Con la última entrada se completa un curso básico de Análisis Orientado a Objetos.

Análisis orientado a objetos (AOO) V

El modelo Objeto-Comportamiento

Consiste en evaluar el funcionamiento dinámico del sistema obedeciendo a estímulos externos. El modelo se crea siguiendo los siguientes pasos:

-       Evaluación de todos los casos de uso
-       Crear una traza de sucesos para cada caso de uso
-       Identificación de sucesos y comprender como se relacionan con los objetos
-       Construir un diagrama de transición de estados

Evaluación de los casos de uso


Se considera que ocurre un suceso, cada vez que un actor (puede ser humano o no) intercambia información con el sistema. Es importante recordar que un suceso es booleano (o sucede o no sucede) no caben más posibilidades, es decir un suceso no es la información que se intercambia si no solamente la contabilización de dicho suceso.

Por ejemplo una persona se acerca a un cajero automático y realiza las siguientes operaciones:

1-     Introduce la tarjeta en la ranura y teclea su número de 4 cifras. La contraseña se compara con la almacenada en el sistema. Si dicha contraseña es incorrecta un mensaje por pantalla avisará y restaurará el sistema a las condiciones iniciales, si es correcta  muestra un menú y espera la siguiente acción.

2-     El usuario elije sacar dinero y el sistema comprueba si el saldo tecleado es igual a superior al máximo diario  o al saldo disponible en la cuenta. Si es así entrega el dinero y muestra de nuevo el menú, en caso contrario muestra un mensaje indicando la situación entrega la diferencia y muestra el menú con la opción sacar dinero deshabilitada.

3-     El usuario coge el dinero y la tarjeta, si no se detecta la retirada del dinero o de la tarjeta envía un mensaje en pantalla y otro sonoro indicando el olvido. Si la retirada es completa vuelve al estado inicial. Si no persiste la señal unos segundos y vuelve al estado inicial.

La partes subrayadas indican sucesos. Debe buscarse un actor para cada suceso y anotar la información que se intercambia en cada suceso junto con posibles restricciones o condiciones.
Por ejemplo, en el caso en el que el usuario teclea su contraseña de 4 cifras desde el punto de vista del Análisis OO el actor transmite un suceso al teclado, dicho suceso se puede llamar clave_introducida pero la clave concreta en sí, no es una parte esencial del modelo. En este caso, el hecho de introducir la clave no cambia el flujo de control del caso de uso pero la tarea comparar_contraseña si lo cambia pues a partir de aquí el flujo discurrirá por dos caminos diferentes si la contraseña es correcta o incorrecta.
Cuando se han identificado todos los sucesos, se asocian a los objetos que pueden generar sucesos, incluidos los actores

Construcción del diagrama de transición de estados


Para construir este diagrama hay que tener en cuenta dos caracterizaciones diferentes de estados, una que muestra el estado de cada objeto y otra que muestra el estado del sistema en su conjunto.
También hay que distinguir entre características pasivas (estado actual de todos los atributos de un objeto) y características activas que indica el estado actual del objeto en el momento de producirse el cambio de estado.
Un ejemplo de características pasivas de una cuenta corriente en un cajero sería el titular, el Nº de cuenta etc. Las características activas sería el saldo, si la cuenta está anulada o no, etc. Para pasar una transición de estado activo a otro debe ocurrir un suceso (p.ej. sacar dinero y el saldo de la cuenta cambia).  Cada componente de un modelo objeto-comportamiento es una representación de los estados activos de cada objeto y de los sucesos que producen dichos cambios en estos estados activos.
Diagrama de transición de estados
El esquema mostrado arriba se llama de transición de estados, en él cada flecha es una transición de un estado activo de un objeto a otro. Las etiquetas al lado de cada flecha son los sucesos que disparan la transición. Existe el concepto de guarda, que es una condición booleana que posibilita la ocurrencia de una transición.  La guarda de una transición depende de los valores tomados por uno o varios atributos de un objeto. La guarda depende de un estado pasivo del objeto.
Una acción ocurre como consecuencia de una transición, e implica una o más responsabilidades del objeto. Por ejemplo introduce contraseña en el esquema de arriba es una acción.

Hay otro tipo de esquema para representar los estados del sistema, se trata de modelo  de traza de sucesos. En este modelo se indica como un suceso causa una transición del sistema de un estado a otro. Lo sucesos son booleanos. El sistema del cajero automático representado con este tipo de esquema quedaría del siguiente modo:

modelo  de traza de sucesos

En este esquema, el  usuario introduce la contraseña  a través del teclado, el sistema la compara, si es incorrecta avisa de que la contraseña se debe introducir de nuevo, si es correcta muestra el menú de las  operaciones a realizar.


martes, 30 de julio de 2013

Conectar una aplicación .NET a una base de datos SQL Server

Vamos a conectar una aplicación de Visual Basic.NET a una Base de Datos SQL SERVER 2005 a través del Wizard que proporciona Visual Studio 2005 para conectarla con un DataSourceTambién daré nociones de otra forma de hacerlo que no desarrollaré. Finalmente haremos la misma operación pero por código

A través de DataSource

Continuando con nuestro  programa de ejemplo, sobre nuestro proyecto de Visual Studio 2005 (Visual Basic), añadimos un combo al formulario y procedemos del siguiente modo para enlazarlo a una tabla de nuestra base de Datos:

1.Añadimos los controles del componente Microsoft  remoteData Control 6.0



2. En la barra de herramientas aparece:


Elegimos BindingSource y colocamos sobre el formulario.


3. Para conectarla a la base de datos
Elegimos dataSource en el cuadro de propiedades del BindingSource y seguimos el Wizard.




Elegimos los parámetros de conexión que se corresponden con nuestra Base de Datos.




Ahora en la barra de herramientas aparecerán nuevas herramientas de Base de datos


4. En las propiedades del Combo añado la herramienta deseada (asociada a la tabla de la que deseamos leer los datos)





5. En ValueMember elegimos el campo a mostrar.


6. Para poder acceder al campo código de la tabla desde el código de Visual Basic podemos definir el campo deseado en las propiedades del combo.



7. Y después leerlo en el código de VB en el evento _SelectedIndexChanged

Private Sub CboHospitales_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
CboHospitales.SelectedIndexChanged


 Dim CodigoHosp As String
 CodigoHosp = CboHospitales.SelectedItem.Row.ItemArray(1)

También podemos ver su valor en tiempo de ejecución en la ventana watch



8. Finalmente ejecutamos la aplicación para ver que ha enlazado el campo de la tabla correctamente.


Podemos proceder del mismo modo con una caja de texto corriente.


Elegimos el objeto para la tabla y el campo deseados


Ahora al ejecutar el proyecto, cada vez que elegimos un hospital, aparece en la caja su dirección.


Para establecer el teléfono,  Colocamos sobre el formulario un objeto tbHospTelBindingSource y lo definimos


Colocamos una caja de lista y ponemos esto en sus propiedades:

Otra forma de conectarse: con SQL Datasbase

En proyecto, Add New Item



Se elige SQL Database


Conectar una aplicación Visual Basic.Net a una Base de Datos SQL Server 2005 mediante código

Para hacer lo mismo que se acaba de realizar pero por código, se procede del siguiente modo:
Creamos un módulo de conexión llamado conexion.vb e incluimos las siguientes líneas:

Módulo genérico de conexión

Imports System.Data.SqlClient
Imports System.Data
Module Conexion

    Public cnDB As SqlClient.SqlConnection
    Dim cmDB As SqlClient.SqlCommand
    Dim dsDB As DataSet
   
    Public Sub conectar(ByVal CadConectarSql As String)
        cnDB = New SqlClient.SqlConnection
        cnDB.ConnectionString = CadConectarSql
        Try
            cnDB.Open()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Public Sub desconectar()
        cnDB.Close()
    End Sub

    Public Function conSelect(ByVal cadConsul As String) As DataTable
        Dim dtTabla As New DataTable
        Try
            cmDB = New SqlClient.SqlCommand(cadConsul, cnDB)
            dtTabla = New DataTable()

        Catch
            ' // MessageBox.Show(ex.Message);
        End Try
        Return dtTabla
    End Function

    Public Function conInsert(ByVal cadInsert As String) As DataTable
        Dim dtTabla As New DataTable
        Try
            cmDB = New SqlClient.SqlCommand(cadInsert, cnDB)
            cmDB.ExecuteNonQuery()
        Catch
            ' // MessageBox.Show(ex.Message);
        End Try
        Return dtTabla
    End Function
End Module

Para hacer uso de la conexión, en la clase form1 en el form1_load, hacemos uso del método conInsert para hacer un insert sobre la base de datos.

Para hacer un insert o un delete

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim CadConexion As String
       
      CadConexion = "User ID=sa;Initial Catalog=model;Data Source=SRV-      SERVIDOR\INSTANCIASQL2005;Password=xxxxxxx"
      Conexion.conectar(CadConexion)
      Conexion.conInsert("INSERT INTO dbo.tbHospital VALUES      ('HOS99','Prueba','Borrar 34')")

End Sub

O para una select

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim CadConexion As String     
Dim dt As New DataTable
Dim Valor As String

      CadConexion = "User ID=sa;Initial Catalog=model;DataSource=SRV-SERVIDOR\INSTANCIASQL2005;Password=xxxxxxx"

      Conexion.conectar(CadConexion)

Dim daDB As New SqlClient.SqlDataAdapter("SELECT * FROM dbo.tbHospital", Conexion.cnDB)

        daDB.Fill(dt)
        Valor = dt.Rows(2).Item(2)
        MessageBox.Show(Valor)
        Conexion.desconectar()
End Sub

O bien para conectar un Data grid a los resultados

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim CadConexion As String
Dim ds As New DataSet()

      CadConexion = "User ID=sa;Initial Catalog=model;Data       Source= SRV-SERVIDOR\INSTANCIASQL2005;Password= xxxxxxx"
      Conexion.conectar(CadConexion)

Dim daDB As New SqlClient.SqlDataAdapter("Select * From dbo.tbHospital", Conexion.cnDB)

      daDB.MissingSchemaAction = MissingSchemaAction.AddWithKey
      daDB.FillSchema(ds, SchemaType.Source, "Cust")
      daDB.Fill(ds, "Cust")

      DataGridView1.DataSource = ds
      DataGridView1.DataMember = "Cust"
       
End Sub

Explicación de la cadena de Conexión:

User ID=sa;  Usuario sa del SQL SERVER 2005
Initial Catalog=model;  Nombre de la Base de Datos
Data Source= SRV-SERVIDOR\INSTANCIASQL2005;  nombre de la instancia de SQL SERVER 2005
Password=xxxxxxx;  Password del sa del SQL SERVER 2005

En este enlace está la clase completa para conexión a base de datos.