martes, 26 de mayo de 2009

SELECT provider FROM Microsoft WHERE operator LIKE "incompatible"

Me estuve dando de topes un par de días por una sentencia SQL que no hacía justicia, hasta que recién encontré el problema.
Mi aplicación web está en ASP .NET conectándose a unas tablas de Access por medio del motor Microsoft Jet (OLE DB). La cosa es que necesitaba sacar datos con una sentencia SQL tipo:
SELECT * FROM tabla WHERE dato LIKE "N#-00#"

Es decir, los registros de tabla donde dato tuviera un dígito después de N y otro al final de la cadena, después de -00. Construí la consulta y la probé directamente en Access, los registros que arrojó eran los que yo esperaba y felizmente pasé esa consulta a mi código en C#, cuando... ¡Oh sorpresa! Acá la consulta no me arrojaba ningún registro como resultado. Entonces empieza el dolor de cabeza, me doy cuenta de que la consulta está idéntica a la otra que me funciona, caracter-a-caracter.
Finalmente se me ocurrió que podía ser algún capricho de compatibilidad, de esos que a Microsoft no se le dan casi (!?). Encontré un dato interesante: Microsoft Jet maneja sus propios comodines para el uso de este operador, valiéndole gorro el estándar ANSI en donde se especifican los lineamientos de SQL. Ya antes había lidiado con sustituir * por % para tomar cero o más caracteres. Otros tienen que ir entre corchetes para que puedan ser reconocidos. Acá un link con los detalles.

Ya no me gusta ASP .NET para las aplicaciones web. Trabajaría muy a gusto con PHP, pero necesito precompilar código para proteger mi código fuente, cosa que no he encontrado cómo hacer sin meterle billetes a un servidor. Si alguien conoce una alternativa a esto, por favor dígame.

No hay comentarios: