viernes, 26 de diciembre de 2008

Donde están las bases de ejemplo de SQL Server 2008??

Si instalaron SQL Server 2008 y notaron que no se instaló ninguna base de datos de ejemplos, a no desesperar, las mismas se encuentran en el sitio opensource de Microsoft, codeplex, mas exactamente en:

http://www.codeplex.com/MSFTDBProdSamples/Wiki/View.aspx?title=Installing%20Databases&referringTitle=Home

martes, 23 de diciembre de 2008

Utilidades Imprescindibles para .NET

Aquí publico un listado de utilidades, frameworks y otros programas que yo considero imprescindibles para los desarrolladores .NET y espero que ustedes puedan agregar las que crean que faltan en el listado:

1) .NET Reflector: http://www.red-gate.com/products/reflector/
Un clásico. Permite descompilar y analizar ensamblados .NET, analizar las clases constituyentes, ver sus métodos, MSIL.























.

2) Autocode: http://www.devprojects.net/
Gratuito.
Es un add-in para Visual Studio .NET que automatiza tareas repetitivas y permite generar código, refactorizar, ejecutar acciones del IDE o cualquier otro comando. Altamente recomendable, una herramienta imprescindible para .NET.





















3) CodeSmith: http://www.codesmithtools.com/
Otro clásico, templates (plantillas) para generar código en distintos lenguajes y con distintos objetivos. ( C#, Java, VB, PHP, ASP.NET, SQL, etc.).
No es gratis, pero es muy util.

4) .NET Memory Profiler: http://memprofiler.com/
Tampoco es gratis, pero permite determinar y optimizar el uso de la memoria en programas realizados en .NET.

5) QuickCode.NET: http://www.mobzystems.com/
Además de QuickCode, Gratuito, la página tiene un montón de utilidades mas, muy interesantes la mayoría de ellas, recomiendo mirar la página.

6) Snippet Compiler: http://www.sliver.com/dotnet/SnippetCompiler/
Gratuito.

7) FxCop: http://blogs.msdn.com/fxcop/archive/2008/08/19/fxcop-1-36-released.aspx
Gratuito. Otro imprescindible y clásico.
FXCop es una herramienta de análisis de código para .NET desarrollada por GotDotNet. Lee ensamblados (dll o exe) directamente para hacer el análisis.
En la actualidad está migrándose a la MSDN y se está integrando con la versión 2008 del Microsoft Visual Studio .Net (ORCAS), pero se puede usar desde cualquier versión de Visual Studio.

8) NUnit: http://www.nunit.org/index.php
Gratuito. La implementación .NET del Framework de testing de java unit, imprescindible en la arquitectura TDD.

9) NDoc: http://ndoc.sourceforge.net/
Gratuito. Genera documentación para los ensamblados .NET.

10) NAnt: http://nant.sourceforge.net/
Gratuito. Portado del Ant de Java, permite automatizar los procesos de compilación y Builds de los aplicativos.

11) PInvoke.NET add-in: http://www.pinvoke.net/
Permite encontrar y determinar las llamadas a win32 y apis desde código manejado (.Net).

12) Regulator: http://sourceforge.net/projects/regulator/
http://regulator.sourceforge.net
Herramienta de testeo de expresiones regulares, muy bueno.

13) Asp.NET Version Switcher:
http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx

14) Resharper: http://www.jetbrains.com/resharper/
No solo refactoriza código, es una herramienta multipropósito.

15) NHibernate: http://www.hibernate.org/343.html
Framework de persistencia de datos, heredado del Hibernate de Java, con soporte para múltiples bases de datos. Ya se que existe Linq, pero todavía está verde, en cambio Hibernate ya viene con un camino recorrido y además es una tecnología abierta multiplataforma, multi-base de datos. Además parece que Linq to SQL está moribundo, de modo que yo me sigo quedando con Hibernate, además como también programo algunas cosas en Java, con Hibernate puedo programar exactamente lo mismo en un lenguaje (C#) que en otro (Java).

Hasta aquí la lista, espero que puedan agregar las herramientas que crean conveniente.


Hugo Bernachea
http://www.linkedin.com/in/bernachea
MCSD / MCDBA / MCT

domingo, 26 de octubre de 2008

Nothing y DBNull.Value en Visual Basic.NET

Que diferencia hay entre Nothing y DBNull.value???

Mucha gente está bastante confundida acerca de este tema y no son pocos ciertamente los que lo están. Vamos a tratar de esclarecer en forma rápida y concreta este tema.

La palabra clave Nothing sirve para especificar o asignar que un variable de tipo referencia no está apuntando a nada, no está instanciado objeto alguno para dicha variable.

DBNull.Value en cambio es un objeto que se usa para indicar que un tipo (type) de un campo de base de datos es de valor nulo (Null).

Yo creo que esta común confusión tiene su origen en las versiones anteriores de VB, ya que contaba con un sinnumero medio de especificar estados de variables (nothing, empty, null, ismissing, "", etc).


jueves, 2 de octubre de 2008

Casteo Dinámico de tipos (type)

Estaba haciendo un código con un toque de reflection.
Necesitaba un casteo entre tipos que se iban a resolver solamente en tiempo de ejecución, de modo que el casteo común y corriente no me servía. Después de dar un par de vueltas fuí a los mas simple, la clase Convert y su método ChangeType, tal como aparece a continuación.

string tipo = "System.Int16";
object objeto1 = "345";
object objeto2 = Convert.ChangeType(objeto1, Type.GetType(tipo));
Type t = objeto2.GetType(); // y aca tengo el tipo del system.int16 nuevamente

Comentarios:
objeto.GetType devuelve el tipo de un objeto existente.
gettype(type) devuelve el tipo de un tipo indicado especificamente
y
Type.GetType(String) devuelve el tipo que le indicamos en el string.

domingo, 21 de setiembre de 2008

Generación de Código con MyGeneration

Generadores de Codigo

Un generador de código permite agilizar el desarrollo de aplicaciones, yo lo estoy utilizando con un proyecto pequeño para ver que resultados obtengo.
Hasta ahora he logrado ahorrar tiempo y a la vez programar dentro de todo algo prolijo, es una buena forma de no caer en la típica programación con toda la logica pegada a la interfaz al estilo VB6 cuando necesitas hacer algo rápido. Asi queda algo elegante sin que ello nos involucre horas y horas de programar capas.
La aplicación que utilice para hacer esto se llama MyGeneration esta aplicación permite utilizar distintos templates que escriben código, vos podes armar el tuyo o usar alguno de los que ofrece entre ellos dOOdads y NHibernate, el último es muy conocido en el mundo de java.
Yo opte por probar con dOOdads, que por medio de una jerarquia de herencia te permite crear clases que mapean contra las tablas de tu base de datos para que después puedas usarlas de esta forma:

// Load and Save
Employees emps = new Employees();
if(emps.LoadByPrimaryKey(42))
{
emps.LastName
= "Just Got Married";
emps.Save();
}

// Add a new record
Employees emps = new Employees();
emps.AddNew();
emps.FirstName
= "Mr.";
emps.LastName
= "dOOdad";
emps.Save();



// After save the identity column is already here for me.
int i = emps.EmployeeID;
Les comento a grandes rasgos los pasos que hay que hacer para que salga andando:
1) bajar MyGenerator desde sourcefoge que es donde esta la última version del generador y del template.(acá el link http://sourceforge.net/projects/mygeneration )
2) Una vez instalado el programa necesitaras tener una base de datos bonita y lista para mapear hacia objetos.
3) La arquitectura de oddododos (o como se escriba) tiene los siguientes modulos:
a- un proyecto que tiene las clases bases que van a implementarse luego por el generador de código
b- los procedimientos almacenados que utilizan las clases para guardarse en la base de datos
c- un conjunto de vistas en la base de datos que debes crear para utilizar datos relacionados de forma eficiente.
4) Entonces para que esto ande primero tenemos que agregar a nuestro proyecto el proyecto de arquitectura de dOOdads, el mismo se encuentra en C:\Program Files\MyGeneration\Architectures\dOOdads\CSharp para la version C#.
5) Una vez que elegimos cual es la base de datos a usar tenemos que marcar la clases de la carpeta C:\Program Files\MyGeneration\Architectures\dOOdads\CSharp\MyGeneration.dOOdads\DbAdapters que vamos a usar (ver los prefijos) para que compilen. Para ello la seleccionamos y en el cuadro de propiedades la maracamos para incluirla en el build.

En la imagen muestro las dos clases que abría que cambiar la propiedad "Build Action" para que compile un proyecto con base de datos SQL Server 2000 o 2005.

6) una vez que tenemos el proyecto referenciado, vamos a generar nuestras clases de negocio. Para ello iniciamos mygeneration configuramos la cadena de conexión hacia la base de datos que vamos a mapear y procedemos a buscar en el arbol de la izquierda los templates a usar.

7) para crear las clases de negocios usamos el template dOOdads Business Entity que se encuentra bajo la rama c# de dOOdas. Este template les genera clases abstractas, si quieren las concretas también hay que hacerlo con el mismo método.
La idea de las clases concretas bobas es que ahí metamos el código especifico de nuestras aplicaciones.
Si van a usar vistas para obtener datos relacionados con joins también se generan desde ese apartado.
8) Tambien necesitamos crear los procedimientos almacenados para eso elegimos la base de datos correspondiente en el arbol de template (por ejemplo Microsoft SQL Server) y corremos el template de dOOdad Stored Procedures. Esto escupe un monton de stores por cada tabla que son necesarios para correr las clases generadas por MyGeneration.
Aca esta bueno tocarlos un poco para que hagan lo que nosotros querramos, por ejemplo en mi caso modifique los deletes para que no borren sino que marquen un campo de baja, y toque también el procedimiento que trae todo para que solo traíga aquellos que no estan marcados como borrados.
TIP: si a cada columna le agregan un campo RowVersion de tipo timestamp, el template va a utilizarla para manejar la concurrencia de los updates y puede llegar a generarles una sentencia TSEQUAL que no compila en 2005, no se hagan drama cambienlo por un igual y sale con frítas.
9) Agregamos todo el código generado a nuestra solución de C#
10) Configuramos TransactionMgr para que obtenga una query string válida para nuestro aplicativo en la fúncion private IDbConnection CreateSqlConnection(BusinessEntity entity), donde pueden traerla directamente del app.config o web.config.

Y con eso ya tendríamos andando una elegante capa de datos completa en no mas de 30 minutos.
Cualquier cosa no duden en preguntar... en la página de mygeneration hay un pdf de 6 paginas que dice básicamente lo mismo que acá y esta práctico para ver como usar bien toda la interfaz que te da.
Por ejemplo tiene un generador dinámico de querys muy piola.

Eso es todo por ahora hasta la próxima espero que le sea útil a alguien....

nota original en: http://rodcode.blogspot.com/2007/08/generadores-de-codigo.html

sábado, 30 de agosto de 2008

Conversor de .NET a JAVA - Grasshopper

La empresa MainSoft (http://dev.mainsoft.com/) ha desarrollado una serie de productos, basicamente plugins para Visual Studio.NET, para convertir un aplicativo .NET en un aplicativo JAVA listo para ser instalado en Linux sobre un servidor Apache Tomcat.

Pueden encontrar el plugin listo para ser descargado en la página de MainSoft: http://dev.mainsoft.com/Default.aspx?tabid=177

Realmente este producto permite desarrollar en la herramienta de mayor conocimiento, usando el lenguaje de mayor experiencia y luego todo ese desarrollo migrarlo a Java en Linux con facilidad, incluso para aquellos que poseen escasa experiencia en esas plataformas.

Muy interesante !.

lunes, 14 de julio de 2008

Como manejar los eventos de botones creados dinámicamente en asp.net

Un amigo me consultó hace un par de días acerca de un problema que el estaba teniendo con una página en la que dinámicamente generaba unos botones, les atachaba los eventos click mediante addhandler pero en tiempo de ejecución la página aspx ignoraba olímpicamente dicha codificación.

La codificación era del siguiente estilo:


Dim btnBoton As New Button
btnBoton.Text = "Click en este botón"
Page.Controls.Add(btnBoton)


Una vez que el botón está en la página no hay forma de hacer que responda al evento click.

No podía creer que algo tan sencillo no funcionase, de modo que empecé a buscar en todo internet, aunque me imaginaba que si agregaba un campo oculto y registraba la propiedad correcta todo iba a funcionar.

Entonces, primero hay que registrar un campo oculto en la página.


Page.ClientScript.RegisterHiddenField("BotonOculto", "")


Despues definimos el botón en forma dinámica.


Dim miBoton As New Button
miBoton.Text = "Click en este boton"


Y el secreto agregar desde el lado servidor un attribute al lado cliente que directamente envie el submit de la página mas el botón clickeado


objButton.Attributes.Add("onClick", & _ "document.forms[0].BotonOculto.value='" & _
miBoton.UniqueID & "';document.forms[0].submit();")


Bien drástico y concreto, uso el Dom y envio el submit desde el evento onClick previamente registrado.

Finalmente agrego el control a la coleccion de controles de la página.


Page.Controls.Add(miBoton)


Lo unico que resta es tomar en el postback que genera dicho botón el valor del item correspondiente y listo.

Entonces en el postback:


If Page.IsPostBack Then
If Request.Item("botonOculto").Length > 0 Then
Response.Write("Usted clickeó en el botón " & _
Request.Item("botonOculto") )
End If
End If


Línea mas, línea menos, así es como debiera quedar la cosa.

Y problema resuelto !

martes, 8 de enero de 2008

configurando Web.Config para Web Parts

Recuerden que para trabajar con WebParts deben crear la base aspnetdb por medio del utilitario de línea de comando: aspnet_regsql
Una vez creada dicha base de datos debemos agregar las siguientes líneas en el web.config:






























(En caso de no poder visualizar la imagen clickear sobre la misma, lo cual provocará que se cargue la imagen por completo).

Con todo esto ya debieran funcionar nuestros webs con web parts