Tutorial: Depurar un tipo definido por el usuario de SQL CLR

Actualización: noviembre 2007

Este tema se aplica a:

Edición

Visual Basic

C#

C++

Web Developer

Express

Standard

Pro y Team

Leyenda de la tabla:

Se aplica

No procede

Comando o comandos ocultos de manera predeterminada.

En este ejemplo se muestra cómo depurar un tipo definido por el usuario de SQL CLR. Se crea un nuevo tipo de SQL CLR en la base de datos de ejemplo AdventureWorks. A continuación, se utiliza el tipo en una definición de tabla, una instrucción INSERT y, después, en una instrucción SELECT.

Nota:

Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Para depurar un tipo definido por el usuario de SQL CLR

  1. En un nuevo proyecto de SQL Server, establezca una conexión a la base de datos de ejemplo AdventureWorks. Para obtener más información, vea Cómo: Conectarse a una base de datos.

  2. Cree un nuevo tipo utilizando el código de la primera parte del ejemplo siguiente y asígnele el nombre Point.cs. Para obtener más información, vea Cómo: Desarrollar con el tipo de proyecto de SQL Server.

  3. Agregue una secuencia de comandos que pruebe el tipo. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el directorio SecuenciasDePrueba, seleccione Agregar script de prueba e inserte el código de la segunda parte del ejemplo. Guarde el archivo con el nombre Point.sql. Haga clic con el botón secundario del mouse en el nombre del archivo y elija Establecer como secuencia de comandos de depuración predeterminada.

  4. Agregue puntos de interrupción.

    1. En la carpeta Tipos del Explorador de servidores, abra Point.

    2. Coloque un punto de interrupción dentro de cada método de modo que pueda observar el flujo de control dentro del tipo.

  5. En el menú Depurar, elija Iniciar para compilar, implementar y hacer una prueba unitaria del proyecto. Cuando el puntero de instrucción, designado mediante una flecha amarilla, aparece sobre un punto de interrupción, se está depurando la función.

  6. Pruebe diferentes características de depuración.

    1. El método Parse se ejecuta una vez por cada instrucción INSERT en la secuencia de comandos de Point.sql. Si hace clic varias veces en Paso a paso por instrucciones en el menú Depurar, puede observar cómo el método convierte una pareja de números delimitados por dos puntos en un objeto Point.

    2. En la ventana Variables locales, abra la variable pt, que contiene el objeto Point actual que se está generando.

    3. En el editor de texto, haga doble clic en la variable pt para seleccionarla. Arrastre pt a cualquier ubicación de la ventana Inspección. pt se agrega a la lista de variables inspeccionadas y puede observar cómo se genera Point.

    4. Recorre la clase varias veces y observe las diferencias entre la ruta de INSERT y la de SELECT.

    5. Presione de nuevo Continuar para finalizar la depuración de la función.

Ejemplo

Éste es el código que define el tipo utilizado en este ejemplo. Este código crea una tabla denominada Points (Puntos), inserta filas en la tabla e imprime el contenido de la tabla. Observe que no hay que incluir el comando de proceso por lotes GO entre la creación de la tabla y el acceso a la misma. De hecho, Visual Studio 2005 interpretará GO como un comando SQL no válido.

using System;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Runtime.Serialization;

[Serializable, SqlUserDefinedTypeAttribute(Format.Native)]
public struct Point: INullable
{
    private bool m_isNull;
    private double m_x;
    private double m_y;

    public bool IsNull {
        get { return (m_isNull); }
    }

    public override string ToString()
    {
        if (this.IsNull) { return "NULL"; }
        else { return this.m_x + ":" + this.m_y; }
    }

    public static Point Parse(SqlString s)
    {
        if (s.IsNull) { return Null; }
        else
        {
            // Parse input string here to separate out points:
            Point pt = new Point();
            string str = Convert.ToString(s);
            string[] xy = str.Split(':');

            pt.X = Convert.ToDouble(xy[0]);
            pt.Y = Convert.ToDouble(xy[1]);
            return (pt);
        }
    }

    public static Point Null
    {
        get
        {
            Point pt = new Point();
            pt. m_isNull = true;
            return (pt);
        }
    }

    public double X
    {
        get { return (this.m_x); }
        set { m_x = value; }
    }

    public double Y
    {
        get { return (this.m_y); }
        set { m_y = value; }
    }
}

Este es el script de prueba que llama a la función.

CREATE TABLE dbo.Points ( 
            ID int IDENTITY(1,1) PRIMARY KEY, 
            Pnt Point) 
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '3:4')) 
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '-1:5')) 
INSERT INTO dbo.Points (Pnt) VALUES (CAST ('1:99' AS Point)) 
SELECT ID, 
        Pnt.ToString() as StringPoint, 
        Pnt.X as X, 
        Pnt.Y as Y      
FROM dbo.Points

Vea también

Tareas

Cómo: Crear y ejecutar un tipo CLR de servidor SQL Server definido por el usuario

Otros recursos

Depuración de bases de datos de SQL CLR