el problema CREATE DATABASE permission denied in database ‘master’

Me encontraba haciendo ejercicios de programación usando database migrations cuando al hacer un update-database me ocurre el error:

CREATE DATABASE permission denied in database ‘master’

Algo raro pues uso Visual Studio con mi cuenta con derechos de Administrador, además de ejecutarlo con el “Run as Administrator” e investigando un poco di con problemas al querer migrar de ambiente de desarrollo a producción la aplicación, cosa que no es mi caso. Al final di con el problema, y no caí en cuenta de que en este equipo mi cuenta fue creada después de tener instalado SQL Server Express, por lo que mi cuenta de usuario no figuraba con derechos de administración sobre la instancia de SQL Server actual. Es algo más o menos sencillo de hacer pero siguiendo la filosofía de “si alguien más ya batalló con esto” encontré un script para agregar al usuario de sistema actual con derechos de sysadmin de la instancia de SQL Server. Este fue publicada en los anales de MSDN por lo que su uso me pareció lo suficientemente seguro, además de que me resolvió el problema.

Recursos:

Script to add the current user to the SQL Server ‘sysadmin’ role

dev3cast

Con la Comunidad .NET Tijuana y junto con Mario Cornejo he venido participando en podcast tecnológicos para desarrolladores con temática general para cualquiera que trabaje desarrollando software. Son entrevistas y discusiones con especialistas en los temas donde se aclaran y se someten a consideración puntos de vista en episodios de aproximadamente 30 minutos para hacer más conciso lo discutido y haya menor tiempo de distracciones.  Algunos de los temas más populares en el 2011 han sido:

Cualquiera de ellos los puedes descargar o suscribirte para oirlos a tu tiempo en tu lector de RSS favorito.

 

 

La versión de SQL Server no soporta el tipo de dato datetime2

Estás trabajando en tu aplicación web con Entity Framework y C# en tu máquina de desarrollo usando la versión más reciente de SQL Server 2008 feliz de la vida. Pero al momento de hacer la implementación en el servidor de producción, te encuentras con este error:

The version of SQL Server in use does not support datatype ‘datetime2

Y entonces te acuerdas, en el servidor de producción tienen instalado SQL Server 2005. No hay problema, solo ubica el archivo EDMX de tu modelo y con el click derecho del mouse selecciona la opción del menú emergente “Abrir con…”

Hay que ubicar la etiqueta Schema y en el atributo ProviderManifestToken colocar 2005 en lugar de 2008. De esta manera le indicas a Entity Framework que trabaje en modo de compatibilidad de 2005 y así trata apropiadamente los tipos de dato de fecha.

<Schema Namespace="SAOModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" >

 

* Este código fuente ha sido resaltado con Source Code Highlighter.

 

Usando WHERE IN de SQL en Entity Framework (y Linq) con C#

A veces necesitas hacer una consulta basándote en datos que no estarás seguro tener porque simplemente es tu usuario quien los eligirá y pues, no eres adivino ¿verdad?

Vamos a basarnos en la base de datos de Northwind para el siguiente ejemplo (si no la tienes, checa el video de como obtener las bases de datos de pruebas Northwind y pubs). En esta base de datos tenemos Proveedores (Suppliers) que ofrecen Productos (Products). ¿Qué pasaría si necesitaramos saber los productos de un proveedor en específico? Si ese proveedor específico fuera Exotic Liquids el código Transact-SQL sería algo tan simple como esto:

SELECT *
FROM   products
WHERE  supplierid = (SELECT supplierid
                     FROM   suppliers
                     WHERE  companyname = ‘Exotic Liquids’) 

Ya se que también lo podemos poner con INNER JOIN pero estoy tratando de demostrar un punto, aguarda un poco.

Si la interfaz gráfica lo permite, y si el usuario quiere saber productos de más de un proveedor podemos hacer algo igual de sencillo usando WHERE IN. Imagínate un ListBox donde el usuario selecciona más de un proveedor de cual escoger productos, o una caja de texto con autocompletado. En este caso estamos obteniendo los productos de los proveedores que empiezan con la letra E:

SELECT *
FROM   products
WHERE  supplierid IN (SELECT supplierid
                      FROM   suppliers
                      WHERE  companyname LIKE ‘E%’) 

Donde usamos un campo de la tabla para que encuentre todos los valores que cumplan lo que tenemos entre paréntesis. Básico ¿no? pero ¿como hacemos para llevar esta sentencia SQL a Entity Framework?

Si estás usando Entity Framework 4.0, es muy similar a Linq2SQL, donde puedes usar el método Contains de un arreglo y podrás usar los IDs que ocupas para hacer el filtrado de elementos:

  //Si usamos Linq2SQL usar
  //NorthwindDataContext nc = new NorthwindDataContext();
  NorthwindEntities ne = new NorthwindEntities();

  int[] supplierIDs = { 1, 27 };

  var products = from p in ne.Products
          where (supplierIDs.Contains((int)p.SupplierID))
          select p;

Aquí dos cosas que aclarar, primero, se hace un cast al tipo de dato int para asegurar que los SupplierID coincidan. La otra es que habíamos quedado que no podemos saber cuales proveedores pudiera escojer el usuario, aunque aquí se forzó al proveedor con supplierID 1 y 27 (que son los de Exotic Liquids y Escargots Nouveaux, sí, ambos empiezan con E).

Entonces, ¿cómo hacerlo más dinámico usando Linq to Entities o Linq2SQL? Vaciamos en una variable la consulta, pero exclusivamente con las llaves primarias que nos interesan, y ese resultado lo convertimos a un arreglo, que sería el que finalmente usamos para la consulta final:

  //Si usamos Linq2SQL usar
  //NorthwindDataContext nc = new NorthwindDataContext();
  NorthwindEntities ne = new NorthwindEntities();

  var suppliers = from s in ne.Suppliers
          where (s.CompanyName.StartsWith("E"))
          select s.SupplierID;

  int[] supplierIDs = suppliers.ToArray();

  var products = from p in ne.Products
          where (supplierIDs.Contains((int)p.SupplierID))
          select p;

La clave aquí es usar en la consulta solo el campo que nos interesa (SupplierID) y convertir el resultado en arreglo para poder pasarlo a la segunda consulta ya que con el Contains lo tendremos resuelto. El ejemplo es con proveedores cuyo nombre empiece con E, pero puedes hacerlo aún más dinámico obteniendo ese dato de una caja de texto, un dropdownlist o lo que se te ocurra.

Consideraciones:

En Entity Framework 3.5 no podemos usar Contains, para hacerlo puedes usar el workaround propuesto por Shimmy en StackOverflow.

Puedes repasar como preparar tu ambiente de desarrollo con Entity Framework con el video Búsqueda en ADO.NET Entity Framework con C#.

La otra es que siempre son bienvenidos los comentarios para mejorar el código o ver que otras aplicaciones tendrían para esta manera de consultar datos que aunque muy común si trabajamos con Transact-SQL en Linq no es del todo clara.

Fuentes:

* El código fuente fue coloreado con Source Code Highlighter.

No hay excusas para no programar para Windows Phone 7

Aunque ya lo había mencionado en Twitter hace casi un mes, es necesario elaborar un poco sobre el magnífico recurso que comparte Rob Miles sobre programación para Windows Phone 7. Rob Miles (en twitter @RobMiles) ya antes conocía su magnífico C# Yellow Book, pues bien, en Windows Phone Programming in C# nos regala:

  • Un ebook de 152 páginas con todos los detalles que necesitas para programar en Windows Phone
  • Presentaciones de PowerPoint para dar un seguimiento a grandes razgos
  • Demos de las técnicas y funcionalidades presentadas
  • Laboratorios prácticas para que desarrolles tus aplicaciones

Los temas abordados son los precisos para que aprendas a programar ya mismo:

  1. Información General de la plataforma
  2. Introducción a Silverlight
  3. Introducción a Visual Studio 2010
  4. Diseñando la interfaz de usuario con Silverlight
  5. Consumiendo servicios de datos
  6. Información general de XNA
  7. Creando aplicaciones Windows Phone
  8. Usando el Marketplace para vender soluciones

Entonces, ¿qué esperas? Descarga ya mismo (completamente gratis) desde Microsoft Faculty Connection: Windows Phone Programming in C#

 

 

¿Quieres programar para Windows Phone 7 y no tienes uno? Participa haciendo 3 soluciones antes del 6 de mayo y ¡gánate uno gratis! Consulta las bases aquí.

Ebooks gratuitos

Aprovecha los días libres en las fiestas de fin de año para prepararte en tu carrera:


Foundations of Programming por por Karl Seguin, donde el colaborador de www.codebetter.com nos da un punto de vista de lo que tú como programador debes saber ahora mismo si quieres ser mejor en tu trabajo.


Fundamentos de programación por Karl Seguin (traducción al español realizada por miembros de las comunidades tecnológicas Microsoft en México)


Programming Windows Phone 7: Con este ebook gratuito podrás conocer de primera mano como programar para la siguiente plataforma de dispositivos móviles. Aquí puedes ver el contenido de este libro y conocer las novedades. Descarga ya en versión PDF, versión XPS y ejemplos en código.


Own your future: En este libro se te ofrece un panorama de como actualizar tus habilidades y tomar control de tu futuro en tu carrera tecnológica. Aunque enfocado a el trabajo que se hace en Microsoft, puede ser perfectamente aplicable a cualquiera que quiera tener un futuro brillante basado en el esfuerzo y trabajo en su carrera.

Otros títulos dedicados a la programación y C#
Microsoft Application Architecture Guide, 2nd Edition
Rob Miles C# Yellow Book 2010
Threading in C#
Improving .NET Application Performance and Scalability
Applying Design Patterns

Otros ebooks de MSPress
Como parte del evento de lanzamiento de Office 2010 Microsoft Press hace disponible el ebook First Look Office 2010 de manera gratuita. Sólo tienes que acceder a este enlace para iniciar la descarga (PDF directo 10.5MB).

Pero no es el único, a lo largo del tiempo se han hecho disponibles distintos títulos para ser aprovechados por quienes se interesan por estar al día en distintos tipos de tecnología. Puedes descargarlos en cada una de las ligas:

Free ebook: Moving to Microsoft Visual Studio 2010 (DRAFT Preview)
Free ebook: Moving to Microsoft Visual Studio 2010 (DRAFT Preview II)
Code for “Moving to Microsoft Visual Studio 2010” DRAFT ebooks
Free ebook: Introducing Microsoft SQL Server 2008 R2
Free ebook: Understanding Microsoft Virtualization Solutions (Second Edition)
Free ebook: First Look Microsoft Office 2010
Free ebook: Windows 7 troubleshooting tips
Free ebook: Introducing Windows Server 2008 R2
Free ebook: Deploying Windows 7, Essential Guidance

Importante: Vulnerabilidad en ASP.NET (todas las versiones)

Quienes me siguen en twitter (twitter.com/gabo) se habrán enterado sobre la vulnerabilidad en ASP.NET que me hizo decir algunas maldiciones en días pasados. Es una vulnerabilidad importante que Microsoft comentó en un Security Advisory y se trata básicamente de que un atacante pueda hacer peticiones al servidor web y verificando los mensajes de error que este arroje, descifrar el contenido de algunos archivos que no están expuestos por default por IIS, como el archivo web.config, donde algunos almacenan por ejemplo información de conexión a servidores SQL Server y algunos otros (malamente) también usuarios y passwords.

¿Qué hay que hacer? Afortunadamente Microsoft ha lanzado ya actualizaciones por Windows Update, si no lo has hecho o por alguna razón no lo puedes ejecutar, aquí lo puedes descargar directamente:

Windows Server 2008 R2 and Windows 7

 

.NET Framework Version

KB Article

Patch

.NET Framework 3.5.1 (Default install)

KB2416471

Download

.NET Framework 4

KB2416472

Download

 

Windows Server 2008 SP2, Windows Vista SP2

 

.NET Framework Version

KB Article

Patch

.NET Framework 2.0 SP2 (default install)

KB2416470

Download

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2416470, KB2416473

Download, Download*

.NET Framework 3.5

KB2416470, KB2418240

Download, Download*

.NET Framework 1.1 SP1

KB2416447

Download

*Si se listan varias descargas sobre una versión de .NET (por ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser instalados (sin importar el orden).

Windows Server 2008, Windows Vista SP1

 

.NET Framework Version

KB Article

Patch

.NET Framework 2.0 SP1 (default install)

KB2416469

Download

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2416474, KB2416473

Download, Download*

.NET Framework 2.0 SP2

KB2416474

Download

.NET Framework 3.5

KB2416469, KB2418240

Download, Download*

.NET Framework 1.1 SP1

KB2416447

Download

*Si se listan varias descargas sobre una versión de .NET (por
ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser
instalados (sin importar el orden).

Windows Server 2003 SP2 32-bit

 

.NET Framework Version

KB Article

Patch

.NET Framework 1.1 SP1 (default install)

KB2416451

Download

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2418241, KB2416473

Download, Download*

.NET Framework 2.0 SP2

KB2418241

Download

.NET Framework 3.5

KB2416468, KB2418240

Download, Download*

*Si se listan varias descargas sobre una versión de .NET (por
ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser
instalados (sin importar el orden).

Windows Server 2003 64-bit

 

.NET Framework Version/SP

KB Article

Patch

Default OS Configuration

NA

NA

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2418241, KB2416473

Download, Download*

.NET Framework 2.0 SP2

KB2418241

Download

.NET Framework 3.5

KB2416468, KB2418240

Download, Download*

.NET Framework 1.1 SP1

KB2416447

Download

*Si se listan varias descargas sobre una versión de .NET (por
ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser
instalados (sin importar el orden).

Windows XP SP3 32-bit and 64-bit

 

.NET Framework Version/SP

KB Article

Patch

Default OS Configuration

NA

NA

.NET Framework 4

KB2416472

Download

.NET Framework 3.5 SP1

KB2418241, KB2416473

Download, Download*

.NET Framework 2.0 SP2

KB2418241

Download

.NET Framework 3.5

KB2416468, KB2418240

Download, Download*

.NET Framework 1.1 SP1

KB2416447

Download

*Si se listan varias descargas sobre una versión de .NET (por
ejemplo en .NET 3.5 SP1 y .NET 3.5) entonces todos los parches deben ser
instalados (sin importar el orden).

Consideraciones

Fue muy hábil el equipo de expertos que descubrió esta vulnerabilidad, y fue una bastante importante pues afectaba todas las versiones de ASP.NET, pero afortunadamente la respuesta de Microsoft fue casi inmediata con la publicación de un workaround que evitaba ser expuestos por esta. Lo más importante es que si mantienes un sitio ASP.NET te asegures no caer en prácticas comunes y poco confiables como dejar los usuarios y contraseñas en texto plano en ningún archivo del sitio web. Velo así, es una carpeta expuesta a la internet para todos, aún con restricciones de IIS ¿dejarías la contraseña de tu coreo electrónico en un archivo .PPTX expuesto? Sólo es cuestión de sentido común.

Con información de los posts de ScottGu:


Fundamentos de Programación

Traducción al español del Foundations of Programming de Karl Seguin de www.codebetter.com licenciado bajo Creative Commons licencia Attribution-NonCommercial
-Share-Alike 3.0 Unported.

Fundamentos de Programación Traducido

Jaime Sánchez nos comentó a varios miembros de comunidades tecnológicas acerca de traducir al español este libro, y varios nos apuntamos a ello. Pues bien, este es el esfuerzo de Francisco Flamenco, Emilio Reyes, Antonio Ortiz, Gabriel Oliva, Jaime del Palacio, Gabriel Flores y Haarón González.

Es una traducción que no por provenir de nosotros esté libre de fallas, así que cualquier problema, imprecisión o falta agradeceríamos nos lo notifiquen para actualizar el documento.

La certificación no es una pérdida de tiempo

Estoy totalmente de acuerdo en las razones que marca Uncle Bob del porque certificarse sí es una pérdida de tiempo:

  • Si tratas de impresionar a alguien
  • Si lo quieres usar para conseguir trabajo
  • Si solo quieres contratar personal certificado

    
Sin embargo, hay un error común en muchas personas que desvirtúan las certificaciones, y es que certificarse no es atender un curso y obtener un reconocimiento de que participaste en ese curso.  Déjame explicarlo, ese “certificado de participación” en el curso XYZ-1234 *NO* es una certificación. Es más, para estar certificado en algo ni siquiera necesitas haber tomado esos cursos, necesariamente. Lo que ayuda más para aprobar los exámenes de certificación es como dije anteriormente en “Certificaciones, perder el miedo” es la experiencia personal en la tecnología que estás certificándote.

Como también dije en ese post, personalmente que yo sepa que estás certificado en algo me da a entender que comprendes lo mínimo de esa tecnología, que no tengo que perder tiempo en enseñarte desde el principio, pero realmente es muy debatible que demuestre que tan experto seas en ella. Para estar certificado en algo me sirve para demostrarme a mí mismo
antes que a cualquier otra persona un hito personal en mi carrera
profesional. Como dije antes, tu trabajo habla más que cualquier papelito que traigas adjunto a tu CV.

 

Cambiar usuario y password de la cadena de conexión en EF

En una aplicación donde usas ADO.NET Entity Framework como acceso a datos, en el paso donde se agrega una entidad nueva en el proyecto y se usa autenticación de SQL Server, siempre se nos pregunta si almacenaremos la información de conexión en el archivo de configuración o si la pasaremos por medio de la aplicación:

click para ver más grande

Esta es la mejor práctica, seleccionar “No, exclude sensitive data from the connection string. I will set it in my application” que palabras más, palabras menos, significa algo así como “No, excluir datos sensibles de la cadena de conexión. La asignaré desde mi aplicación”. Y es que en un mundo ideal tu aplicación se ejecutará desde un entorno donde la máquina pertenezca a un directorio activo (Active Directory) con todas las credenciales dadas desde Windows para evitar errores y malentendidos. Pero en el mundo real esto no siempre es así y quizás en la misma PC donde se ejecutará la aplicación varios usuarios con distintos tipos de perfil usarán la aplicación por lo que debes pedir sus nombres de usuario y contraseña de SQL Server para acceder al programa. Entonces ¿cómo cambiamos los datos de la cadena de conexión?

Supongamos que tenemos una forma de Login con dos cajas de texto para el usuario y contraseña y estos se leen en unas variables sUser y sPass respectivamente, vamos a tener esto:

 


NorthwindEntities ne = new NorthwindEntities();

SqlConnectionStringBuilder sb =
new SqlConnectionStringBuilder(
((EntityConnection)ne.Connection).StoreConnection.ConnectionString
);
sb.IntegratedSecurity = false;
sb.UserID = sUser;
sb.Password = sPass;

((EntityConnection)ne.Connection).StoreConnection.ConnectionString = sb.ConnectionString;

 

NorthwindEntities es como nombramos el modelo de datos desde el Entity Data Model Wizard. Y aquí inicializamos la conexión auxiliándonos de la clase SqlConnectionStringBuilder para mayor comodidad. Después de eso, simplemente lo asignamos por medio del ConnectionString. Toma en cuenta los castings de los que hacemos uso con (EntityConnection) para poder tener acceso a la propiedad StoreConnection que es donde la propiedad ConnectionString está disponible y que podemos actualizar.

Basado en ADO.NET Entity Framework: Modify EntityConnection connection string values at runtime