LINQ to SQL (SQL compaq también existe!)

sqlserver2008logo

Esta mañana mi colega de penurias Toni Sala me preguntaba acerca de las posibilidades de usar LINQ to SQL con bases de datos SQL Compaq. Efectivamente, se puede hacer, es algo que probé en su momento y no había utilizado más. Sin embargo, lo que si que recordaba era que no es tan evidente como con sus hermanos mayores.

Bueno, al lío. Para este ejemplo vamos a usar la BD de ejemplo Northwind.sdf que instala Visual Studio 2008 (en mi caso la tengo ubicada en ‘C:\Archivos de programa\Microsoft SQL Server Compact Edition\v3.5\Samples’).

Una vez creado el proyecto de ejemplo (en mi caso lo llamaré ‘SqlCompaqLINQ’), creamos una carpeta ‘Data’ dentro de nuestro proyecto y agregamos la BD a nuestro proyecto mediante ‘Project/Add existing Item’:

SqlCompaqLINQPE SqlCompaqLINQAddDB

Hasta aquí todo normal, pero la diferencia de SQlCompaq respecto a sus hermanos mayores está en que si ahora creamos un DataContext e intentamos arrastrar una tabla sobre él, aparecerá un mensaje de error un poco descorazonador:

SqlCompaqLINQError

No pasa nada, para estos casos podemos ir directamente a la herramienta SqlMetal (ya sabéis lo del poder del metal :-P), y generar el correspondiente fichero DBML mediante la línea de comandos. Para ello abrimos la consola de Visual Studio y ejecutamos el siguiente comando (desde nuestra carpeta ‘Data’):

SqlMetal.exe Northwind.sdf /dbml:NorthwindCE.dbml

Esto generará el diseñador con las clases correspondientes a las tablas de la BD de SQL Compaq, que a continuación agegaremos a nuestro proyecto también mediante ‘Project/Add existing Item’:

SqlCompaqLINQDataContext

Ahora basta con crear una instancia del diseñador, generar nuestra instrucción LINQ to SQL y ¡a jugar!:

using SqlCompaqLINQ.Data;
...
string path = "Data Source=|DataDirectory|\\Data\\Northwind.sdf";
using(Northwind dc = new Northwind(path))
{
    var customers = from c in dc.Customers
                    orderby c.CompanyName
                    select c;
    listBox1.DataSource = customers.ToList();
    listBox1.DisplayMember = "CompanyName";
    listBox1.ValueMember = "CustomerID";
}

Un saludo desde Andorra,

** crossposting desde el blog de Lluís Franco en geeks.ms **

Leave a Reply

Your email address will not be published. Required fields are marked *


*