Resultados de la búsqueda Personalizada

|



Problemas con SSL y WCF??


Un gran problema que normalmente se presenta cuando se usa SSL para las comunicaciones es que por supuesto no se cuenta con un certificado SSL valido, claro en los exploradores uno tiene la opcion de entrar indicandole al explorador que uno asume el riesgo, pero con WCF esto no puede ser hecho, asi de facil :)

El truco esta en hacer que el metodo que inspecciona la validez del certificado sea sobrecargado o a su vez sobrepuesto por otro (override), como? Hay una par de posibilidades:

1. Crear un metodo con el delegado RemoteCertificateValidationCallback

Este delegado hace que en el evento de ServerCertificateValidationCallback se ejecute la validación que uno quiera, entonces se crea un metodo como este:

public class clsCertificatePolicy : ICertificatePolicy
{
public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
{
return true;
}

public static bool RemoteCertificateValidationCallback(object sender, X509Certificate certtificate, X509Chain chain, SslPolicyErrors errors)
{

//Aqui las validaciones, yo siempre acepto el certificado, no lo hagan en casa!!
return true;
}
}

Y claro hay que ponerlo como manejador del evento:

ServicePointManager.ServerCertificateValidationCallback =
clsCertificatePolicy.RemoteCertificateValidationCallback;

Este claro debe estar antes de la o las llamadas, les aconsejo lo agreguen en un lugar general, es decir por ejemplo cuando su aplicación inicia.

Pero hay un metodo aun mas facil:

2. Usando una expresion lambda lo podemos hacer asi:

ServicePointManager.ServerCertificateValidationCallback =
((sender, certificate, chain, sslPolicyErrors) => true);

A quien se le ocurrio las epxresiones lambda deberia ser premiado!!

Espero que les sirva…

P.D.: No fui muy explicito en algunos detalles, la clase que propongo debe estar junto al proxy cliente que se usa para la comunicacion del cliente WCF hacia el servidor, y la asignacion del manejador del evento deber ser hecha en lo posible cuando inicia el programa, antes de usar el cliente WCF, solo tiene que ser hecha una sola vez!

Cualquier duda por favor avisenme!

Performance Counters de WCF

|

Desde que se inventaron esos famosos contadores de rendimiento que incorpora Windows definitivamente la vida de los desarrolladores se volvio mas clara!! Uno puede saber muchas cosas, como por ejemplo cuantas llamadas se hace por segundo al servicio, o a un endpoint especifico, o aun metodo especifico!! No les agradaria?? Pues a mi me sirve mucho para las tareas de mejoramiento y para entender como se estan comportando los servicios y los clientes de los mismos claro, realmente muchos datos para tan poco tiempo!!!

Como se los habilita? En el config de su aplicacion dentro del tag ServiceModel le agregan esto:

<diagnostics performanceCounters="All"/>

Como es de esperarse los contadores de rendimiento que se habilitan son los llamados ServiceModel (En las lista de contadores salen como ServiceModelEnpoint, ServiceModelOperation y ServiceModelService 3.0.0.0), ahi depende de las instancias que tengas podras ver contadores como llamadas por segundo, duracion de la llamada, etc.

A mi me ha resultado muy util, espero que a ustedes tambien!!

AI Framework con nuevo Release: v0.1.1

|

Pues si, a pocos dias del primer release, pues hubo que hacerle algunos ajustes, como por ejemplo reconstruir la base de datos de ejemplos para poder usar la forma de prueba de la red de Hopfield, asi mismo agregar algunas funciones de activacion extra para las neuronas, la de identidad hace que las neuronas sumen sus entradas!, arreglar que las cadenas de conexion a la base sean configurables desde el archivo de configuracion, etc…

Con esto espero que sea mucho mas usable el Framework asi la gente se interese mas y sea mas claro el uso que se le puede dar a este, si desean verlo esta aqui.

Espero que les sirva y si tienen algun comentario o desean saber mas del uso del Framework pues solo contactenme!!

Servicio de backup en linea

|

Hace tiempo que andaba buscando un servicio de backup, que me permita realmente olvidarme de que tengo que hacer backups, siempre uno no tiene esa costumbre de realizar respaldos a conciencia, y cuando menos se lo espera, puff!! Se robaron la compu, se daño el disco duro, formateamos la maquina, cayo virus, etc....

Y justo ahi es cuando nos damos cuenta de la importancia de un respaldo...

Con la afluencia de los servicios en linea se ha abierto muchos de backups, no todos son gratis u ofrecen muy poco espacio, pero este definitivamente fue ideal...

Encripta tu informacion antes de subirla con un algoritmo Blowfish de 448 bits, virtualmente imposible de romper, y lo hace todo en aproximadamente una hora, es decir vas al almuerzo y cuando vuelves voila!! Tu vida digital esta a salvo!!

No conforme con eso puedes personalizar todo lo que quieras respaldar, para mi caso mi codigo fuente por su puesto, y tambien lo que no quieras respaldar, no solo funciona en Windows si no tambien en MacOS lo cual es una amplia ventaja competitiva!!

Si se animan aqui esta el link: https://mozy.com/?code=FN8WH3 con eso ustedes reciben 2.2GB de almacenamiento y a mi tambien me dan un poco mas de espacio para los backups, olvide mencionar que te dan 256MB gratis por cada nuevo usuario que refieres?? Y sin limite de referidos?? Interesante verdad?? Pero si quieres tener espacio ilimitado puedes pagar como 5$ al mes y listo! Espacio ilimitado!!

Es una buena precaucion tener este servicio, no cuesta y te traera la paz mental que necesitas!!!

Ojala les sirva!!

Artifitial Intelligence Framework Project

|




Con un inmenso gusto quiero contarles que he publicado un proyecto llamado Artifitial Intelligence Framework en CodePlex!!




Asi como cada hombre durante su vida deberia plantar un arbol, cada desarrollador deberia crear un proyecto Open Source en su carrera, el AI Framework es un trabajo que tengo hace algun tiempo y he querido compartir con todos, y bueno de que trata??




Es un conjunto de librerias en C# 2.0 que permiten crear redes neuronales como uno desee, sin limites, asi mismo se puede recrear famosas redes neuronales como la de Hopfield o la maquina de Bolts con un poco de esfuerzo, y mas que nada es completamente gratis!! Cuando era estudiante para hacer ese tipo de software era pagado, y un dia para hacer un proyecto me toco desarrollar desde 0 toda la red neuronal, asi es que decidi de paso crearme algo un poco mas flexible...




Que se puede hacer con este proyecto??




- Crear y configurar tu propia red neuronal


- Entrenar tu red nuronal


- Probar tu red neuronal




Y asi mismo todo lo relacionado con las redes neuronales, por lo pronto no tiene una interface grafica para diseñar las redes pero lo voy a crear como un proyecto WPF, incorporarle Bloques de Aplicacion para mejorar la calidad del proyecto y cosas asi, ademas como es usual se necesita contribuidores!!




El link es http://www.codeplex.com/artint visitenlo y si tienen preguntas, sugerencias, comentarios o quieren ayudar pues con todo gusto!!


Comportamiento Extraño cuando haces commit con SQL Server y ADO .NET??

|

Hace algunos dias estaba buscando por que habia un comportamiento extraño en un software que desarrolle y estaba en produccion ya durante años, pero por cosas de la vida le cambiaron de servidor y como era de esperarse dejo de funcionar...
Lo que sucedia en escencia es que al dar commit en una transaccion sql, por medio del objeto SQLTransaction de ADO .NET, resulta que daba errores como el siguiente: "
This SqlTransaction has completed; it is no longer usable" o "
System.NullReferenceException", la verdad no sabia que pasaba, segun yo el software no fue modificado para nada asi es que le heche la culpa a la base de datos!! Busque tanto que era lo que pasaba y di con algunas posibles explicaciones como por ejemplo que SQL Server no tenia los suficientes recursos y en consecuencia cerraba ciertas transacciones sin avisar, esto si pasaba en SQL 2000 pero lo parcharon, y ese tipo de cosas que suenan a veces un tanto extraordinarias...

No hay peor ciego que el que no quiere ver, asi reza el dicho, y es cierto, lo que sucede es que hace algunos años no era fanatico de lo que ahora se conoce como el Data Access Application Block de Enterprise Library, tenia una clase pequeña que hacia las veces de ese bloque de aplicacion, trataba claro que use las mejores practicas y todo, no se cuando sucedio pero tenia yo dentro de esta clase dos metodos que hacian commit o rollback a la transaccion, y se veian algo asi:


public static void CommitTran(SqlTransaction psqlTran)
{
psqlTran.Commit();
psqlTran.Connection.Close();
}

Pues resulta que nunca supe, aunque dedia suponerlo, que cuando uno usa el metodo Commit o Rollback de un Objeto SQLTransaction la conexion que usa se CIERRA!! y Claro en la segunda instruccion quiere cerrar la conexion que esta cerrada y ese es el origen del error!!
Que ciego!! Pase un buen tiempo luchando con esto por que tengo que agregar que no siempre se daba este error, lo cual es realmente extraño, pero como les digo solo hace falta el commit o el rollback, nada mas!! Entonces debe quedarles algo asi:


public static void CommitTran(SqlTransaction psqlTran)
{
psqlTran.Commit();
}

O mejor aun, usen el Enterprise Library con el Data Access Aplication Block, asi no cometeran errores como el mio!!!

Ojala les sirva!!

Alternativa a AutoCAD MAP??

|

Como en algunos posts mios pasados se ha notado, he luchado con el AutoCAD MAP 3D 2008 con algunos problemas, como por ejemplo que no funciona bien con Windows Vista hasta que le pones un Service Pack de AutoCAD via la actualizacion automatica, y claro la inmensa falta de soporte que se afronta, no hay un tutorial o algo que te ayude a iniciarte con el AutoCAD MAP y C#, quiero escribir un articulo sobre eso para que la gente se oriente espero terminarlo en estos meses, pero la verdad a ratos ha sido muy frustrante trabajar con los datos geoespaciales y todo...
En esas investigaciones de una alternativa el año pasado me encontre con algo interesante unos controles de ThinkGeo, pero en ese entonces no soportaban el acceso a una base geoespacial como Oracle Spatial, solo soportaban shapefiles lo cual en aplicaciones profesionales realmente no es practico, es decir 300 clientes sobre un solo archivo no es saludable, pero en estos dias he recibido una noticia muy alentadora, en la nueva version de los componentes de ThinkGeo ya se soporta el acceso a bases geoespaciales!! Y de verdad es muy sencillo usarlo, y que mas ventajas uno espera de esto? Simple, los costos pueden recortarse de una manera expectacular!! El costo de una liciencia de AutoCAD MAP 3D puede reemplazar la licencia de los componentes para un servidor web y dar servicio a muchos clientes con la funcionalidad que necesitan(cambiar los datos, mover los shapes, crear nuevos, etc.) y solo pones AutoCAD MAP 3D cuando de verdad lo necesitas!!

Creanme es de verdad una opcion genial esto, quieren una probada?

http://gis.thinkgeo.com/Products/MapSuite30Roadmap/tabid/636/Default.aspx

Ojala les sirva!!

ORA-03113 en .NET, que significa??

|

Como es de costumbre en una de mis implantaciones tuve un poco de problemas, en un principio todo iba bien hasta que subitamente la aplicacion se comportaba de un modo extraño, como si dejara de funcionar por momentos, revisando los servicios y los logs resulta que comenzaba a dar errores como el ORA-031315: connection lost contact seguido del ORA-03114: not conected to oracle, la verdad era muy extraño por que definitivamente todas las buenas practicas se estaban siguiendo, es mas la parte del manejo de datos recaia completamente en Enterprise Library 3.1, el driver que usaba era el standar de MS con un cliente Oracle 10.2.0.3, de cierto modo parecia que por alguna razon la base de datos desconectaba a quienes estuvieran como por un timeout, pues bien buscando un poco por los foros encontramos unos parametros de la base de datos que podrian ayudarnos un poco, estos estan en el archivo sqlnet.ora y no vienen escritos por defecto:

SQLNET.EXPIRE_TIME =10
SQLNET.INBOUND_CONNECT_TIMEOUT = 300
SQLNET.SEND_TIMEOUT = 300
SQLNET.RECV_TIMEOUT = 300

Al agregarlos el DBA dijo que solo hacia falta reiniciar el listener, yo la verdad por precaucion reiniciaria el servidor...

Con esto la verdad que se estabilizo bastante, por un rato... Como dije el DBA solo reinicio el listener de la base de datos, despues de otros ORA que aparecieron un tanto erraticos como por ejemplo un ORA-01041 que algunos reportaban como un bug en la base de datos, pues despues volvio a estabilizarse con un ORA-03113: end-of-file on communication channel, y ahora que?? Pues en ese punto ya estaba un poco complicado con la gente de infraestrutura por cuanto ellos insistian en que no hay nada raro en la red, bueno suponiendo eso todo estaba aun mas complicado por cuanto uno usa el pool de conexiones por defecto en .NET y claro no puedes mas que ajustar la cadena de conexion y/o ver los contadores de rendimiento, pero si subitamente las conexiones simplemente se desconectan?? pues las opciones anteriores no son muy valiosas las verdad, pues bueno conversamos un poco, intercambiamos experiencias y todo pero nada era eficaz contra el problema, y claro como normalmente sucede solo a mi aplicacion le pasaba esto y era un hecho que para la gente que maneja la infraestrutura demostraba que algo no estaba bien en mi codigo, de cierto modo tienen razon, pero en que parte!!!

Al dia siguiente se inicio una serie de pruebas que ya estaban fuera de este tema, y fruto de estas pruebas vi la luz!! Sucedio que estaba conectado a la dichosa base de datos con un TOAD, y otra maquina igual, despues de un cierto tiempo, que no medi, TOAD tambien me dio el mismo error un ORA-03113!! y en la otra maquina tambien!! genial!! por que no era el codigo!! Y que es?? Pues parece que entre la base de datos y los clientes existen un par de routers y firewalls, uno de ellos tenia por politica cortar las conexiones a ese servidor despues de un cierto tiempo, este comportamiento ya nos habian comentado que era el mas posible, a uno de los consultores en otro proyecto ya le habia pasado y nosotros no hicimos mas que dar vueltas!!
Soluciones a esto?? Pues hay un parametro en todo sistema operativo para que las conexiones TCP usen un metodo muy conocido llamado KeepAlive, el cual envia cada cierto tiempo una señal a indicar que esta vivo y claro con esto el Firewall las tomaba como conexiones activas, no tanto pero activas al fin, o cambiar las reglas del firewall para que no corte las conexiones bajo ciertas condiciones claro, entonces resumiendo:

Si tienen un error ORA-03113 en cualquiera aplicacion, en mi caso .NET, revisen si alguien no les esta cortando las conexiones!! Prueba simple? Pongan el servidor de base de datos en el mismo switch junto con la maquina que tiene el problema y revisen que no hayan firewalls molestando por ahi, definitivamente con esto pueden probar que su aplicacion esta bien!!

Preguntas? Comentarios? Con gusto los ayudo!!

Cliente WCF detras de un ISA Server o un ProxyServer??


Como siempre en esas cosas de la vida en un cliente requeriamos que uno de nuestros programas hechos con .NET, de hecho con .NET 3.5 y WCF, como cliente acceda a un Servidor, claro este cliente esta completamente bajo el control de un ISA Server 2004, y cuando queria acceder al servidor me daba el siguiente error:

When attempting to invoke any of the generated client class methods, we recieve the following error: "The remote server returned an unexpected response: (407) Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied. )."

Pero el resto de cosas funcionaban bien!! Internet Explorer, otros programas con acceso a la red y demas!! Que estaba haciendo mal??
Primero pues lo mas evidente, la configuracion de mi cliente en la parte WCF, si ustedes ven en la parte de la configuracion del binding en la seccion transport hay una propiedad llamada proxyCredentialsType en donde puedes decir que credenciales se pasan, claro pasa ISA Server se deben usar las credenciales Windows asi es que intente poner ahi la opcion y pues no no funciono... Mi binding quedaba algo asi

<binding name="wsData" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="4194304" maxBufferPoolSize="4194304" maxReceivedMessageSize="4194304"
messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="128" maxStringContentLength="10000000"
maxArrayLength="65536" maxBytesPerRead="8192" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientcredentialtype="None">proxyCredentialType="Windows"</strong>
realm="" />
<message clientcredentialtype="UserName" algorithmsuite="Default">
</security>
</binding>


Dando vueltas por ahi algunas personas tenian el mismo problema, pero lo mas frustrante es que nadie tenia una respuesta para esto, asi es que segui dando vueltas y en un foro encontre a alguien que si lo logro pero claro despues de una larga charla se llego a la conclusión de que se debia cambiar el machine.config para que se usen las credenciales por defecto, y esto se logra incluyendo estas lineas:

<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
</defaultProxy>
</system.net>

Entonces con esto es mejor reiniciar la computadora despues de esto magicamente el error desaparece!!

Una acotacion, resulta que el machine.config hay que buscarlo en la carpeta del framework 2.0, por que?? Recuerden que tanto Framework 3.0 y 3.5 son agregados al 2.0 por lo tanto el Framework base es 2.0, si no me creen busquen el machine.config en los otros folders y cuando lo encuentren miren detenidamente las secciones que estan al ultimo...

Ojala les sirva!!

Problemas con los Servicios Windows y .NET??

|

Por cosas de la vida en un proyecto de mi oficina usaron extensivamente Servicios Windows para una serie de actividades, asi mismo en produccion dieron muchos problemas, una compañera, Teresita Silva, hizo esta guia con su experiencia, yo algo contribui a solucionar los problemas pero revisen esto:

Después de que dos servicios Windows hecho por mí me han visto la cara… a continuación van algunos pasos que se deben verificar antes de perder tiempo:

Asegurarse que la versión del servicio instalado es el correcto.
Revisar la identidad que se encarga de la ejecución del servicio
La identidad debe tener todos los permisos necesarios que va a utilizar el servicio, por ejemplo:
i. Escribir en directorios del disco duro
ii. Acceso a Internet

Hay dos partes donde se configura la identidad cuando es un servicio que se inicia desde una página Web:
i. La identidad del servicio propio
ii. La identidad del grupo de aplicaciones o application pool; esta identidad debe tener los permisos suficientes para iniciar servicios Windows.

Anécdota : Mi servicio no funcionaba bien, xq la identidad que ejecutaba el servicio no tenía acceso a Internet

La conexión a la base de datos debe ser la correcta
Anécdota : Mi servicio no funcionaba por utilizar TableAdapter, lo cual generaba una cadena de conexión diferente a la usada… de tal forma el error principal era que nunca se conectaba a la base de datos.

No es suficiente registrar sólo las excepciones manejadas, hay que registrar las excepciones que no son manejadas o controladas.
Anécdota : gracias a esto descubrí que estaba trabajando con una versión de librería antigua cuando la excepción me dio a conocer que no existe el método que estaba llamando.

Cuando se trabaja con librerías y hay problemas se debe verificar que se está trabajando con la versión correcta o indagar la posibilidad de que nuestro servicio está tomando la librería de otra ubicación.
Anécdota : Mi servicio fallaba, ya que la librería que utilizaba estaba registrada en el GAC… la verdad no me acuerdo pero era indispensable registrarlo x una aplicación Web… el problema era que esa librería no la estaba actualizando.

Si todos los pasos anteriores ya han sido verificados y aún así el servicio está fallando entonces ahora si hay que revisar el método al que llama el servicio.
Anécdota : Nos jalamos en alguna parte de la programación, si tenemos un Visual Studio instalado en la pc servidor de producción sería más fácil comprobar esto, pero si no podemos hacernos una pequeña aplicación q verifique que el método funciona de forma correcta.

Yo perdí mucho tiempo xq en ves de revisar desde el paso 1, empecé x revisar desde el paso 6…. Así que es recomendable seguir los pasos; considerando que mi servicio estaba funcionando de forma perfecta hasta que se cambiaron las configuraciones del servidor… y se hizo pasa.

ojala esto les ayude a ahorrar un poco de tiempo, modificare este post en futuros dias para hacerlo un poco mas claro y didactico!!!

Problemas con los Performance Counters de Enterprise Library??


Yo estaba igual, realmente tenia problemas por que salian errores como por ejemplo:

The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnly.

Cuando queria usar los performance counters (contadores de rendimiento) del Enteprise Library, salia una excepcion con el texto de arriba, quien iba a saber que faltaba installar los contadores!!! Si asi es no lo hace por defecto, asi es que en su instalacion de Enteprise Library debe buscar el comando InstallServices.bat, y con un usuario con suficientes privilegios ejecutarlo en una consola de comandos de VS2005 o 2008, si estan en Vista es mejor abrir una consola de comandos con privilegios elevados y ejecutar el .bat, despues deberian reiniciar su equipo, tambien debe incluir dentro de su instrumentacion lo siguiente:

<instrumentationConfiguration performanceCountersEnabled="true"
eventLoggingEnabled="true" wmiEnabled="false" /%gt

Claro con la seccion antes incluida, la que esta en el post anterior, ahora cuando se tenga que revisar los contadores ya tendran los valores necesarios!!

Disfruten de los contadores de rendimiento!!!

Error al quere utilizar la instrumentacion del Enterprise Library 3.1

|

Estaba usando el Enterprise Library 3.1 y me hizo falta usar la instrumentacion de la misma, es decir el log de errores, los contadores de rendimiento y todo eso, asi es que recurri a la ayuda que decia que pongas esto en el archivo de configuracion:


<configuration>
<configsections>
<section type="Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.Configuration.InstrumentationConfigurationSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null" name="instrumentationConfiguration">
</configsections>
<instrumentationconfiguration wmienabled="true" eventloggingenabled="true" performancecountersenabled="true">
</configuration>


Pues bien segui los pasos al pie de la letra, pero salia un error diciendo que no encontraba el assembly, es decir "Could not load assembly Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null".... Pero ahi estaba!! junto a los ejecutables donde debia estar junto a todos los assemblies que se hace referencia!! Despues de un buen rato dando vueltas por el Internet, encontre una sugerencia, era para otro assembly pero pense que podia funcionar, quitale el PublicKeyToken=null, por que?? Seguramente el assembly fue firmado entonces el valor de PublicKeyToken dejo de ser null, por consiguiente como siempre que te lanza un error el Framework .NET es el Framework el que tiene la razon!! Estaba buscando otro assembly!! Si asi resulta, el mas minimo cambio de version o de ese tipo de metadata en un assembly resulta que le da una identidad diferente al assembly, aun mas estando ya firmado!!!

Bien entonces?? la configuracion queda asi:



<configuration>
<configsections>
<section type="Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.Configuration.InstrumentationConfigurationSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral" name="instrumentationConfiguration">
</configsections>
<instrumentationconfiguration eventloggingenabled="true">
</configuration>

Cierto me dio otro error que aun no soluciono si dejas el tag instrumentationConfiguration como te dice la documentacion de Enterprise Library, de hecho hay algun problema con instanciar ciertos contadores de rendimiento, asi es que por lo pronto los quite hasta solucionar esto...

Por que dejo sin solucion el segundo tema de los contadores de performance?? Pues por que hubiera querido publicar un post completo pero note que este error era bastante problematico y podia bloquear el trabajo de mucha gente, ademas nadie ha dado una solucion especifica al tema por lo cual mas de uno debe estar en apuros como yo estaba...

Esperen mas info sobre el performance counter perdido!!!

Proveedores de para ADO .NET Entity Framework!!

|

La verdad yo si estaba preocupado por que no encontraba proveedores para ADO .NET Entity Framework, ha sido muy comentado que si van a ser producidos por distintas casa, pues bien el primer ejemplo concreto de estas implementaciones, al menos el primero que encuentro, bien den click y sean felices con el Proveedor de MySQL y de Oracle para ADO .NET Entity Framework por Core Labs!!!

http://www.crlab.com/mysqlnet/
http://crlab.com/oranet/

Visual Studio Team System 2008: Mis experimentos y experiencias


Una de las mas grandes dudas cuando una nueva version de cualquier producto es liberada es el tema de la compatibilidad con el trabajo anteriormente hecho, claro con la salida de VS 2008 esto tambien ha sido una preocupacion, pues les cuento que todo lo que han hecho con VS2005 funciona perfectamente, si quieren usar desde la solucion claro que tiene que convertir el archivo de la solucion pero no es nada dramatico, y claro VS 2008 es multitarget, es decir si quieres construir proyectos para Framework 2.0 de cualquier tipo (Windows, Web, Servicios, etc...) seleccionas en las propiedades del proyecto que Framework vas a usar y voila!! O cuando agregas un nuevo proyecto asi mismo seleccionas el Framework en la parte superior derecha y listo!! Algo interesante tambien es que en la solucion de VS 2008 puedes tener Frameworks de diferentes versiones, por ejemplo el Servicio en 2.0 y el cliente en 3.5, esto claro te da una flexibilidad impresionante...

Y para quienes trabajan con Team System?? Esa si era una pregunta de examen!! Pues yo tambien tengo mi ambiente Team System 2005, con Team Foundation Server 2005 y todas las de ley, se puede usar el Team Foundation Server con Visual Studio 2008?? Pues me dijeron que si cuando pregunte a uno de los expertos en el tema, claro ver para creer, asi es que baje el cliente de Team Foundation 2008, llamado Team Explorer 2008 lo encuentran en http://download.microsoft.com, y lo instale a mi Visual Studio Team System 2008, demoro un poco mi instalacion pero de verdad valio la pena!!

Me pude conectar a mi Team Foundation Server 2005 sin problemas, pude ver los documentos normalmente y todo, pero aqui entra lo interesante: Recuerdan ustedes que en Sharepoint Services 2.0 no se registraban correctamente los documentos Office 2007, es decir un docx sale sin icono y si lo quieres editar te baja el archivo como cualquier cosa, bien con el Team Explorer 2008 resulta que si ves el documento desde Visual Studio en el Tab del Team Explorer lo ves como un documento Office!! Al fin!! No me hace falta hacer la maroma que hay que hacer para cambiar TFS 2005 a Sharepoint Services 3.0!!! Eso si que es un alivio, y ademas me permite editarlos!!! Felicidad completa!! Esto incluye poder usar Project 2007 y que se aten los Workitems a tu TFS como se debe!!

De verdad estoy muy feliz por esto, uno puede usar tranquilamente las nuevas versiones sin temor a perder su trabajo ni tener regresiones!! Wow y gracias a los equipos de desarrollo de VS y TFS por acordarse y tomar en cuenta las sugerencias de los usuarios sobre el tema de compatibilidad hacia atras!!

En resumen lo que soporta Visual Studio 2008 Team System en el tema compatibilidad hacia atras es:

- Multitarget (Frameworks 2.0, 3.0 y 3.5)
- Soporte para proyectos de varios Frameworks en una solucion

Team Explorer 2008:

- Compatibilidad con Tema Foundation Server 2005
- Compatibilidad con Office 2007 para editar documentos
- Plugins para Office 2007 de Integracion (Administracion de WorkItems)

Pues entonces si quieren probar no tengan miedo, haganlo con confianza!!!

P.d.: Ademas mi ambiente de desarrollo es Windows Vista Business, tengo tambien Visual Studio 2005 Team System y Team Explorer 2005, no me trae conflictos para nada!!

Launch 2008: Visual Studio, SQL Server y Windows 2008


Tuve la suerte de participar como orador en el Launch 2008 de Visual Studio, SQL Server y Windows Server, yo participe en el track de desarrolladores e hicimos un demo "rutina" que salio bien y hasta medio comico con el famoso Jorge Oblitas, a pesar de que uno de los demos me fallo :P, a mi gusto nos fue muy bien, espero que la gente este conforme con lo que hicimos y queriamos transmitir...

Los temas de los demos fueron:

Visual Studio 2008:
- Compatibilidad entre Frameworks
- Breve Muestra de ADO Entity Framework y LinQ a SQL
- AJAX y ASP .NET (Este fue el que me fallo!!)
- Master Pages anidados
- Membership y Roles para ASP. NET y Windows Forms (Esto es realmente simple y genial)
- Silverlight Media (Este demo tambien es genial pero un poco largo)
- Office Business Applications con todo lo anteriormente aprendido

La verdad nos pasamos del tiempo que teniamos y no mostramos todo lo que queriamos mostrar, espero ir haciendo posts de como hacer cada uno de estos demos...

El codigo de los demos va a estar en www.comunidadesandinas.com o si lo desean con instrucciones y todo pues me avisan y yo se los entrego y explico!!

Windows Vista SP1: Mi opinión

|

Saludos!!
Tengo una Toshiba Satellite A217-4757, muy buena computadora, vino con Windows Vista home, por mi necesidad de trabajo le hice un Upgrade a una edición Business, bueno desde que lo he usado me ha agradado Windows Vista, es bastante estable, a excepción de un par de pantallas azules que no se que sucedio, compatible con todo lo que yo uso, normalmente aplicaciones para desarrollar software y hacer experimentos :P, y claro admito haber experimentado ciertos bugs como la lentitud terrible para copiar archivos, demoras en iniciar el SO, etc...
A lo largo de casi 6 meses que tengo la computadora, se han bajado una seria de parches desde Windows Update, lo cual no ha mejorado notablemente el desempeño de mi computadora pero si su estabilidad, y claro no solo MS ha liberado parches, tambien los fabricantes de drivers como ATI e incluso Toshiba ha pasado de la version 1.2 de BIOS a la 1.9, y si ha cambiado cierto comportamiento de bateria por ejemplo, pues bien estaba esperando el SP1 de Vista, pues lei que incluia muchas mejoras en cuanto a velocidad, seguridad y compatibilidad, bien hace unos dias Windows Update me notifico que podia instalar el SP1, no lo dude y le deje toda la noche a que lo haga, cuando termino de bajarse (es sorprendente que un SP tenga solo 65MB, si lo bajan de MSDN resulta que pesa 450MB+, lo que sucede es que esta empacado con casi todos los lenguajes que actualmente distribuye Vista, pero solo un lenguaje pesa 65MB, es decir si eres un usuario de casa mejor usa Windows Update) me pidio reiniciar la maquina, y empezo a instalarse, fue en tres fase, que hace cada una la verdad ni idea, termino, se reinicio y luego claro de iniciarse la primera vez no note nada extraño, es decir en apariencia no se nota nada, pero un momento se inicio mas rapido?? Pues al parecer si, bien a copiar archivos, en efecto copio mucho mas rapido!! Pues que mas puede haber mejorado?? Segun yo incluso el IE mejoro de velocidad, tambien sabia que habian un par de mejoras en el tema ReadyBoost, asi es que formatee mi SD Card que hace de memory ReadyBoost, ahi me encontre con soporte para exFAT esto es nuevo, luego claro le ensamble de nuevo a mi SD con ReadyBoost y de nuevo mi maquina sintio un pequeño empujon de velocidad, hasta aqui mi experiencia con el SP1 de Windows Vista ha sido positiva, asi es que si dudan en instalarlo no lo hagan mas, instalen y disfruten!!!

Diferencia entre ADO Entity Framework Dec CTP y Beta 3

|

Ayer estuve ayudando con una migración de un proyecto que estaba construido con Visual Studio Team Suite 2008 a la version final, pero claro hay que acordarse que EF (ADO Entity Framework) aun esta en Beta 3 y en unos meses saldra su version final, el proyecto en mencion hace un uso bastante intensivo de LinQ y EF, lo cual me agrada mucho, pues bien al pasar lo primero que notamos es que el dbml que contenia el mapeo de entidades a clases estaba en unicode, y debia esta en ANSI, en lenguaje comun hay que cambiar en la cabecera la codificacion de utf-16 a utf-8, lo guardas lo cierras y se abre normalmente...
Ademas en la generacion de las clases resulta que en la entidad como tal el metodo Add, que podia ser usado para agregar entidades, ya no es publico, solo puede ser usado internamente, en su defecto pueden usar Insert o InsertOnSubmit, el segundo es mas facil de usar y si usaron Add antes pueden solo hacer un reemplazo simple sin cambiar parametros, pero cuidado se cambie por el Add que existe en los designers que eso si les puede causar problemas...

Mi conclucion es que el paso de Beta 2 a RTM en Visual 2008 fue 99% limpio, solo con Entity Framework tuvimos un poco de problemas pero nada que definitivamente sea un impedimento mayor...

Problemas de eficiencia usando WCF 3.0?? Aqui esta la solución!!

|

Justo antes de que salga como RTM WCF y el Framework 3.0 tome la decision de usarlo para un proyecto que estaba como hecho para que se use WCF y cabia justo en la dimension de tiempo para que funcione todo en lo correcto, pues bien cuando ya estuvo en produccion a veces mi proyecto no era muy rapido, asi es que comence a indagar que sucedia, al tener por backend Oracle 10g y con un poco de mala experiencia con esa base de datos (debes realmente tener un dba para que funcione como debe y cuando escribes SQL pues tienes que tener un cuidado aun mayor por que si lo escribes solo por escribir seguramente sera lento), por esto pase un par de meses monitoreando la base y afinando mis sentencias, esto definitivamente mejoro el rendimiento en casi todos los procesos, asi es que primera leccion aprendida: Si usas Oracle como backend tambien asegurate de tener un experimentado dba que acompañe todo el desarrollo y la puesta en producción...
Ahi no termina la historia, comenzo a crecer el sistema y mucho mas de lo planeado y volvio a ponerse lento, y mas lento, y mas lento!!! Si bien los usuarios no tenian mucho problema con la lentitud por que la interfase de usuario es asincronica, la verdad yo veia que tenia cada vez mas problemas con la velocidad, ciertos procesos internos realmente tomaban demasiado tiempo, nuevamente entre a buscar el problema, mucho debug del codigo no ayudaba mucho asi es que tenia que probar tecnicas de profile, un producto que me ayudo en verdad es el ANTS profiles de RedGate (http://www.red-gate.com/products/ANTS_Profiler/index.htm) en mi opinion cualquier desarrollador profesional deberia tener una herramienta como esta, ayudo mucho y mas que nada encontre algunas cosas interesantes:

1. Cuando habia comunicacion entre el Cliente WCF y el Servidor WCF el consumo de memoria era realmente un problema, especialmente mi servicio el cual comenzaba a crecer y no dejaba de hacerlo, e incluso nunca liberaba memoria, asi este inactivo algunos días, lo cual me tenia confundido, incluso revisaba con el profiler la memoria, como estaba actuando el GC y cosas relacionadas lo que encontre es que habian millones de objetos de tipo String que no se morían, eso era raro por cuanto yo apenas si usaba un par de constantes dentro del servicio, no ocupaban tanta memoria pero estaban ahi...

2. Despues aisle la funcionalidad del servicio y lo separe en 2, con lo cual pude analizar mejor, resulta que tenia 2 servicios, A y B, donde A era la cara para los programas clientes y a su vez era cliente de B, y B servia como una capa de persistencia, saben que fue lo importante, solo los programas que actuaban como clientes WCF crecian mucho en memoria, el servicio B no pasaba de los 150MB mientras el servicio A llegaba a los 2GB, como es un servidor 32 bits se moria el servicio por su puesto con un System.OutOfMemoryException, esto claro afectaba la disponibilidad del servicio...

Bien al parecer encontre un patron, iba entonces en busqueda de que era exactamente, busque en foros pero nadie tenia un problema similar, estaba casi por rendirme cuando despues de algunos meses note algo extraño: tenia una laptop nueva con Windows Vista y un beta de Visual Studio 2008, en esa maquina funcionaba mucho mas rapido el cliente y no comia tanta memoria, cual era la diferencia?? En un principio pense que era que Vista al tener el Framework 3.0 como parte del sistema operativo esto hacia que WCF sea mas eficiente, pero habia otro cliente Vista que estaba en un punto mas bien intermedio, un tanto rapido pero normalmente lento, descartando todo tipo de problemas de comunicaciones y hardware, resulta que habia una cosa que no habia tomado en cuenta, el Framework 3.5....

Pero que tenia este que comenzaba a notar mejoría?? Un prerequisito importante, los Service Packs 1 de los Frameworks 2.0 y 3.0!!! Y por si acaso tambien el Framework 3.5 tiene un Garbage Collector nuevo y mejorado!! Investigando un poco mas encontre los Knowledge Base de dichos Service Packs (2.0 http://support.microsoft.com/kb/945757, 3.0 http://support.microsoft.com/kb/945826) y pues ni modo me los lei todo para ver que tanto podian afectar a mi software, pero habia estado probando inconcientemente en el cliente Vista con Framework 3.5 beta, y todo funcionaba ok, asi es que hice un par de pruebas mas y comence a desplegar el Framework 3.5 pero el RTM, tanto en el Servidor como en los clientes, el resultado?? Una espectacular mejora en los tiempos de respuesta, al fin vi mi problema resuelto!!!

Ahora tengan cuidado con el SP1 de Framework 2.0 por que si cambia algunas cosas, si deciden dar el paso pues ejecuten abosultamente todas las pruebas del software de nuevo con Service Pack puesto asi despues no tendran sorpresas de tipo mi codigo no funciona o estaba funcionando y ahora ya no....

Espero que esto les de algo de orientación, a mi me costo meses lidiar con este problema...

Entendiendo las Expresiones Lambda al Fin!!!

|

Con la aparición del .NET Framework 3.5 se han estado promocionando algunas de las nuevas caracteristicas de los lenguajes como por ejemplo en C# 3.0 y VB 9.0 las expresiones Lambda, la verdad la primera vez que las vi resulta que no entendi nada!! Funcionaban de un modo magico!!
Me intereso mucho entender como es que funcionan, asi es que investigando un poco resulta que no es nada magico en verdad, simplemente es un uso inteligente de algunas caracteristicas de los lenguages .NET, y voy a tratar de mostrarselos:

1. Una expresion Lambda es un metodo anonimo que puede ser usado para crear delegados o arboles de expresiones

2. Un metodo anonimo es una porcion de codigo que puede ser creada para ser usada como un delegado, a pesar de que es un metodo no es necesario declararlo, es por esto que se lo llama anonimo, esto no es nuevo viene desde C# 2.0, un link interesante para entender mejor es sobre esto es el siguiente: http://msdn.microsoft.com/msdnmag/issues/06/00/C20/default.aspx

3. Un delegado es lo que antiguamente se conocia como un puntero a una funcion, cuando necesitas pasar una funcion como un parametros es muy util, mas informacion?? Encuentrala aqui: http://msdn2.microsoft.com/en-us/library/ms173171(VS.80).aspx

4. Arbol de expresiones: quien no ha construido esto en la Universidad!! Es un tipico arbol para evaluar expresiones, claro la gente de MS lo vuelve un poco mas completo al tema y lo usa como base para cosas muy interesantes, mas informacion: http://www.interact-sw.co.uk/iangblog/2005/09/30/expressiontrees

Bien ahora que tenemos mas claros los conceptos que se usan, podemos hacer la comparacion que a mi me funciono para entenderlo correctamente:

Partiendo del concepto de que una expresion Lambda es una funcion anonima, pero con una notacion diferente, podemos entonces entender que tiene parametros de entrada y devuelve un valor, vamos bien, pero cual es la notacion correcta?? Este articulo me guio hacia la luz!!
http://www.hanselman.com/blog/TheWeeklySourceCode13FibonacciEdition.aspx

Y de ahi tomare prestado el ejemplo de las funciones para compararlos y explicarlos:

C# 2.0
static int Fibonacci (int x)
{
if (x <= 1) return 1; return Fibonacci (x-1) + Fibonacci (x-2); } C# 3.0 (Hace falta referenciar System.Core y System.Func) Func fib = null;
fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;

Como ven estas funciones nos ayudan con la famosa serie de Fibonaccim y las 2 funcionan muy pero muy bien, claro vamos ha hacer las relaciones correspondientes para que vean que son lo mismo:

Declaracion y Parametros de entrada

C# 2.0: La tipica declaracion de la funcion en la primera linea:
static int Fibonacci (int x)

Funcion estatica llamada Fibonacci, tiene un parametro de entradad de tipo int (int en C#, Int32 para el FCL, Integer para VB) y devuelve un resultado de tipo int (lo mismo que el parentesis anterior)

C# 3.0:
Parte de la segunda linea
fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;

Como estan pensando, solo n es la declaracion de la funcion, donde n es el parametro de entrada, pueden haber mas de un parametro de entrada, en este caso no es necesario, y se preguntaran: Y los tipos del parametro y el tipo del resultado de la funcion?? Esta es la parte interesante, aqui se usa una caracterista nueva que se llama inferencia de tipos, cuando la expresion lambda esta completa y bien escrita el compilador puede inferir los tipos que se usan, como se imaginaran entonces para que una expresion lambda funcione como nosotros deseamos debemos tener cuidado como escribimos el cuerpo de la misma, por cuanto el inferir el tipo no es tan sencillo como se piensa... Y el nombre de la funcion?? Como es un metodo anonimo no le hace falta la verdad, internamente se le asigna un nombre automaticamente para poder referenciarlo...

Cuerpo de la funcion e instrucciones

C# 2.0: lineas 2, 3, 4, 5 y 6

{
if (x <= 1) return 1; return Fibonacci (x-1) + Fibonacci (x-2); } Delimitan la funcion las llaves en la linea 2 y 6, dentro tenemos un if que verifica que el parametro no este fuera del rago y si lo esta devuelve un valor por default (1), si no hace un calculo simple basado en recursividad para ser devuelvo con una sentencia return, nada dificil verdad?? C# 3.0: Otra vez parte de la segunda linea fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;

Muy bien aqui lo que hace es con el operador ?: (si no le conocen mucho a este operador entonces vayan a http://fcolomas.blogspot.com/2007/12/el-gourmet-net-que-es-mas-eficiente-un.html) reemplazar la funcionalidad del if y la linea del return de la funcion c# 2.0, es decir si n que es el parametro de entrada declarado antes es mayor que 1 entonces usa la recursividad para llamar de nuevo a la funcion y ejecutar un calculo simple, de lo contrario el valor que se devuelve es n.

Supongo que aun tienen preguntas, voy a aclarar algunas cosas que a mi me saltarian como dudas:

1. Que es esto de la linea 1 del la funcion en C# 3.0??
Resulta que como la expresion lambda es un metodo anonimo (puede tambien ser llamado funcion anonima) y como voy a requerir usarlo recursivamente de algun modo debo poder volver a llamarlo!! Recuerden que un metodo anonimo no tiene nombre, entonces como lo vuelvo a usar?? Justamente con el tipo Func uno puede almacenar esta referencia es por eso que se declara Func fib = null; con lo cual se reserva espacio para la referencia a la funcion, claro con esto tambien ya le damos las pistas necesarias al compilador para que luego la expresion lambda que va a ser almacenada tenga los tipos correctos tanto para los parametros como para el resultado...

2. Y el operador => que significa??
Este es la separacion de la expresion, con esta se sabe que el lado izquierdo contiene los parametros y el lado derecho las instrucciones, ahora si desean ejecutar mas instrucciones claro que se puede, al lado derecho ponen un par de llaves y dentro las instrucciones tal cual una funcion y voila!!

Esas dos son las mas notorias a mi modo de ver, ahora si ustedes tienen mas preguntas pues con todo gusto!!!

Algunos links utiles:

Expresiones Lambda para VB
http://msdn.microsoft.com/msdnmag/issues/07/09/BasicInstincts/default.aspx

Expresiones Lambda para C# desde MSDN
http://msdn2.microsoft.com/en-us/library/bb397687.aspx

Ora-01000: Que paso otra vez!!!

|


Si a mi otra vez!! resulta que una de mis aplicaciones grandes escrita en C# comenzo indistintamente a dar un ORA-01000!! Esto significa que en mi base de datos estaban demasiados cursores abiertos!!! Que paso?? Estaba yo usando las "mejores practicas" por ejemplo siempre cerrar la conexion, o usarla todo dentro de un bloque using, normalmente mi modelo de extraccion implicada usar un DataAdapter para llenar o un DataSet o un DataTable, nunca usaba DataReaders, pero resulta que los DataAdapter si los usan internamente para llenar los datos, y ahi viene la falla: resulta que si no se cierran y se les da Dispose explicitamente a los DataReaders estos dejan abiertos los cursores que usan por debajo para extraer la informacion, esto solo pasa en Oracle, claro esto a gran escala resulta un problema por que con muchos clientes concurrentes se hace pedasos!!!





Bueno y como se lo soluciona?? como les dije hay que cerrar y darles dispose explicitamente a los DataReader que se usan, en el caso de usar un DataAdapter resultaria algo asi:




Si no esta muy grand la imagen, haganle click y la veran mejor....


En la linea 162 y 163 esta la respuesta al problema, claro esta especializada para usar objetos del DataProvider nativo de Oracle, pero eso si es mejor tambien que aumenten un poco el parametro de cursores abiertos en su base de datos...


Actualizacion! La imagen original es muy pequeña, asi es que espero esta este mejor! Hagalen un par de veces click y la veran completa!


Mis aventuras con AutoCAD MAP: Arquitectura

|

Gracias a todos los que han leido la poca información que puedo poner en este blog sobre AutoCAD MAP 3D y .NET!!!

En respuesta a un comentario desde Perú, voy a aclarar unas dudas y en lo posible guiar en algo el uso mas tipico para estas aplicaciones: El Catastro.

Con las capacidades de AutoCAD Map sobre los datos geoespaciales, es decir mapas que pueden llegar a ser muy complejos, es realmente una excelente opción usarlo!! Imaginen que no tienen que manejar directamente los datos espaciales si no que esto es por completo automatico!!! Y de la fuente o fuentes de información que uno disponga!!

Normalmente el primer problema es que los datos geoespaciales tengan relación con otros datos relacionales (es decir que los graficos puedan ser relacionados con sus atributos alfanumericos), para esto se debe tomar una estrategia que vaya de la mano con la prospectiva tecnologica que la empresa a la que estamos ayudando ha elegido, esto especialmente por donde se almacenan los datos y por que generalmente ya existen datos que se desean que se usen para los propositos mencionados, para esto escribire otro post que sera bastante extenso en verdad...

Supongamos que Oracle es nuestro repositorio principal y tendra dentro de la misma tabla los datos espaciales, la clave que lo identifica y otros datos necesarios, y ademas que este esquema fue definido con las herramientas de AutoCAD Map para este fin, como mencione antes esto cubrire en otro post...

Bien la parte de la pregunta que quiero responder es si se puede hacer que un programa .NET haga de host para AutoCAD Map y no al reves como he mencionado antes, ademas con esta condicion la idea de poder seleccionar la parcela (tambien conocido como lote) y que se muestre y modifique la informacion de la misma, si que la puso dificil nuestro amigo!!

Bien la primera parte es factible, usando a AutoCAD como objeto COM dentro del formulario, pero claro en ese punto es un tanto dificil manejar cierta funcionalidad como los FDO que nos interesan justamente para el segundo proposito, voy a tratar de hacer esto como lo pide nuestro amigo por que la verdad lo he hecho al reves, es decir que AutoCAD sea el Host del codigo .NET y si se puede obtener la informacion de la parcela y modificarla claro, de hecho es factible que seleccionas la parcela y obtienes la informacion, la cambias y todo, e incluso puedes dibujar la parcela, crear los datos y todo!! Con .NET claro!!!

Mi primera recomencadación es que deficitivamente se use AutoCAD Map 3d 2008 Sp1 como el cliente de la base de datos, aun le falta evolucion a la tecnologia geoespacial para poder ser usada bien con los conceptos de SOA, pero va por buen camino...

La estrategia que se usa dentro del cliente para manipular los datos es mixta, es decir se usa FDO que contiene AutoCAD para manipular toda la parte grafica, y .NET para poder modificar los datos alfanumericos asociados, claro entre estos dos existira un vinculo que es la clave unica que identifica al registro que mantiene los datos, como planteamos antes estos estan juntos y es bastante sencillo hacer este tipo de operaciones por cuanto FDO se basa en la arquitectura de los Proveedores de Datos .NET, es decir uno los usa como usar SQL Sever u Oracle!!

En la base de datos como comente antes se deben tomar una serie extensa de consideraciones pero lo que si recomiendo por completo es que para la creacion del esquema de datos completo se use las herramientas de AutoCAD Map, esto es por que este genera ciertas columnas para su uso y asi mismo alimenta ciertas tablas especificas de la base de datos (especialmente en Oracle) para que los datos graficos esten siempre consistentes, y debe ser todo esl esquema!! Ahora si existen tablas que se planifica que no contengan datos graficos si no sirvan para otros propositos entonces pueden ser creadas en los administradores de la base de datos elegida...

Para operaciones simples es tambien una muy buena opcion evaluar los controles que provee ThinkGeo (http://www.thinkgeo.com), son realmente una excelente opcion y en mas de un caso un buen reemplazo para AutoCAD Map!!!

ORA-01795: Que paso??

|

Hace no mucho tuve un problema con este error ORA-01795, para oracle en una expresion IN no puedes poner mas de 1000 items, incluso en su version 10g R2, con 11g no se la verdad, pero el workaround que a mi me aplico bien es reemplazar esos mas 1000 items con una subconsulta, claro en mi caso los mas de 1000 items estaban en otra tabla, si su diseño arquitectonico les da para esto pues no lo duden!!! Esto aplica a cualquier uso con ADO.NET con el driver nativo, ODP .NET u otro driver, el problema no tiene que ver con el driver...