sábado, 22 de junio de 2013

Creando Servicio Web con C# y Visual Studio 2012


Me disculpo porque ya tengo mucho tiempo de no escribir, pero  no es porque no lo desee sino porque no he tenido tiempo.
Hoy les quiero escribir acerca de cómo crear un  servicio web con Visual Studio y C#, como todas las demás publicaciones esto se hará de manera sencilla. Ok… entonces manos a la obra  :)

     Abrimos nuestro Visual Estudio


















              

  


Creamos  un nuevo proyecto en Visual Studio.





















Seleccionemos Framework 3.5









El proyecto debe de ser tipo Web Service Application.




Una vez que hemos dado un nombre al proyecto (en mi caso "miprimerservicio")  y hemos decido donde lo vamos a guardar, damos click en ok y no aparecerá  el proyecto generado y obtendremos  una pantalla como la siguiente.


En este archivo .cs es donde vamos a escribir el código que se ejecutara cuando alguien consuma nuestro servicio. Aquí escribimos C# común y silvestre  en nuestro caso vamos a escribir 4 métodos que inserten, actualicen, eliminen y seleccionen datos de una tabla. Para ello debemos  saber lo siguiente:

Tenemos un base de datos llamada Testing la cual posee una tabla llamada persona y esta a su vez tiene 4 campos los cuales son  idpersona  ( int, se auto-incrementa en 1), nombre  (nvarchar), apellido (nvarchar) y activo (true). En nuestra BD Testing tenemos 4 procedimientos almacenados que se encarga de insertar, actulizar, eliminar y seleccionar información de la tabla persona.

sp_delete_persona  -- Elimina una persona
sp_insert_persona  -- inserta una persona 
sp_select_persona  -– Selecciona las persona
sp_update_persona  -– Actualizan persona




Dentro de la clase publica escribimos los métodos

public class Service1 : System.Web.Services.WebService 
{

}
No olvidar importar las clase

using System.Data;
using System.Data.SqlClient;


VARIABLE PARA MANEJO DE ERROR
string error = "";

FUNCION PARA MANEJO DE LA CONEXION A SQLSERVER
private string conexion()
{
     string cadena = @"Data Source=.;Initial Catalog=TESTING;Integrated Security=True";
     return cadena;
}

/* El atributo WebMethod se asocia a un método Public
   para indicar que se desea exponer dicho método como
   parte del servicio Web XML.  */


//Método para insertar una fila en tabla persona
[WebMethod]
public string InsertRow(string wnombre, string wapellido, bool wactivo)
{
    SqlConnection conn = new SqlConnection(conexion());
    SqlCommand cmd = new SqlCommand("sp_insert_persona", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@wnombre", SqlDbType.NVarChar, 50).Value = wnombre;
    cmd.Parameters.Add("@wapellido", SqlDbType.NVarChar, 50).Value = wapellido;
    cmd.Parameters.Add("@wactivo", SqlDbType.Bit, 4).Value = wactivo;
    cmd.Parameters.Add("@msg", SqlDbType.NVarChar, 100).Direction = ParameterDirection.Output;
    try
    {
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
    }
    catch (System.Exception ex)
    {
                error = "Error: " + ex.Message;
     }
            return error;
}
//Método para actualizar una fila en tabla persona
[WebMethod]
public string UpdateRow(string wnombre, string wapellido, bool wactivo, int widpersona)
{
       wactivo = true;
       SqlConnection conn = new SqlConnection(conexion());
       SqlCommand cmd = new SqlCommand("sp_update_persona", conn);
       cmd.CommandType = CommandType.StoredProcedure;
       cmd.Parameters.Add("@wnombre", SqlDbType.NVarChar, 50).Value = wnombre;
       cmd.Parameters.Add("@wapellido", SqlDbType.NVarChar, 50).Value = wapellido;
       cmd.Parameters.Add("@wactivo", SqlDbType.Bit, 1).Value = wactivo;
       cmd.Parameters.Add("@widpersona", SqlDbType.Int, 10).Value = widpersona;
       cmd.Parameters.Add("@msg", SqlDbType.NVarChar, 100).Direction = ParameterDirection.Output;
       try
       {
            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
       }
       catch (System.Exception ex)
       {
                error = "Error: " + ex.Message;
       }
       return error;
}


//Método para eliminar una fila en tabla persona
[WebMethod]
public string DeleteRow(int widpersona)
{
      SqlConnection conn = new SqlConnection(conexion());
      SqlCommand cmd = new SqlCommand("sp_delete_persona", conn);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@widpersona", SqlDbType.Int, 10).Value = widpersona;
      cmd.Parameters.Add("@msg", SqlDbType.NVarChar, 100).Direction = ParameterDirection.Output;
      try
      {
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
      }
      catch (System.Exception ex)
      {
                error = "Error: " + ex.Message;
      }
       return error;
}
//Método para seleccionar una fila en tabla persona
[WebMethod]
public List<string> SelectRow()
{
       List<string> lista = new List<string>();
       SqlConnection conn = new SqlConnection(conexion());
       SqlCommand cmd = new SqlCommand("sp_select_persona", conn);
       cmd.CommandType = CommandType.StoredProcedure;
       cmd.Parameters.Add("@msg", SqlDbType.NVarChar, 100).Direction = ParameterDirection.Output;
       DataTable dt = new DataTable();
       SqlDataAdapter da = new SqlDataAdapter();
       da.SelectCommand = cmd;
       try
       {
               da.Fill(dt);
                foreach (DataRow dr in dt.Rows)
                {
                    lista.Add(dr["nombre"].ToString() + "--" + dr["apellido"].ToString());
                }
       }
       catch (System.Exception ex)
       {
                error = "Error: " + ex.Message;               
       }           
       return lista;

}

Una vez que tenemos listos los métodos no queda más que ejecutar el proyecto y  obtendremos un pantalla como la siguiente:



Y ya podemos probar los métodos de nuestro servicio web, si seleccionamos  insert nos pedirá datos para guardarlos en la BD.


Lo que obtendremos si probamos el método SelectRow  será un XML que nos estará regresando la información que le solicitamos.

Hasta aquí ya tenemos nuestro servicio web realizado, pero para que pueda ser consumido, deberemos publicarlo en nuestro IIS. Y esto lo veremos en nuestra próxima entrada.

Les dejos el código de los procedimientos almacenados por si quiere hacer la prueba… Saludos.



USE testing
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Osman Orozco>
-- Create date: <22/06/2013>
-- Description:   <inserta datos en tabla persona>
-- =============================================
if object_id('sp_insert_persona') is not null
begin
      drop procedure sp_insert_persona
end
go
create procedure sp_insert_persona @wnombre varchar(50),
                                                  @wapellido varchar(50),
                                                  @wactivo bit,
                                                  @msg as varchar(100) output
as
begin
      set nocount on;
      begin tran tadd
      begin try
                  insert into persona (nombre,apellido,activo) values (@wnombre,@wapellido,@wactivo)
            commit tran tadd
      end try
      begin catch
            set @msg = 'Error: ' + ERROR_MESSAGE() + ' en la linea ' + convert(nvarchar(255),ERROR_LINE()) + '.'
            rollback tran tadd
      end catch
end
go
-- ================================================
-- FIN SP INSERT
-- ================================================


-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Osman Orozco>
-- Create date:   <22/06/2013>
-- Description:   <Selecciona datos en tabla persona>
-- =============================================
if object_id('sp_select_persona') is not null
begin
      drop procedure sp_select_persona
end
go

create procedure sp_select_persona @msg as varchar(100) output
as
begin
      set nocount on;
      begin tran tadd
      begin try
            select * from persona
            commit tran tadd
      end try
      begin catch
            set @msg = 'Error: ' + ERROR_MESSAGE() + ' en la linea: ' + convert(nvarchar(255),ERROR_LINE()) + '.'
            rollback tran tadd
      end catch
end
go

-- ================================================
-- FIN SP SELECT
-- ================================================




-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Osman Orozco>
-- Create date: <22/06/2013>
-- Description:   <Actualiza datos en tabla persona>
-- =============================================
if object_id('sp_update_persona') is not null
begin
      drop procedure sp_update_persona
end
go
create procedure sp_update_persona @wnombre varchar(50),
                                                  @wapellido varchar(50),
                                                  @wactivo bit,
                                                  @widpersona int,    
                                                @msg as varchar(100) output
as
begin
      set nocount on;
      begin tran tadd
      begin try
            update persona set nombre=@wnombre,apellido=@wapellido,activo=@wactivo
            where idpersona=@widpersona
            commit tran tadd
      end try
      begin catch
            set @msg='Error: ' + ERROR_MESSAGE() + ' en la linea: '  + convert(nvarchar(255),ERROR_LINE()) + '.'
            rollback tran tadd
      end catch
end
go
-- ================================================
-- FIN SP UPDATE
-- ================================================

-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Osman Orozco>
-- Create date:  <22/06/2013>
-- Description:   <Elimina datos en tabla persona>
-- =============================================
if object_id('sp_delete_persona') is not null
begin
      drop procedure sp_delete_persona
end
go
create procedure sp_delete_persona @widpersona int,
                                                @msg as varchar(100) output
as
begin
      set nocount on;
      begin tran tadd
      begin try
            delete persona where idpersona=@widpersona
            commit tran tadd
      end try
      begin catch
            set @msg='Error: ' + ERROR_MESSAGE() + ' en la linea ' +  convert(nvarchar(255),ERROR_LINE()) + '.'
            rollback tran tadd
      end catch
end
go
-- ================================================
-- FIN SP ELIMINA DATO
-- ================================================

4 comentarios:

  1. una pregunta, que visual usas, tengo el ultimate

    ResponderEliminar
    Respuestas
    1. Tengo la misma version que vos... Visual Studio 2012 Ultimate.

      Eliminar
  2. Muchas Gracias Osman por compartir tu trabajo y tu valioso tiempo.,

    ResponderEliminar
  3. Hola buen dia muy bueno tu aporte, mi consulta es saber si tendras un ejemplo de listado dinamico con gridview usando WebService?

    ResponderEliminar