asi es la vida del artista, pero me gusta ser un pica codigo :)

Cuando las cosas se ponen feas, el tiempo no te da para más y dices el siguiente mes no me exijo más de lo normal, te vuelves a meter en otras cosas aparte de la carga diara del trabajo. Es decir, no dormir a tus horas, dormir psicosiado por los pendientes que tienes que entregar, trabajar los fines de semana, los fines de semana almorzar tarde, y muchas otras cosas más adicionales que salen.. pero como dice don Guino, así es la vida del artista :), pero me alegra ser un pica código.

También quería aprovechar el post para hacer referencia al post de mi amigo El Perucho, donde me compromete a tener más conocimiento, es decir más amanecidas. En estas ocasiones, cuando alguien me dice que se, les digo que yo no sé :D, personas que saben son Guino, Rodrigo Corral, Jorge Serrano, El Bruno, Daniel Matey, a este último recién lo leo :D, hablando de las personas dentro de Geeks.ms. Hombre, que hay personas con muchos conocimientos en otras tecnologías, y en muchas empresas también debe haber personas con mucho conocimiento, pero lo rescatable de las personas que menciono es que además de saber, lo comparten con la comunidad, eso es lo que admiro más :). Por cierto hay muchos otros que se quedaron en la cola como el maligno, ScottGu’s, Joel Francia, Gustavo VelezRafael Ontivero,  entre otros. Y como dice David Carmona, los Neandertales, los que aprenden y mueren con su conocimiento, están condenados a la extinción, pero los Homo Sapiens,  somos los que sobreviviremos :).

A por cierto, no soy MVP. Muchas veces me han preguntado eso, creo que no es necesario ser MVP para colaborar con la comunidad :), a parte que bloguear es algo me gusta, es simplemente algo que me apasiona y cada vez que blogueo son inyecciones de motivación para pasar la siguiente semana xD, y me basta con frases como: “gracias por el código, es lo que estaba buscando”, con eso me contento :p, aunque también me gusta esta otra frase: “ese código que has enviado, tiene estas deficiencias”, es decir que hagan críticas a lo enviado, y estos son mis comentarios favoritos, para evitar los horrores en las aplicaciones ya creadas xD.

Lo que si no soy, o no trato de llegar a serlo, es ser un entusiasta o un tecnicoless, no se pierdan la oración del tecnicoless, esta bravaza :D. Y es muchas veces, muchos creen que al leer un artículo o unas páginas de un libro, ya son unos expertos en el tema, pueden subirte al carrito y criticar algo por que todos lo critican, y en muchos casos se llega hasta mentir. Cuando no estaba en el mundo laboral, en los primeros años de la Universidad, tenía mi blog en blogspot, posteaba códigos o post, que me parecía interesantes compartirlos, pero ahora ha cambiando un poco la cosa, ahora posteo código que estoy usando y que en mi escenario funciona :D, también algunas cosas q me parecen interesantes aprender, o algunos OT como este post. Y es que cuando blogueaba en blogspot, no tenía en mente que iban a leer fuera mi país, mucho más ahora en Geeks.ms, que creo que es la comunidad de blogs en el habla hispana más leída, yo mismo diariamente la leo para ver que de nuevo hay, y eso es una responsabilidad a la hora de escribir :D. Esto es para los bloggers, no pude evitarlo xD, al postear en Geeks.ms, no sólo estas posteando para tu ciudad o tu país, o no estás dando una charla en tu ciudad, en Geeks.ms, te está leyendo gente de todo el mundo y gente que conoce igual o más que tú, y no sólo gente que habla espaniol, también te leen en inglés, aunque piensen que escribes en francés :D; y a lo que quiero llegar con esto, es los lectores de Geek.ms, no sólo vienen mirar el código, ese código lo van a poner en producción, y debe haber mínimo respeto para ellos, por eso a tener cuidado, y no ser un tecnicoless.

Por otra lado, y si es que ya no logro enviar una entrada sobre un tema que estado viendo esta semana en el trabajo, lo envió como resumen :D. El tema es sobre transacciones, sin duda, que si estamos haciendo mantenimientos simples, uno, no se puede preocupar por esto, pero cuando tienes procesos que hacen varias consultas de mantenimiento a diversas tablas, las transacciones son básicas, sobre todo si no quieres tener data extra o data sin integridad. Desde .Net  podemos usar System.Transactions o SqlTransaction, una de las principales diferencias es que con System.Transactions podemos incluir operaciones a dos base de datos distintas, dicen que también soporta Oracle, yo lo he probado con dos base de datos distintas en un mismo servidor SQL Server 2005, y ha funcionando correctamente, aunque si están trabajando en un ambiente distribuido leer las recomendaciones de Pablo Castro en este foro. Y es como siempre repito, no hay magia en esto, y es que las transacciones están siendo alojadas en Component Services, eso entendí :D, mientras se confirma si se realiza o no, todavía queda mucho por leer de eso y les invito a seguirla en este artículo: Transaction Management in Windows. Ese fue un pequeño resumen, ya que hay un trabajo atrás que es el que hace la magia, y si conocemos esto podremos resolver cualquier problema que se presente.

P.D.: Ya me siento tranquilo, y a seguir picando código :).

Saludos,

Post cruzado

Restaurar base de datos SQL si no es a las buenas, a las malas, usando SMO :D

Si están usando SQL Server Management Studio para restaurar un backup de una base de datos, puede que en algunas casos se encuentren con el siguiente mensaje:

Exclusive Access could not be obtained because the database is in use

La opción, de eliminar la base de datos para remover las conexiones existentes, puede ser válida, pero también podemos usar el siguiente query para remover las conexiones existentes:

   1: use master
   2: go
   3: alter database <dbname> set single_user with rollback immediate
   4: alter database <dbname> set multi_user 

No es un query que resuelva el problema directamente, es un artificio, pero funciona :).

Encontré un código haciendo uso de SMO, que además de hacer el backup, incluye una instrucción que detiene los procesos asociados a una base de datos.

SMO, es una de las novedades de SQL Server 2005:

SQL Management Objects
“SMO (SQL Management Objects) es un nuevo conjunto de objetos de programación que cuenta con toda la funcionalidad de administración de la base de datos de SQL Server. De hecho, Management Studio se creó con SQL Management Objects. SMO se implementa como un ensamblado de Microsoft .NET Framework. Se puede utilizar SMO para automatizar las tareas administrativas habituales de SQL Server, como la recuperación mediante programación de los valores de configuración, la creación de nuevas bases de datos, la aplicación de secuencias de comandos de Transact-SQL, la creación de trabajos de SQL Server Agent y la programación de copias de seguridad. El modelo de objetos SMO es una sustitución más segura, confiable y escalable de los Objetos de administración distribuida (DMO), que se incluyó en las versiones anteriores de SQL Server”.

En otras palabras, con SMO vamos a poder programar las tareas que hacemos desde Microsoft SQL Server Management Studio desde .NET :D.

Humberto Martinez, ha publicado una entrada, jugando con SMO, donde crea dos funciones en .NET una para hacer un backup, y otra para restaurar una base de datos, aunque le falta ser un poco más parametrizable, como base esta muy claro el ejemplo :). El código esta en VB.NET, pero fácilmente traducible a C#. Los namespace necesarios para usar SMO, los podemos encontrar en este How to: Create a Visual C# SMO Project in Visual Studio .NET.

En esta otra entrada: Killing ProcessIDs using SMO, tiene el código para restaurar una base y además matar a los procesos asociados a una base de datos:

   1: internal void RestoreDatabase(string backupFileName, string databaseName)
   2:  {    
   3:     Restore restore = new Restore();
   4:     restore.Database = databaseName;
   5:  
   6:  
   7:     restore.Devices.AddDevice(backupFileName, DeviceType.File);
   8:     restore.ReplaceDatabase = true;
   9:     _server.KillAllProcesses(databaseName);
  10:     restore.Wait();
  11:     restore.SqlRestore(_server);
  12:   }

La línea adicional es la línea en que se llama al método KillAllProcesses de la variable _server, que debe ser una instancia de la clase Microsoft.SqlServer.Management.Smo.Server. Todos los miembros (propieades, métodos, y demás), los podemos encontrar en el siguiente link.

Indudablemente que la tarea de hacer backups, es básica en todo proyecto sobre todo cuando se esta haciendo pase de un ambiente de desarrollo, a uno de pruebas o uno producción. Lo que se me ocurre en este momento es una AppWindows parametrizable que te permita hacer un backup :D, si alguien la hace, o ya la tiene hecha, me avisa para linkearla. Si la hago antes, les aviso :).

Otras ejemplos con SMO:

Saludos,

Post cruzado

humor geek para el fin de semana, piropos geeks

Voy a copiar textualmente la entrada de HodracirK’S Blog, pero en distinto orden:

Estos piropos geeks están muy buenos, solté más de una carcajada al leerlos:

  • “Eres la contraseña de mi correo” ****
  • “Ojalá fuera blog para que me visitaras todos los días” ****
  • “Desearía ser mouse para que me movieras la bolita” *****
  • “Tú aceleras mi conexión” ****
  • “Quisiera ser página para que me agregaras a tus favoritos” ***
  • “Eres el servidor de mi red” **
  • “Quisiera ser teclado para que me tocaras con tus manitas” ****

Y si no puedes conciliar el sueño recuerda este anécdota:

  • “Un día que no podía dormir pensé que ya estaba crecidito como para contar ovejas, así que me dediqué a enumerar las extensiones de ficheros que recordaba”.

Fuentes originales del post de HodracirK:

Saludos,

Post cruzado

Crear un paquete de instalacion personalizado para ASP.NET con VS 2005

Una pregunta muy común que veo en los foros es: como crear un instalador configurable, es decir, por ejemplo poder indicarle a que base de datos nos vamos a conectar, y no tener que hacerlo directamente en el web.config. Y esto podría ser, si la persona que va instalar el software, no sabe mucho de programación y no sabe que es un archivo web.config, o solamente por cuestiones de facilidad en la instalación.

El asistente para generar proyectos de instalación de Visual Studio, crea un instalador con las cosas básicas, pero también se puede personalizar la instalación, como agregar condiciones, agregar acciones personalizadas, entre otras.

ScottGu’s, ha publicado un how-to post, de como hacer un proyecto de instalación Web permitiendo que el usuario pueda ingresar la cadena de conexión, además muestras los pasos básicos de como hacer un proyecto de instalación para ASP.NET desde Visual Studio, este es un gran post. Yo lo tenía en la cola de posts, ahora cuando algún día lo publique, será sobre la base del post de ScottGu’s. Ya no se puede decir nada más de ScottGu’s, sobre todo por el tiempo que le dedica a la comunidad, escribiendo este tipo de artículos-howtos, grande ScottGu’s!

Post de ScottGu’s: Tip/Trick: Creating Packaged ASP.NET Setup Programs with VS 2005.

Otro artículo interesante sobre la instalación de aplicaciones Web, es un artículo en MSDN Magazine: Proyectos de implementación web, por Fritz Onion. Por cierto Fritz, es el expositor de muchos de los WebCast de ASP.NET en inglés.

Saludos,

Post cruzado

Colorea tu codigo en Windows Live Writer

Hace unos meses había comentado la liberación de Windows Live Writer Beta 2, pues me enteré de un plugin para colorear el código: Code Snippet plugin for Windows Live Writer:

Code Snippet dialog

La use en este post, y me ha dejado satisfecho. Antes el código que usaba en el blog a lo mucho lo que hacía, era identarlo y ponerlo de un sólo color. Pero con esta herramienta, puedes un código más agradable, y de más fácil lectura, sobretodo sin esfuerzo mayor que unos clics, y usar el clipboard :).

Algunas de las features de este plugin son:

  • Run Silent
  • Rich Text Editor
  • Expandable/Splitable Code Panes
  • Persistent Options
  • Preview HTML
  • Compact Mode
  • Window Placement Persistence
  • Copy CSS Style to Clipboard
  • Support for CSS snippets
  • Embedded Styles Now Inline

Si quieren ver a detalles las features mencionadas, pueden visitar esta entrada del autor, Leo Vildosola’s Blog, del plugin: Code Snippet plugin for Windows Live Writer.

Fuente: Leyendo una entrada, a veces hace el esfuerzo para escribir :D, en el Blog de Richie.

Saludos, 

Post cruzado

En que parte cierro la conexion del DAAB (Jan-2006)

Hace tiempo que tenía un comentario en cola sobre el uso del Data Access Application Block.

La pregunta era, copiada textualmente: “Holas, una preguntis, en que parte cierro la conexión???

La respuestis, :D, es:

  • La clase DataBase, en muchos de los casos, se encarga de manejar las conexiones, el administra el abrir y cerrar las conexiones en cada llamada. Por eso no es necesario agregar código para cerrar las conexiones. Por ejemplo la llamada a ExecuteDataSet, abre la conexión, llena el DataSet, y cierra la conexión después de retornar los resultados.
  • Ahora en cuanto al uso del método ExecuteReader, la cosa cambia. Este método devuelve un objeto que implementa IDataReader. Ahora un objeto DataReader, debe tener la conexión abierta mientras esta consumiendo la data. En este caso la conexión es cerrada cuando el uso del objeto DataReader a finalizado. Como recomienda la documentación, es una buena practica asegura que la conexión es cerrada después de su tiempo de uso, para eso debemos llamar al método DataReader.Close(), después que hemos terminado de usar el objeto.

Por cierto, esta info y mucho más la pueden encontrar en la documentación del Enterprise Library for .NET Framework 2.0 – January 2006. El Enterprise Library, 3.X, aún no lo he usado.

Por cierto la lista de temas del DAAB que se incluyen en la documentación del EntLib 2.0 – Jan2006, son los siguientes:

  • Introduction to the Data Access Application Block
    • Scenarios and Goals
  • Developing Applications Using the Data Access Application Block
    • Entering Configuration Information
    • Adding Application Code
    • Details of Development Tasks
      • Details of Creating a Database Object
      • Creating a DbCommand Object
      • Managing Connections
      • Creating Portable Database Applications
      • Handling Exceptions
      • Handling Parameters
    • Key Scenarios
  • Design of the Data Access Application Block
    • Designing for Simplified Data Access
    • Designing for Database-Agnostic Applications
  • Extending and Modifying the Data Access Application Block
    • Adding a New Application Block Database Provider
    • Modifying the Data Access Application Block
  • Deployment and Operations
    • Deploying the Data Access Application Block
    • Updating the Data Access Application Block
    • Instrumenting the Data Access Application Block
  • QuickStarts

Saludos,

Post cruzado

WebCast: Lo nuevo para los desarrolladores Web en Orcas y ASP.NET (eng)

Parece que ya se están haciendo las últimas definiciones de las nuevas features para ASP.NET en Visual Studio “Orcas”, una de las últimas cosas que se han anunciado es el control LinqDataSource, puede leer esta entrada: ASP.NET 3.5 will have a LinqDataSource.

Aunque como lo comente en post anterior, y bajo mi percepción, el Page Framework de ASP.NET 2.0, no ha tenido un cambio como el que si hubo de 1.X a 2.0, creo que para la siguiente versión de Visual Studio tendremos una cambio más notorio. Ósea que si aprenden ASP.NET 2.0, todo ese conocimiento lo van a poder explotar con Visual Studio “Orcas”, es decir no van necesitar una actualización a detalle, como si se necesita cuando quieres migrar de ASP.NET 1.X, a ASP.NET 2.0.

Si quieren enterarse de todo lo nuevo para el desarrollador Web en Visual Studio “Orcas”, y además conocer las nuevas features de ASP.NET, basado en el Page Framework de ASP.NET por cierto, puede visitar el siguiente WebCast: What’s New for Web Developers in Visual Studio “Orcas” & the Microsoft ASP.NET Futures, recuerden que si tiene problemas con el horario siempre, lo pueden ver bajo demanda :).

Overview del Evento:

This session will cover some of the great new features that will be coming soon with Visual Studio “Orcas” & the Microsoft ASP.NET Futures.  Learn how web development with .NET will continue to improve and evolve, and talk about some of the upcoming features and how best to use them.  We will be covering:

  • Targeting a specific version of the .NET Framework (2.0, 3.0, 3.5)
  • The new ASP.NET page designer (split view, CSS and improved layout support, nested master pages, etc.)
  • Better control of markup using the new ListView control
  • ASP.NET AJAX / JavaScript Intellisense & Debugging improvements
  • LINQ integration
  • New controls in the Microsoft ASP.NET Futures (Back button support, Silverlight controls, SearchDataSource control, Dynamic Data Controls, etc.)

Para otros WebCast de Julio relacionados, pueden visitar el siguiente post: Webcast Schedule for July 2007.

Saludos,

Post cruzado

Serie de post de lo Nuevo de C# 3.0

Después de estar media hora sin dormir, son las 04:01 a.m., y como ya terminé de pensar como conquistar el mundo algunas tareas para mañana dentro de unas horas. Voy aprovechar el insomnio, cosa más que extrania por estos días, para bloggear :D.

El gran Edgar Sánchez, inicio la Serie N sobre post de Lo Nuevo C# 3.0. Serie N, por que él en su primer post no estaba seguro si N iba a ser != de -1, pero ahora por lo menos N ya es >= que 2 :D.

¿Por qué recomiendo esta serie?. Uno por que es espaniol, y dos, por el estilo y la experiencia que le da Edgar a sus post, me agrada mucho :).

Lista actual:

P.D.: Si me da el tiempo, y si (N>2) { Lista.Update(); }.

Saludos,

Post cruzado

.NET DateTime to UnixTime (y viceversa)

En algunas ocasiones tenemos que interactuar con sistemas que tiene este tipo de fecha: 1183875671, hombre que no siempre las fechas van a estar como nosotros queremos :D. Cuando lo vi inicialmente, sólo por el título imagine que era una fecha, pero no tenía la certeza de que unidad de medida era o en que formato estaba. Pero gracias a mi amigo Necudeco, un poco exagerado en algunos post pero con mucho conocimiento, que me comentó que era una fecha en formato Unixstamp, o Unixtime, o en algunos casos lo conocen como Timestamp, que no es lo mismo que timeSpan.

El Unixtimestamp, no es otra cosa que el número de segundos transcurridos desde la 0 horas del 1 de enero de 1970.

Ahora un tipo DateTime de .NET, tiene una propiedad llamada DateTime.Ticks, que es lo más parecido al UnixTime, pero la propiedad DateTime.Ticks tiene otra unidad de medida: representa el número de intervalos de 100 nanosegundos transcurridos desde las 0 horas del 1 de enero de 0001.

Entonces tenemos que:

  • 1 Tick = 100 nseg;
  • 1 seg = 10^9 nseg;

Entonces si queremos convertir un DateTime a UnixTime, recordamos nuestra clase de unidades de medida y conversiones, que si mal no recuerdo, un sólo profesor me explico bien ese tema, y aquella vez entendí porque al multiplicar velocidad(m/s) por tiempo (s) te da la distancia recorrida (m) o lo entendí solo, bueno en este momento lo importante es que lo sé :D,y como decía, aprendí que no tenía que hacer fichas que recordar las formulas para los exámenes, bastaba con saber las unidades de medida que te daban y el resto estaba hecho, aunque si trabajabas con velocidad instantánea, las derivadas eran otro tema. Otro tip, es que al usar unidades en cualquier operación puedes descubrir errores en el copiado de una fórmula, que si multiplicas pisco peruano por jarabe de goma no te va dar pisco a al cuadrado, pero si te da un verdadero Pisco Sour piñas por papayas no te va dar piñas al cuadrado, a lo mucho te puede dar un buen jugo :).

Volviendo al tema, utilizando la misma regla de conversiones que usaba en la universidad, tenemos que: si queremos ir de DateTime, usaremos la medida en Ticks (Y ticks), a UnixTime (X seg) en segundos, o viceversa:

Pero ahora llevémoslo a funciones, en C# :d:

Conversión de DateTime to UnixTime

En un programa del tipo consola podemos hacer esto, o si tienes el .NET Framework instalado, y le echas mano al notepad++, también puedes hacerlo:

Variables comunes:

   1: static Int64 SecInNasec = Convert.ToInt64(Math.Pow(10, 9));
   2: static Int64 OneTick = 100;
   3: static Int32 AnioBase = 1970 - 1;

Y aunque es que difícil que los datos de este formato cambien, así lo veo más ordenado. Ahora vayamos con la función para convertir un DateTime a Unixtime:

   1: public static Int64 ToUnixTime(DateTime dateTime) 
   2: {
   3:    DateTime time = dateTime.AddYears(-AnioBase);
   4:  
   5:    Int64 unixTime = (time.Ticks*OneTick)/SecInNasec;
   6:  
   7:    return unixTime;
   8: }

Le resto los años de diferencia, ya que recuerden que Ticks es desde el año 1 en cambio UnixTime desde el año 1970. Después multiplico los ticks de la fecha, por 100 nseg/ticks, y por último lo dívido entre 10^9 nseg/seg, quedando el resultado en segundos :D.

Ahora para la función para convertir un Unixtime a DateTime quedaría así:

   1: public static DateTime FromUnixTime(Int64 unixTime)
   2: {                  
   3:    DateTime time = new DateTime((unixTime*SecInNasec)/OneTick);
   4:  
   5:    time = time.AddYears(AnioBase);
   6:  
   7:    return time;
   8:  
   9: }

Multiplicamos los segundos del unixTime por 10^9 nseg/seg, y eso lo dividimos entre 100 nseg/ticks, quedando el resultado en ticks :D, que es lo que necesita el constructor del DateTime para crear una fecha, pero recuerden que los segundos era del año 1, por eso hay que agregar los años de diferencia :).

Y por último para probar nuestra funciones en el main:

   1: static void Main(string[] args)
   2: {
   3:  
   4:    Int64 unixOriginal = 1183875671;
   5:    DateTime commonFormat = FromUnixTime(unixOriginal);
   6:    Int64 unixNow = ToUnixTime(commonFormat);
   7:  
   8:    Console.WriteLine("nombre original: {0}", 
   9:             unixOriginal);
  10:    Console.WriteLine("en fecha normal: {0}, y la hora: {1}",
  11:             commonFormat.ToLongDateString(),
  12:             commonFormat.ToLongTimeString());
  13:    Console.WriteLine("unixStamp original: {0}", 
  14:             unixNow);
  15:  
  16:    Console.ReadLine();
  17:  
  18: }

Otros post relacionados:

P.D.: Por cierto en UnixTimeStamp.com, calcula el Unixtime pero en -5 GMT, y antes de que empiecen a pifiar si notan que el algoritmo de esta entrada no coincide con ese resultado :D, prueben poniendo 1 en esa web para que se den cuenta.

Saludos,

Post cruzado

Raro, raro, raro (II parte) – VWDExpress (esp), VS2005(eng), y VS2005 SP1 (eng)

Continuando la saga de nuestro amigo Luis. También tuve el mismo problema de las plantillas y aunque antes no le hacía mucho caso al problema porque siempre habría un proyecto ya creado, dado ya que el incoveniente es sólo que no aparecen las plantillas, pero no debería haber otro problema con alguna otra feature. Pero hoy tuve la necesidad de crear una aplicación consola, para unas pruebinhas, pero recordé que no tengo las plantillas de los proyectos y entre solucionarlo o picar código en notepad++, o ver algunos videos de Simone Simons y esperar a que se arregle solo, me animé por buscar el post de Luis.

Antes de dar lo que solución el problema en mi caso, les cuento mi escenario:

  • Tengo una partición con Windows XP en espaniol.
  • Instale Visual Web Developer Express en espaniol.
  • Instale ASP.NET AJAX.
  • Instale Visual Studio 2005 Professional en inglés. En este punto tenía todo el Visual Studio 2005 en el idioma espaniol, los menús y eso. Pero no veía las plantillas para crear Sitio Web AJAX, aunque podría crear un sitio web sin AJAX y agregarlo a mano, quería todo funcionando bien.
  • Instale Visual Studio 2005 SP1 en inglés. Y cuando creía que todo estaba solucionado, ya que podía crear sitios web con AJAX, el problema era que ahora no veía ningún otro proyecto, sólo podía crear un Sitio Web de Ajax, no sitios web, no windows, no C#. Así que decidí dejarlo así, ya que por lo menos cargaban las soluciones ya creadas sin problemas.
  • Desinstale el paquete de idioma de los .NET Framework que tenía, siguiendo los consejos de Rodrigo Corral. Y esto debido a que tenía algunos errores, pero aparecían en español. Ahora tenía los errores en ingles, y pensé que con eso también solucionaba mis problemas de las plantillas de Visual Studio, pero nada.
  • Hoy que necesitaba crear una appConsola, decidí revisar el post de Luis. Y seguí los consejos del friki Carlos Segura. Me fui a Visual Studio, herramientas, opciones, Configuración Internacional, y seleccione English (esta en “Igual que en Microsoft Windows“):

Con esto ya no tengo ningún problema y veo las otras plantillas al momento de crear proyectos con Visual Studio 2005. En un rato posteo la pruebhina que necesitaba hacer :).

En este caso sólo era problema de idiomas, pero para problemas donde tu Visual Studio esta corrupto, no tanto como la persona que lo instala, puedes leer este post del amigo Bruno.

P.D.: Bruno, espero que le den duro a los brazicas.

Saludos,

Post cruzado 3Dev Blogs