Control basado en CardSpace para ASP.NET

Hola ¿Qué tal?


En esta ocasión quiero comentarles que el equipo de .NET Framework acaba de liberar un nuevo control de CardSpace para ASP.NET.


Este control se utiliza con una sintaxis simple para integrar la funcionalidad de CardSpace en aplicaciones Web basadas en ASP.NET, además de tener marcadores claros e independientes del los formularios, soporta las imágenes de infocard y además se integra con el diseñador de Visual Studio.


La documentación del control es pequeña, lo que hace pensar que no es mucho lo que se tiene en cuanto propiedades, métodos y eventos, sin embargo, esto no quiere decir que esté limitado, dado que se basa en la funcionalidad de CardSpace para funcionar.


Si quieres obtenerlo y leer más acerca de este control, te recomiendo que vayas directamente al sitio de su creador y lo descargues. La liga es:

http://cardspace.netfx3.com/files/folders/tools-july-ctp/entry11307.aspx

Espero que sea de utilidad.


Saludos…


Octavio Telis

PodCast AS-IS Episodio No. 9: Podcast comunitario, sobre tecnologías de Microsoft

Hola ¿qué tal?


Pues en esta ocasión hemos producido un podcast en conjunto con Raúl Guerrero, Luis DuSolier y Octavio Telis, donde platicamos básicamente de tecnologías en general como un ejercicio para iniciar los podcasts comunitarios, como un esfuerzo inicial para dar inicio a más podcasts como este.


El episodio 9:


http://feeds.feedburner.com/~r/WebcastAs-is/~5/131961616/episodio09_09072007.mp3


La Suscripción al PodCast es con esta liga:


http://feeds.feedburner.com/WebcastAs-is


¿De qué hablamos?:

Silverlight
PopFly
SharePoint
Office Grove
Team Foundation Server
Surface
MultiPoint
AJAX
Windows Server 2008
Sql Server 2008

Este podcast será publicado en :


Podcast de Superneurona:  http://podcast.superneurona.com

Podcast de Sharepoint Mexico:  http://sharepoint.com.mx

Las ligas sobre los temas de los que hemos hablado:

Silverlight: www.microsoft.com/silverlight

Popfly: www.popfly.ms

Sql Server 2008: http://www.microsoft.com/sql/prodinfo/futureversion/default.mspx
ASP.NET AJAX:  http://ajax.asp.net/
Office System: http://office.microsoft.com
Visual Studio: http://www.microsoft.com/vs

Blog de Jaime Sánchez:
http://blogs.msdn.com/jaimesb/
http://blogs.msdn.com/jaimesb/archive/2007/06/20/iluminando-el-web-con-silverlight.aspx
http://blogs.msdn.com/jaimesb/archive/2007/06/21/fundamentos-de-silverlight.aspx


Video de Steve Hodges de Microsoft Research  en Youtube sobre dispositivos multipoint
http://www.youtube.com/watch?v=ulwA3n8AYM0

Microsoft Surface
http://www.microsoft.com/surface/


Microsoft MultiPoint
http://imaginecup.com/multipoint/default.aspx
http://www.microsoft.com/downloads/details.aspx?FamilyID=a137998b-e8d6-4fff-b805-2798d2c6e41d&DisplayLang=en



Pues bien, espero que disfruten mucho este episodio, el cual será el número 9 para Podcast AS-IS.


Saludos…


Octavio Telis


Nota: El tema musical utilizado en este podcast y en los demás es Japan del disco Gravity de Kenny G, pueden adquirir sus discos desde www.kennyg.com

Utilidades de Sql Server con ADO.NET – Obtener el valor actual de un campo Identity de una tabla

Hola ¿Qué tal?


Continuando con la serie de utilidades de SQL Server utilizando ADO.NET, toca el turno a una utilidad interesante, esta utilidad nos permitirá consultar el valor actual del campo identity de una tabla.


Obtener el Valor Actual del Campo Identity de una Tabla con T-SQL


Desde T-SQL podemos consultar el valor actual de campo identity de una tabla con la función IDENT_CURRENT, la cual recibe como parámetro el nombre de la tabla. El siguiente ejemplo muestra el uso de esta función:

Use AdventureWorks
Select IDENT_CURRENT(‘Person.Contact’)

El resultado que se muestra es el valor identity actual, que es el último valor de la semilla asignado al campo identity, no hay que confundir el valor del campo identity en el último registro con el valor actual de la semilla de Identity. Esto es, si se captura un nuevo registro cuyo valor Identity es 7 y se borra después, el valor 7 se conservará como el último asignado por Identity a la columna aunque el valor de la misma columna en el último registro no sea el mismo, por lo que podemos asegurar que el siguiente valor será el valor actual de identity + 1 o más el valor del incremento de la semilla, sin embargo, no se puede aseverar que el valor actual del último registro en el campo identity sea el valor que devuelve IDENT_CURRENT pues pueden haberse eliminado el último registro que tomó ese valor.  Hay que tener cuidado con eso, aunque se utiliza más para predecir el próximo valor más que para consultar el valor actual del campo.


Obtener el Valor Actual del Campo Identity de una Tabla con ADO.NET


Ahora bien, será algo sencillo llevar esta utilidad al .NET, simplemente tendremos que utilizar lo que ya hemos utilizado anteriormente en las publicaciones de la serie de utilidades de SQL Server con ADO.NET.


Este método se considera como parte de la clase que estamos construyendo, a la cual he denominado SqlUtilities.


El siguiente ejemplo muestra el código como quedaría de nuestro método para obtener el identity actual.


VB.NET

Public Function GetCurrentIdentity( _
        ByVal TableName As String) As Integer

    ‘Declaramos un SqlCommand para ejecutar la consulta
    Dim cmd As SqlCommand = _
        New SqlCommand(“Select IDENT_CURRENT(@TableName)”)
    ‘Agregamos los parámetros necesarios para la consulta
    cmd.Parameters.Add(“@TableName”, _
            SqlDbType.VarChar, 250).Value = TableName
    ‘Asignamos un objeto connection a nuestro command
    cmd.Connection = cnn
    ‘Intentaremos ejecutar la consulta
    Try
        ‘Abrimos la conexión
        cnn.Open()
        ‘Capturamos el resultado de la consulta
        ‘escalar en una variable
        Dim res As Object = cmd.ExecuteScalar()
        ‘Analizamos si el valor devuelto es bueno
        If res Is System.DBNull.Value Then
            ‘Si no hubo resultados
            ‘devolvemos -1
            Return -1
        Else
            ‘Devolvemos el valor del resultado
            Return CType(res, Integer)
        End If
    Catch ex As SqlException
        ‘Capturamos el error
        mMessages = ex.Message
    Finally
        ‘Se cierra la conexión
        cnn.Close()
    End Try
    ‘Si llega aquí es porque hubo error
    ‘Se devuelve -1
    Return -1
End Function

C#
public int GetCurrentIdentity(string TableName)
{
    //Declaramos un SqlCommand para ejecutar la consulta
    SqlCommand cmd =
        new SqlCommand(“Select IDENT_CURRENT(@TableName)”);
    //Agregamos los parámetros necesarios para la consulta
    cmd.Parameters.Add(“@TableName”,
        SqlDbType.VarChar, 250).Value = TableName;
    //Asignamos un objeto connection a nuestro command
    cmd.Connection = cnn;
    //Intentaremos ejecutar la consulta
    try
    {
        //Abrimos la conexión
        cnn.Open();
       //Capturamos el resultado de la consulta
        //escalar en una variable
        object res = cmd.ExecuteScalar();
        //Analizamos si el valor devuelto es bueno
        if (res == System.DBNull.Value)
            //Si no hubo resultados
            //devolvemos -1
            return -1;
        else
        {
            //Devolvemos el valor del resultado
            return Convert.ToInt32(res);
        }
    }
    catch (SqlException ex)
    {
        //Capturamos el error
        messages = ex.Message;
    }
    finally
    {
        //Se cierra la conexión
        cnn.Close();
    }
    //Si llega aquí es porque hubo error
    //Se devuelve -1
    return -1;
}

Bien, con esto terminamos el ejemplo, lo cual nos deja el método para obtener el valor actual del Identity de nuestra tabla. Para los valores en que no hay resultados, devolvemos -1 como indicador de que no hay un valor identity en la tabla.


Conclusiones


Solo puede haber un campo Identity por tabla  por lo que solo podemos obtener un resultado, existen otras dos maneras de obtener el valor de un identity, una es con la variable de sistema las cuales con @@IDENTITY y SCOPE_IDENTITY, la primera depende de la sesión en que se realiza la consulta, solo tiene valor en la sesión en que se utiliza pero depende de un insert antes para tener un valor, la segunda depende del alcance de la ejecución. La manera que utilizamos es independiente del alcance y de la sesión por lo que devolverá el valor actual en cualquier momento.


Bueno, pues espero que les sea de utilidad y nos vemos en la próxima.


Saludos…


Octavio Telis

Utilidades de Sql Server con ADO.NET – Consultar la opción de acceso de una base de datos

Hola ¿Qué tal?…


Continuando con la serie de utilidades de Sql Server con ADO.NET, llega a escena una herramienta que nos proporcionará un mecanismo para poder consultar algunas opciones de la base de datos, en particular revisaremos la opción de acceso de la base de datos.


Consultar el modo de acceso de usuario de una base de datos de SQL Server con T-SQL


En la consola de T-SQL podremos verificar el modo de acceso a la base de datos utilizaremos una consulta a la vista Sys.Databases, en específico será al campo User_Access_Desc condicionando el valor del campo Name al nombre de la base de datos en cuestión. El siguiente ejemplo muestra el uso de esta consulta:

Select User_Access_Desc
From sys.databases
Where [Name] = ‘AdventureWorks’

Con esto tendrémos el valor de la opción de acceso de usuario a nuestra base de datos. Ahora veremos cómo integrarlo a nuestra clase SqlUtilities.


Consultar el modo de acceso de usuario de una base de datos de SQL Server con ADO.NET


En nuestra clase SqlUtilities agregarémos un método que nos devuelva el modo de acceso de usuario de nuestra base de datos, será simple aunque habrá que prestar atención al uso del método ExecuteScalar de SqlCommand con el que obtendremos únicamente el valor que queremos conocer, la consulta se ha hecho de tal manera que solo devuelva un campo para facilitar la ejecución del método.


El siguiente ejemplo muestra cómo se genera esta consulta con ADO.NET:


VB.NET

Public Function GetCurrentDbUserAccessOption() _
    As String

    ‘Definimos la variable y la inicializamos
    ‘con la consulta
    Dim cmd As SqlCommand = _
        New SqlCommand(“Select User_Access_Desc “ & _
                       “From sys.databases “ & _
                       “Where [Name] = @Database”)

    ‘Agregamos los parámetros utilizados en la
    ‘consulta
    cmd.Parameters.Add( _
    “@Database”, SqlDbType.VarChar, 150).Value = cnn.Database
    ‘Asignamos la conexión a la variable
    ‘cmd
    cmd.Connection = cnn

    ‘Intentamos la consulta
    Try
        ‘Abrimos la conexión
        cnn.Open()
        ‘Ejecutamos la consulta y devolvemos el resultado
        Return cmd.ExecuteScalar().ToString()
        mMessages = “La consulta se ejecutó con éxito.”
    Catch ex As SqlException
        mMessages = ex.Message
    Finally
        cnn.Close()
    End Try
    Return “No se ejecutó la consulta, revise los mensajes de error.”
End Function

C#

public string GetCurrentDbUserAccessOption()
{
    //Definimos la variable y la inicializamos
    //con la consulta
    SqlCommand cmd =
        new SqlCommand(“Select User_Access_Desc “ +
                       “From sys.databases “ +
                       “Where [Name] = @Database”);
    //Agregamos los parámetros utilizados en la
    //consulta
    cmd.Parameters.Add(
    “@Database”, SqlDbType.VarChar, 150).Value = cnn.Database;
    //Asignamos la conexión a la variable
    //cmd
    cmd.Connection = cnn;
    //Intentamos la consulta
    try
    {
        //Abrimos la conexión
        cnn.Open();
        //Ejecutamos la consulta y devolvemos el resultado
        return cmd.ExecuteScalar().ToString();
        messages = “La consulta se ejecutó con éxito.”;
    }
    catch (SqlException ex)
    {
        messages = ex.Message;
    }
    finally
    {
        cnn.Close();
    }
    return “No se ejecutó la consulta, revise los mensajes de error.”;
}

Con esto podremos obtener información del modo de acceso de usuario de nuestra base de datos.


Referencias de esta Publicación

Esta publicación forma parte de la Serie 2 de la colección Utilidades de SQL Server con ADO.NET

Indice de publicaciones que conforman la Serie II:

Serie II Parte I: Diagnosticar y Reparar Tablas de una Base de Datos (http://msmvps.com/blogs/otelis/archive/2007/06/22/utilidades-de-sql-server-con-ado-net-diagnosticar-y-reparar-tablas.aspx)

Serie II Parte II: Cambiar la opción de acceso de una base de datos (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-cambiar-la-opci-243-n-de-acceso-de-una-base-de-datos.aspx)

Serie II Parte III: Consultar la opción de acceso de una base de datos (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-consultar-la-opci-243-n-de-acceso-de-una-base-de-datos.aspx


Referencias Adicionales


Con esto terminamos nuestro recorrido por esta utilidad, si tienes alguna duda o comentario no dudes en dejarme tus comentarios. Las referencias de este tema las pongo a continuación:


DBCC CHECKTABLE
http://msdn2.microsoft.com/en-us/library/ms174338.aspx

ALTER TABLE
http://msdn2.microsoft.com/en-us/library/ms190273.aspx

sys.databases
http://msdn2.microsoft.com/en-us/library/ms178534.aspx

Primera entrega de SqlUtilities
http://msmvps.com/blogs/otelis/archive/2007/06/19/utilidades-de-sql-server-con-ado-net-regenerar-campos-identity.aspx

Bien, pues espero que sea de utilidad.


Saludos…


Octavio Telis

Utilidades de Sql Server con ADO.NET – Cambiar la opción de acceso de una base de datos

Hola ¿Qué tal?…


Continuando con la serie de utilidades de Sql Server con ADO.NET, llega a escena una herramienta que nos proporcionará la manera de cambiar las opciones de la base de datos, en particular cambiar la opción de acceso de los usuarios, donde podrá ser Multiusuario o de un único usuario. Esto es útil para cuando se requieren realizar tareas de mantenimiento en la base de datos, comúnmente se solicita que al base de datos esté en Single_User, sin embargo, no solo será cambiar de Multi_User a Single_User, sino también de regreso, ya que dejar una base de datos como Single_User sería caótico para la aplicación que la consume.


Cambiar la configuración de una base de datos de Multi User a Single User y viceversa con T-SQL


Esta publicación está enfocada a SQL Server 2005 por ser la versión vigente de SQL Server, por lo que la manera de cambiar la configuración de la base de datos se realizará con Alter Database, en las versiones anteriores se utiliza un procedimiento almacenado denominado sp_dboption, aquí no cubriré el uso de este procedimiento almacenado ya que ha entrado en etapa de obsolescencia, así pues veremos la manera actual, que únicamente funciona con bases de datos de SQL Server 2005.


Las opciones que utilizaremos son MULTI_USER y SINGLE_USER. Al crear una base de datos se crea con la opción del segmento “db_user_access_option” asignada a MULTI_USER, esta opción permitirá que múltiples usuarios utilicen la base de datos, sin embargo, en ocasiones en las que se deben realizar tareas de reparación sobre la base de datos se requiere que esta tenga asignada la opción SINGLE_USER. En las bases de datos de SQL Server 2005 se cuenta con la capacidad de asignar estas opciones a través de la instrucción ALTER DATABASE. En el siguiente ejemplo mostraré como realizar estos cambios con T-SQL:

– Cambia la opción de acceso de usuario de la base de datos
– a SINGLE_USER revertiendo todas las transacciones
Alter Database AdventureWorks set SINGLE_USER With ROLLBACK IMMEDIATE

– Cambia la opción de acceso de usuario de la base de datos
– a MULTI_USER revertiendo todas las transacciones
Alter Database AdventureWorks set MULTI_USER With ROLLBACK IMMEDIATE

Estas opciones se deben cambiar solo de ser necesario para tareas donde la base de datos debe estar en modo de usuario único, una vez terminadas estas tareas se deberá regresar la base de datos a modo de usuario múltiple porque de otra manera, la base de datos solo podrá ser accedida por un único usuario a la vez.


Bien, con esto definimos las instrucciones que utilizaremos en nuestros métodos de utilidades para nuestra clase SqlUtilities.


Cambiar la configuración de una base de datos de Multi User a Single User y viceversa con ADO.NET


En esta sección haremos el método que permitirá modificar la propiedad del modo de acceso a la base de datos. Tal vez modifiquemos este método más adelante o tal vez no, ¿a qué me refiero?, pues en ocasiones será conveniente tener un método único para modificar propiedades de la base de datos, sin embargo, en Sql Server 2005 hay cierto tratamiento con las propiedades de la base de datos que hacen un poco complicado su tratamiento, veremos qué tanto se puede poner en un solo método y lo que tenga un tratamiento especial estará en métodos independientes.


Para el caso en específico de cambiar el modo de acceso de la base de datos, utilizaremos un enumerador que será declarado fuera de la clase SqlUtilities pero que estará dentro del mismo namespace que dicha clase. El enumerador se muestra en el siguiente ejemplo:


VB.NET

Public Enum DBUserAccessOption
    SINGLE_USER
    RESTRICTED_USER
    MULTI_USER
End Enum

C#

public enum DBUserAccessOption
{
    SINGLE_USER,
    RESTRICTED_USER,
    MULTI_USER
}

Este enumerador agrega una opción más: RESTRICTED_USER, el comportamiento en el código es el mismo que SINGLE_USER, solo que estará restringido el acceso a usuarios que tengan la función fija  en la base de datos de db_owner y los usuarios con las funciones fijas de servidor de dbcreator y sysadmin.


Una vez definido el enumerador procedemos a definir el método que nos ayudará a cambiar el modo en que se conectan a la base de datos los usuarios. Veamos en el siguiente ejemplo cómo quedará nuestro método:

VB.NET

Public Sub ChangeDbUserAccessOption( _
    ByVal DBUserAccessOption As DBUserAccessOption)

    ‘Se declaran la variables a utilizar
    Dim cmd As SqlCommand = New SqlCommand( _
           “ALTER DATABASE “ & cnn.Database & _
           ” SET “ & DBUserAccessOption.ToString() & _
           ” WITH ROLLBACK IMMEDIATE”)

   ‘Se asigna la conexión al command
    cmd.Connection = cnn

    ‘Se intentará la ejecución del código
    Try
        ‘Se abre la conexión
        cnn.Open()
        ‘Se ejecuta la instrucción
        cmd.ExecuteNonQuery()
        mMessages = _
          “Se cambió la opción de acceso con éxito”
    Catch ex As Exception

        ‘Se capturan los mensajes de error
        mMessages = ex.Message
    Finally
        ‘se cierra la conexión
        cnn.Close()
    End Try
End
Sub

C#

public void ChangeDbUserAccessOption(
    DBUserAccessOption DBUserAccessOption)
{
    //Se declaran la variables a utilizar
    SqlCommand cmd = new SqlCommand(
          “ALTER DATABASE “ + cnn.Database +
          ” SET “ + DBUserAccessOption.ToString() +
        
 ” WITH ROLLBACK IMMEDIATE”);

    //Se asigna la conexión al command
    cmd.Connection = cnn;

    //Se intentará la ejecución del código
    try
    {
        //Se abre la conexión
        cnn.Open();
        //Se ejecuta la instrucción
        cmd.ExecuteNonQuery();
        messages =
          “Se cambió la opción de acceso con éxito”;
    }
    catch (SqlException ex)
    {
        //Se capturan los mensajes de error
        messages = ex.Message;
    }
    finally
    {
        //se cierra la conexión
        cnn.Close();
    }
}

Esta instrucción no desencadena el evento InfoMessage del objeto cnn, por lo que agregamos un mensaje indicando que la operación se llevó a cabo con éxito.


Este método nos deja con una necesidad… saber qué opción de acceso tiene actualmente nuestra base de datos, lo cual justifica la siguiente publicación.


Referencias de la Publicación

 Esta publicación forma parte de la Serie 2 de la colección Utilidades de SQL Server con ADO.NET

Indice de publicaciones que conforman la Serie II:

Serie II Parte I: Diagnosticar y Reparar Tablas de una Base de Datos (http://msmvps.com/blogs/otelis/archive/2007/06/22/utilidades-de-sql-server-con-ado-net-diagnosticar-y-reparar-tablas.aspx)

Serie II Parte II: Cambiar la opción de acceso de una base de datos (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-cambiar-la-opci-243-n-de-acceso-de-una-base-de-datos.aspx)

Serie II Parte III: Consultar la opción de acceso de una base de datos (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-consultar-la-opci-243-n-de-acceso-de-una-base-de-datos.aspx)
 

Referencias Adicionales


Con esto terminamos nuestro recorrido por esta utilidad, si tienes alguna duda o comentario no dudes en dejarme tus comentarios. Las referencias de este tema las pongo a continuación:

DBCC CHECKTABLE
http://msdn2.microsoft.com/en-us/library/ms174338.aspx

ALTER TABLE
http://msdn2.microsoft.com/en-us/library/ms190273.aspx

sys.databases
http://msdn2.microsoft.com/en-us/library/ms178534.aspx


Primera entrega de SqlUtilities
http://msmvps.com/blogs/otelis/archive/2007/06/19/utilidades-de-sql-server-con-ado-net-regenerar-campos-identity.aspx


Bien, pues espero que sea de utilidad.


Saludos…


Octavio Telis

Utilidades de Sql Server con ADO.NET – La Clase SqlUtilities

Hola ¿Qué tal?…

En esta ocasión vamos a integrar todo lo que vimos en la Serie I de la colección de publicaciones denominada Utilidades de SQL Server con ADO.NET.

Aquí se muestra la parte fundamental de la clase denominada SqlUtilities quien será la que contenga todos los métodos que se describen en las publicaciones de la colección denominada Utilidades de SQL Server con ADO.NET.

Esta es la cuarta parte de la serie I de Utilidades de SQL Server con ADO.NET

La Clase SqlUtilities (Putting All Together)

Bien, creo que lo que tenía que explicarse se ha explicado, aunque un poco rápido y utilizando nuestro ejemplo, sin embargo, tenemos ahora conocimiento de más clases de SqlClient.

En resumen hemos visto el uso del evento InfoMessage de la clase SqlConnection que nos sirve para obtener información del servidor y también la clase SqlConnectionStringBuilder que nos sirve para construir y descomponer cadenas de conexión.

En esta parte pondré el código de lo que será nuestra clase de utilidades de SQL, tengan presente esta clase para las próximas publicaciones sobre utilidades de SQL, ya que con cada publicación se estará entregando una nueva utilidad para esta clase, así, con el tiempo podremos tener una clase con bastantes utilidades basada en DBCC.

Por favor, ubiquen los trozos de código que he puesto en cada sección dentro de la clase, así podrán ver la utilización de cada concepto de manera integrada.

Sin más preámbulo, aquí les dejo el código completo:

VB.NET

Public Class SqlUtilities
    Private cnn As SqlConnection
    Private mMessages As String
    Public Sub New(ByVal pServer As String, _
            ByVal pDatabase As String, _
            ByVal pUserId As String, _
            ByVal pPassword As String)

        Dim strCnn As SqlConnectionStringBuilder = _
            New SqlConnectionStringBuilder()

        strCnn.DataSource = pServer
        strCnn.InitialCatalog = pDatabase
        strCnn.UserID = pUserId
        strCnn.Password = pPassword
        strCnn.IntegratedSecurity = (pUserId.Trim() = “”)
        cnn = New SqlConnection(strCnn.ConnectionString)
        AddHandler cnn.InfoMessage, AddressOf cnn_InfoMessage
    End Sub

    Public Sub CheckIdent(ByVal Table As String, _
            ByVal Reseed As Boolean)

        ‘Se declaran la variables a utilizar
        Dim cmd As SqlCommand = New SqlCommand()
        Dim strSql As String
        ‘Se elige la instrucción a utiliar en base
        ‘al parámetro Reseed
        If Reseed Then
            strSql = “DBCC CHECKIDENT(@Table,RESEED)”
        Else
            strSql = “DBCC CHECKIDENT(@Table,NORESEED)”
        End If
        ‘Se asigna el valor de la cadena de consulta al command
        cmd.CommandText = strSql
        ‘Se agregan el parámetro @Table para identificar la tabla
        cmd.Parameters.Add(“@Table”, _
                SqlDbType.VarChar, 150).Value = Table
        ‘Se asigna la conexión al command
        cmd.Connection = cnn
        ‘Se intentará la ejecución del código
        Try
            ‘S
e abre la conexión
            cnn.Open()
            ‘Se ejecuta la instrucción
            cmd.ExecuteNonQuery()
        Catch ex As Exception
            ‘Se capturan los mensajes de error
            mMessages = ex.Message
        Finally
            ‘se cierra la conexión
            cnn.Close()
        End Try
    End Sub

    Public Sub CheckIdent(ByVal Table As String, _
                ByVal NewReseedValue As Integer)

        ‘Se declaran la variables a utilizar
        Dim cmd As SqlCommand = _
            New SqlCommand( _
            “DBCC CHECKIDENT(@Table,RESEED,@NewReseedValue)”)

        ‘Se agregan los parámetros @Table y @NewReseedValue
        cmd.Parameters.Add(“@Table”, _
                SqlDbType.VarChar, 150).Value = Table
        cmd.Parameters.Add(“@NewReseedValue”, _
                SqlDbType.Int).Value = NewReseedValue
        ‘Se asigna la conexión al command
        cmd.Connection = cnn
        ‘Se intentará la ejecución del código
        Try
            ‘Se abre la conexión
            cnn.Open()
            ‘Se ejecuta la instrucción
            cmd.ExecuteNonQuery()
        Catch ex As Exception
            ‘Se capturan los mensajes de error
            mMessages = ex.Message
        Finally
            ‘se cierra la conexión
            cnn.Close()
        End Try
    End Sub

    Private Sub cnn_InfoMessage(ByVal sender As Object,
        ByVal e As System.Data.SqlClient.SqlInfoMessageEventArgs)

        mMessages = e.Message

    End Sub

    Public ReadOnly Property Messages() As String
        Get
            Return mMessages
        End Get
    End Property
End
Class

C#

public class SqlUtilities
{
    private SqlConnection cnn;
    private string messages;
    public SqlUtilities(string pServer,
        string pDataBase,
        string pUserId,
        string pPassword)
    {
        SqlConnectionStringBuilder strCnn =
            new SqlConnectionStringBuilder();
        strCnn.DataSource = pServer;
        strCnn.InitialCatalog = pDataBase;
        strCnn.UserID = pUserId;
        strCnn.Password = pPassword;

        strCnn.IntegratedSecurity = pUserId.Trim() == “”;

        cnn = new SqlConnection(strCnn.ConnectionString);
        cnn.InfoMessage +=
            new SqlInfoMessageEventHandler(cnn_InfoMessage);
    }

    public void CheckIdent(string Table, bool Reseed)
    {
        //Se declaran la variables a utilizar
        SqlCommand cmd = new SqlCommand();
        String strSql;
        //Se elige la instrucción a utiliar en base
        //al parámetro Reseed
        if (Reseed)
            strSql = “DBCC CHECKIDENT(@Table,RESEED)”;
        else
            strSql = “DBCC CHECKIDENT(@Table,NORESEED)”;
        //Se asigna el valor de la cadena de consulta al command
        cmd.CommandText = strSql;
        //Se agregan el parámetro @Table para identificar la tabla
        cmd.Parameters.Add(“@Table”,
            SqlDbType.VarChar, 150).Value = Table;
       
//Se asigna la conexión al command
        cmd.Connection = cnn;
        //Se intentará la ejecución del código
        try
        {
            //Se abre la conexión
            cnn.Open();
            //Se ejecuta la instrucción
            cmd.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            //Se capturan los mensajes de error
            messages = ex.Message;
        }
        finally
        {
            //se cierra la conexión
            cnn.Close();
        }
    }

    public void CheckIdent(string Table, int NewReseedValue)
    {
        //Se declaran la variables a utilizar
        SqlCommand cmd = new SqlCommand(
            “DBCC CHECKIDENT(@Table,RESEED,@NewReseedValue)”);

        //Se agregan los parámetros @Table y @NewReseedValue
        cmd.Parameters.Add(“@Table”,
            SqlDbType.VarChar, 150).Value = Table;
        cmd.Parameters.Add(“@NewReseedValue”,
            SqlDbType.Int).Value = NewReseedValue;
        //Se asigna la conexión al command
        cmd.Connection = cnn;
        //Se intentará la ejecución del código
        try
        {
            //Se abre la conexión
            cnn.Open();
            //Se ejecuta la instrucción
            cmd.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            //Se capturan los mensajes de error
            messages = ex.Message;
        }
        finally
        {
            //se cierra la conexión
            cnn.Close();
        }
    }

    private void cnn_InfoMessage(object sender,
        SqlInfoMessageEventArgs e)
    {
        messages = e.Message;
    }

    public string Messages
    {
        get
        {
            return messages;
        }
    }
}

Noten que el método CheckIdent tiene una sobrecarga, esta sobrecarga es la que sirve para regenerar la semilla del campo Identity a valor definido en NewReseedValue.

Hemos utilizado parámetros para los valores que son variables, como lo vimos en la publicación de parámetros de SqlCommand y Variablese de Sql Server.  Utilizamos la conexión como lo definimos en la publicación Conexión de Datos con ADO.NET, aquí abajo pongo las referencias.

Bien, solo resta mostrar los ejemplos de uso:

VB.NET

Dim sqlUtil As SqlUtilities = _
    New SqlUtilities(“(LOCAL)”, “AdventureWorks”, “”, “”)
sqlUtil.CheckIdent(“Production.Product”, False)
MessageBox.Show(sqlUtil.Messages)

C#

SqlUtilities sqlUtil =
    new SqlUtilities(“(LOCAL)”, “AdventureWorks”, “”, “”);
sqlUtil.CheckIdent(“Production.Product”, false);
MessageBox.Show(sqlUtil.Messages);

Con esto terminamos el día de hoy, próximamente estaré publicando otras utilidades para ir haciendo grande esta clase y que vaya siendo una gran herramienta en nuestras aplicaciones o en la administración de nuestras bases de datos. El formato será el mismo, iremos agregando nuevos métodos a nuestra clase.

Esta es la última parte de la Serie I, y es la referencia para ver cómo está nuestra clase SqlUtilities.

Esta publicación forma parte de la Serie 1 de la colección Utilidades de SQL Server con ADO.NET

Indice de publicaciones que conforman la Serie I:

Serie I Parte I: Regeneración de Campos Identity (http://msmvps.com/blogs/otelis/archive/2007/06/19/utilidades-de-sql-server-con-ado-net-regenerar-campos-identity.aspx)

Serie I Parte II: Obtener Información de ejecución del Servidor SQL Server (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-obtener-informaci-243-n-de-ejecuci-243-n-del-servidor-sql-server-con-ado-net.aspx)

Serie I Parte III: Uso de SqlConnectionStringBuilder para construir la cadena de conexión para SqlConnection (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-uso-de-sqlconnectionstringbuilder.aspx)

Serie I Parte IV: La Clase SqlUtilities (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net.aspx)

 

Referencias:

Parámetros de SQL Server en ADO.NET:

http://msmvps.com/blogs/otelis/archive/2007/06/04/par-225-metros-de-sqlcommand-y-las-variables-de-sql-server.aspx

Conexión de Datos Con ADO.NET:
http://msmvps.com/blogs/otelis/archive/2007/06/01/conexi-243-n-de-datos-con-ado-net.aspx

Espero que sea de utilidad.

Saludos…

Octavio Telis

Utilidades de Sql Server con ADO.NET – Uso de SqlConnectionStringBuilder

Hola ¿Qué Tal?…


En esta ocasión veremos cómo construir una cadena de conexión a partir del SqlStringBuilder para asignarla a un SqlConnection.


Esta es la tercera parte de la serie I de la colección Utilidades de SQL Server con ADO.NET


Uso de SqlConnectionStringBuilder para construir la cadena de conexión para SqlConnection


Una de las clases nuevas en el .NET Framework 2.0 es SqlConnectionStringBuilder, que nos sirve para construir nuestras cadenas de conexión para ser utilizadas con los objetos basados en SqlConnection. El uso es simple y tiene dos sentidos, el primero es que se puede construir a partir de una cadena de conexión con lo cual se descompone en los elementos de la cadena como Servidor, base de datos, Id de Usuario, contraseña, si es autenticación integrada, etc. El segundo sentido es que a partir de la asignación las propiedades del objeto se obtiene una cadena de conexión válida para iniciar sesión en un servidor SQL Server.


En nuestro ejemplo utilizaremos el segundo sentido, ya que deseamos construir una cadena de conexión válida en base a los datos que tenemos de nuestro servidor, de esta manera, podremos intuir si la cadena utiliza autenticación integrada o no basándonos en el criterio del usuario, así es, si no se define un UserId, podemos inferir de manera atrevida que se está intentando iniciar la sesión con autenticación integrada, ya que si pasamos el valor del usuario en blanco será seguro que el servidor rechace el inicio de sesión por no contar con inicios de sesión en blanco. Bien, veamos esto en el siguiente ejemplo:


VB.NET

Dim strCnn As SqlConnectionStringBuilder = _
    New SqlConnectionStringBuilder()

strCnn.DataSource = pServer
strCnn.InitialCatalog = pDatabase
strCnn.UserID = pUserId
strCnn.Password = pPassword
strCnn.IntegratedSecurity = (pUserId.Trim() = “”)

C#

SqlConnectionStringBuilder strCnn =
    new SqlConnectionStringBuilder();

strCnn.DataSource = pServer;
strCnn.InitialCatalog = pDataBase;
strCnn.UserID = pUserId;
strCnn.Password = pPassword;
strCnn.IntegratedSecurity = pUserId.Trim() == “”;

En ejemplo estoy utilizando algunas variables que no se ven declaradas, estas variables son variables de parámetros que contienen información de los parámetros de un constructor de clase que podrán ver más adelante cuando pongamos todo junto.


Noten el uso de la expresión asignada a la propiedad IntegratedSecurity, está evaluando la condición de la variable pUserId, donde si es una cadena vacía se inferirá que IntegratedSecurity es true. Bien, pueden notar las propiedades del objeto strCnn estas propiedades son las que contienen los valores de la cadena de conexión, si utilizamos la otra sobrecarga del constructor de SqlConnectionStringBuilder, el cual recibe un string como parámetro que representa una cadena de conexión válida para SqlConnection, se descompondrá el parámetro y se les dará valor a cada una de estas propiedades.


Para ver la aplicación de esta manera de utilizar el SqlConnectionStringBuilder en forma, consulta la última parte de esta serie de publicaciones.

Esta publicación forma parte de la Serie 1 de la colección Utilidades de SQL Server con ADO.NET

Indice de publicaciones que conforman la Serie I:


Serie I Parte I: Regeneración de Campos Identity (http://msmvps.com/blogs/otelis/archive/2007/06/19/utilidades-de-sql-server-con-ado-net-regenerar-campos-identity.aspx)


Serie I Parte II: Obtener Información de ejecución del Servidor SQL Server (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-obtener-informaci-243-n-de-ejecuci-243-n-del-servidor-sql-server-con-ado-net.aspx)


Serie I Parte III: Uso de SqlConnectionStringBuilder para construir la cadena de conexión para SqlConnection (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-uso-de-sqlconnectionstringbuilder.aspx)


Serie I Parte IV: La Clase SqlUtilities (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net.aspx)


 


Referencias:

Parámetros de SQL Server en ADO.NET:

http://msmvps.com/blogs/otelis/archive/2007/06/04/par-225-metros-de-sqlcommand-y-las-variables-de-sql-server.aspx

Conexión de Datos Con ADO.NET:

http://msmvps.com/blogs/otelis/archive/2007/06/01/conexi-243-n-de-datos-con-ado-net.aspx


Espero sea de utilidad.


Saludos…


Octavio Telis

Utilidades de Sql Server con ADO.NET – Obtener Información de ejecución del Servidor SQL Server con ADO.NET

Hola ¿Qué tal?

En esta ocasión vamos a hablar de cómo obtener información del servidor a través del evento InfoMessage que lanza un objeto del tipo SqlConnection al ejecutarse alguna instrucción con un objeto del tipo SqlCommand que tenga asignado un SqlConnection.

Esta es la segunda parte de la serie I de la colección Utilidades de SQL Server con ADO.NET.

Obtener Información de ejecución del Servidor SQL Server con ADO.NET

Como mostré en la primera parte de este artículo, el servidor al ejecutar las instrucciones de DBCC no devuelve un conjunto de registros sino un mensaje que informa de lo sucedido en la ejecución. Para poder obtener esta información y cualquier información del servidor cuando se ejecutan instrucciones a través de una conexión de SqlClient , se debe captar un evento de la conexión definido como InfoMessage.

En nuestro ejemplo tendremos que agregar el delegado al objeto cnn después de haberlo instanciado, con lo cual podremos “cachar” los mensajes del servidor. Esto es útil para dar informes de lo que sucede en ejecuciones como las que estaremos realizando con DBCC.

Así pues, consideremos que se ha declarado una variable cnn del tipo SqlConnection, además consideraremos que ya se ha instanciado, teniendo en cuenta esto podré mostrar la manera de agregar este evento, el ejemplo responde a las necesidades de nuestro ejemplo, por lo que verán la variable message (mMessage en el código de VB.NET), misma que será utilizada en una propiedad de la clase final. Veamos primeramente cómo se asigna el delegado del evento InfoMessage del objeto cnn:

VB.NET

AddHandler cnn.InfoMessage, AddressOf cnn_InfoMessage

C#

cnn.InfoMessage += new SqlInfoMessageEventHandler(cnn_InfoMessage);

Veamos ahora cual es el método que le hemos asignado al delegado del evento InfoMessage:

VB.NET

Private Sub cnn_InfoMessage(ByVal sender As Object, _
    ByVal e As System.Data.SqlClient.SqlInfoMessageEventArgs)

    mMessages = e.Message

End Sub

C#

private void cnn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    messages = e.Message;
}

Esta es una manera de obtener los mensajes que SQL Server nos envía de manera informativa, esto lo necesitaremos para nuestra clase, ya que la información de la ejecución de las instrucciones de DBCC únicamente nos devuelven información, y más adelante en otras publicaciones verán cuan valiosos son dichos mensajes.

Esta publicación forma parte de la Serie 1 de la colección Utilidades de SQL Server con ADO.NET

Indice de publicaciones que conforman la Serie I:

Serie I Parte I: Regeneración de Campos Identity (http://msmvps.com/blogs/otelis/archive/2007/06/19/utilidades-de-sql-server-con-ado-net-regenerar-campos-identity.aspx)

Serie I Parte II: Obtener Información de ejecución del Servidor SQL Server (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-obtener-informaci-243-n-de-ejecuci-243-n-del-servidor-sql-server-con-ado-net.aspx)

Serie I Parte III: Uso de SqlConnectionStringBuilder para construir la cadena de conexión para SqlConnection (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net-uso-de-sqlconnectionstringbuilder.aspx)

Serie I Parte IV: La Clase SqlUtilities (http://msmvps.com/blogs/otelis/archive/2007/07/02/utilidades-de-sql-server-con-ado-net.aspx)

 

Referencias:

Parámetros de SQL Server en ADO.NET:

http://msmvps.com/blogs/otelis/archive/2007/06/04/par-225-metros-de-sqlcommand-y-las-variables-de-sql-server.aspx

Conexión de Datos Con ADO.NET:

http://msmvps.com/blogs/otelis/archive/2007/06/01/conexi-243-n-de-datos-con-ado-net.aspx

Espero que les sea de utilidad.

Saludos…

Octavio Telis