Compartir a través de


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

Este tema se aplica a:

Edición

Visual Basic

C#

C++

Web Developer

Express

El tema no es aplicable El tema no es aplicable El tema no es aplicable El tema no es aplicable

Standard

El tema no es aplicable El tema no es aplicable El tema no es aplicable El tema no es aplicable

Pro y Team

El tema es aplicable El tema es aplicable El tema es aplicable El tema es aplicable

En este ejemplo se muestra cómo se depura un tipo definido por el usuario de SQL Server Common Language Runtime (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.

Si al intentar depurar un objeto SQL CLR, aparece el mensaje "Cancelado por el usuario", debe configurar manualmente el equipo en el que se ejecuta Visual Studio y el equipo en el que se ejecuta SQL Server. Para obtener más información, vea Cómo: Configurar sus equipos para habilitar la depuración Transact-SQL y SQL CLR.

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 Trabajar con valores de configuración.

Para depurar un tipo definido por el usuario de SQL CLR

  1. En un nuevo proyecto de SQL CLR, establezca una conexión con la base de datos de ejemplo AdventureWorks. Para obtener más información, vea How to: Connect to a Database.

  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 How to: Develop with the SQL Server Project Type.

  3. Agregue un script que pruebe el tipo. En el Explorador de soluciones, haga clic con el botón secundario del mouse 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 script de depuración predeterminado.

  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 del script 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 en la ventana Inspección. pt se agrega ahora a la lista de variables inspeccionadas y puede observarla cuando se compila 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 definido por el usuario de SQL Server mediante la integración de Common Language Runtime