[SQL] Forzar uso de índices en SQL 2005 Express

15 01 2009

Hola a todos,

Luego de un tiempo sin escribir he decidido hacerlo de nuevo, para no olvidarme las cosas que voy aprendiendo en el día a día.

Hoy un amigo Sebastían Flores, me ayudó a probár que mi SQL Server 2005 Express realmente tenía un índice creado, pero que no lo usaba por considerarlo peor que un Index Scan.

En SQL Server 2000, si creaba el índice lo usaba aunque tuviese que hacer un Bookmark Lookup más costoso que un Index Scan.

La forma de forzar el uso de un índice en SQL es:

SELECT * FROM tblTaskProcesses (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND processid IN (8,32,45)
http://blogs.msdn.com/apinedo/pages/mejorar-el-rendimiento-de-queries-en-sql-server.aspx




[Development] Algoritmos de ordenamiento

18 09 2008

En el post de Scott Hanselman’s Computer ZenBack To Basics: Algorithms and Going Back To Virtual School

Una página que muestra gráficamente animaciones de como proceden diferentes algoritmos de ordenamiento. Realmente genial!

http://vision.bc.edu/~dmartin/teaching/sorting/anim-html/all.html

Saludos!





[HUMOR] Si la gente comprara autos como compra computadoras

18 09 2008

Luego de leer el post de Angel “Java” Lopez – Noticias y enlaces II visté el post Good If People Bought Cars Like They Buy Computers y es EXCELENTE!!!!

Saludos!





Mi primer plugin de jQuery = jQuery.dotNet

5 09 2008

Hola a todos,

En esta oportunidad lo que hice es un plugin para hacer llamadas a métodos .NET, ya sean Web Services o Page Methods de la forma más simple posible.

Ya que para llamar a los Web Services .NET exige un par de configuraciónes especiales que pueden encontrar aquí. Entonces lo que me propuse fue hacer un plugin que haga las llamadas más simple al estilo de $.getJSON(url, data, callback).

Bueno el plugin lo que hace es tan simple como:

$.callDotNet(”GetCustomer”, “{ customerId: 1}”, onCustomerLoaded)

function onCustomerLoaded(customer){

     alert(”Name: ” + customer.Name);

}

Esto nos permite casi transparentemente obtener ya los objetos con el json parseado y manipularlos de JavaScript.

El proyecto lo pueden encontrar en: http://code.google.com/p/jquerydotnetplugin/

Y mantenganse al tanto que habrá más plugins! :)

Saludos, y happy coding!!





[AJAX] Resolviendo el error "Invalid Label" tras la llamada de eval(JSON)

28 08 2008

Hoy después de renegar un buen rato integrando jQuery, JSON.Net y ASP.NET me encontré que el string JSON no lo podía evaluar del lado del cliente. FireFox me tiraba un error “Invalid Label” luego de renegar mucho encontré esta solución en willCode4Beer.com (http://willcode4beer.com/tips.jsp?set=jsonInvalidLabel)

Sólo basta con encerrar el string con el JSON entre paréntesis de la siguiente forma:

var someJsonString = getDataFromServer();
var myObj = eval( “(” + someJsonString + “)” );

en lugar de:

var someJsonString = getDataFromServer();
var myObj = eval(someJsonString);

Saludos, y happy coding!





[SQL] Insertar valores en una Identity PK

26 08 2008

Ya que estamos con el tema de las identities PK, aprovecho para hacer este post de ayuda memoria.

Para insertar valores en columnas Identity hay que hacer:

SET IDENTITY_INSERT ON [myTable] ON

y luego de hacer los inserts correspondientes apagar esto con

SET IDENTITY_INSERT ON [myTable] OFF

And happy coding!

Saludos!





[SQL] Reiniciar los valores de una Identity PK

26 08 2008

Hoy me ecuentro haciendo una migración de un sistema, para que cumpla con los estándares PCI DSS.

Al realizar una herramienta de migración, me contré con que necesitaba reiniciar la columna Identity de la tabla en SQL, tras varios intentos.

Luego de leer Can I start IDENTITY values at a new seed?, la forma de lograr esto es:

DBCC CHECKIDENT(’myTable’, RESEED, 0)

And happy migration!

Saludos!





[NHibernate] Cómo crear claves únicas

21 08 2008

Esta vez aprovecho para contar como crear claves de varías columnas en NHibernate.

Hace ya un tiempo que estoy leyendo y practicando con este ORM, ya que es el ORM recomendado por el movimiento ALT.NET, y realmente es genial para desarrollos Domain Driven Development.

Lo que estoy haciendo es generando el schema de la DB a partir de la clase SchemaExport de NHibernate. Mediante esta clase genero los scripts DDL necesarios para crear el schema de la DB partiendo de los archivos .hbm de mapeo.

Realmente estoy más que conforme con esta herramienta por lo flexible y orientada a aplicaciones de mediana a grande complejidad.

Bueno vamos al motivo del post :)

En este caso tengo una tabla de aplicaciones y otra de usuarios. Un usuario pertenece a una aplicacion y su username no se puede repetir. Esto nos lleva a tener que crear en la tabla usuarios una unique constraint que tenga como columnas a ApplicationId y a Username. Esto lo podemos hace en el archivo de mapeo de NHibernate usando el elemento <column ../> hijo del elemento <property …/> y definiendo el atributo unique-key.

El archivo de mapeo quedaría como sigue:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<hibernate-mapping xmlns=”urn:nhibernate-mapping-2.2″
                   assembly=”WPoch.Common.Providers.Membership”
                   namespace=”WPoch.Common.Providers.Membership.Domain”>
  <class name=”User” table=”`User`”>
    <id name=”Id”>
      <generator class=”guid” />
    </id>
    <property name=”Username”>
      <column name=”Username” unique-key=”uq_User_Username”/>
    </property>
    <property name=”Password”/>
    <property name=”Comment”/>
    <property name=”CreatedOn”/>
    <property name=”Email”/>
    <property name=”FailedPasswordAttempsCount”/>
    <property name=”FailedPasswordAttempsWindowStart”/>
    <property name=”IsAnonymous”/>
    <property name=”IsApproved”/>
    <property name=”IsLockedOut”/>
    <property name=”LockedOutOn”/>
    <property name=”LoggedOn”/>
    <property name=”PasswordChangedOn”/>
    <many-to-one name=”Application” cascade=”all” not-null=”true”>
      <column name=”ApplicationId” unique-key=”uq_User_Username” />
    </many-to-one>

    <set name=”Roles” lazy=”true” cascade=”all” table=”UserRole”>
      <key column=”UserId” foreign-key=”fk_UserRole_User” />
      <many-to-many class=”Role” not-found=”exception” column=”RoleId”/>
    </set>
    <bag name=”ProfileProperties” lazy=”true” table=”UserProfile”>
      <key foreign-key=”fk_UserProfile_User”>
        <column name=”UserId” unique-key=”uq_UserProfile_Name”/>
      </key>
      <composite-element class=”ProfileProperty”>
        <parent name=”User”/>
        <property name=”Name” not-null=”true”>
          <column name=”Name” unique-key=”uq_UserProfile_Name”/>
        </property>
        <property name=”ValueType” not-null=”true” type=”Type”/>
        <property name=”ValueSerialized” type=”StringClob”/>
        <property name=”UpdatedOn” />
      </composite-element>
    </bag>
  </class>
</hibernate-mapping>

Como verán estoy desarrollando Membership, Role y Profile Providers de ASP.Net usando NHibernate de fondo, ya que lo que viene por defecto no es de mi agrado y acopla bien con los sistemas que estoy desarrollando.

Cuando tenga algo más avanzado, lo publicaré en la web.

Saludos,

Technorati Tags:





[CodingHorror] El primero de la lista :)

30 05 2008

Hace un tiempo vengo trabajando en uno de esos proyectos que uno hace, y empieza a crecer y crecer y se tiene que terminar para ayer. Que luego reza para no tener que seguir y se lo pasen a otro, bueno en este caso yo soy el “otro”.

Me llegó el proyecto, bastante complejo por cierto, y lo analicé por un rato. Luego voy a ver las tablas de la DB a ver si me “contaban” un poco como estaba hecha la solución y…. OHHHHH!!!! las tablas no tenían ni primary keys ni foreign keys!!!, no empezamos bien no?…

Luego de modificar las tablas y agregar las relaciones para mantener una integridad referencial, voy a modificar el código para soportar algunos valores nulos que surgieron de este refactoring de la DB. Que me encuentro??? Cáda módulo (aprox 12) tenía su propia capa de acceso a datos!!!!, había que modificar los 12 módulos!!!!!!!, y todo mezclado código generado a mano con otro autogenerado con CodeSmith :’(. Veo unas clases parciales, LA SALVACIÓN!, digo bueno los métodos creeados a mano estan en las clases parciales que decían <Clase>.exteder.vb, reviso y…. EN BLANCO!, si los métodos creados a mano estaban en las mismas partial clases que los autogenerados.

Bueno, luego de renegar, hacer un único acceso a datos y refactortizar un poco, me contré con esto, que fue el motivo del post:

If isPageIndexChanging And 1 < 0 Then    dv.Sort = String.Format("{0}
{1}", Me.SortExpression, Me.SortDirection)Else    dv.Sort = String.Format("{0}
{1}", Me.SortExpression, Me.SortDirection)End If

Donde vemos la hermosa coparación lógica 1 < 0, y que las dos sentencias del If son iguales :)

Excelente!!!

PD: No hagan esto en sus aplicaciones…





Alternativa al Tren Bala, el Tren para TODOS

18 05 2008

Revisando los email me contrè con un foward acerca de algo que ya habìa leido, pero esta vez con una iniciativa concreta.

Un sitio web para registrarnos y “firmar” virtualmente, una petición para que se tenga en cuenta la iniciativa un Tren para Todos.

Si son de Argentina van a saber de lo que estoy hablando y sino obvien este post. Le pido a todos los argentinos que aunque sea sumemos esfuerzos, que entre todos, por mìnimo que sea el esfuerzo simamos fuerzas.

El sitio es: TREN para TODOS (http://www.trenparatodos.com.ar).