.net - dotconnect - ¿Generando LINQ a DB2?
database net core (6)
Bueno, la respuesta simple para ti es sí, puedes hacerlo. ¿Cómo?
Descargue DB2 data server client 9.7 e instálelo. Reemplaza a todos tus clientes mayores.
Puede que tenga que volver a escribir su cadena de conexión a DB2. En C: / Archivos de programa / IBM / SQLLIB / Bin / Testconn.exe lo ayudará a crear y probar una cadena de conexión.
Asegúrese de que su IBM.Data.Informix.dll esté en buenas condiciones.
Use VS2008. A la fecha VSAI para DB2 para VS2010 todavía no se ha lanzado.
Al igual que cualquier otra base de datos, cree el modelo de entidad ADO.NET - archivo edmx para su base de datos.
Lo más probable es que con una gran cantidad de tablas en su base de datos (lo cual es más probable con DB2), debe obtener EDMGEN2.exe desde www.codeplex.com. Puede que tenga que colocar un archivo de texto llamado "Tables.txt" lleno de tablas, vistas, nombres Proceduce precedidos con el nombre del esquema. EdmGen2.exe usará este archivo de texto y creará el archivo EDMX únicamente para las tablas especificadas. Más tarde puede agregar tablas adicionales.
IBM tiene un sitio de soporte donde explican las limitaciones de las funciones admitidas en Linq en el cliente DB2 9.7 debido a las limitaciones de SQL de DB2.
Tengo una base de datos DB2 existente en mi trabajo. (Al menos, creo que es DB2. Se refieren a él como "el iSeries" y se ve y se siente como DB2 en algún hardware mainframe-ish.) Durante años, los desarrolladores de .NET de mi departamento acaban de escribir comandos y consultas de ADO manualmente. para obtener datos específicos de tablas específicas, etc.
En este momento estoy construyendo infraestructura para ayudar a facilitar el desarrollo y el soporte de nuestro software interno, y una cosa que me gustaría abordar es este acceso a los datos. Soy un poco nuevo en las diversas herramientas de ORM, pero estoy familiarizado con la sintaxis de LINQ y es allí donde me gustaría obtener. Esto es lo que tenemos ahora:
- Una base de datos DB2 establecida con muchas tablas.
- No hay objetos comerciales establecidos en el código.
- Ninguna relación útil entre tablas y cualquier objeto comercial potencial.
Entonces, lo que trato de hacer es crear una capa de abstracción entre el código y la base de datos DB2 donde los desarrolladores pueden hacer esencialmente lo que ya hacen (capturar datos y llenar un objeto personalizado) de manera más fluida y eficiente. Es decir, en lugar de crear objetos ADO clásicos y llenar un DataSet, simplemente escriba una instrucción LINQ simple que devuelva un IQueryable anónimo con los campos para completar un objeto personalizado. (Como una ventaja adicional, me gusta mucho la idea de errores en tiempo de compilación cuando los programadores estropean algo en lugar de errores de tiempo de ejecución, como ocurre cuando un error tipográfico se abre paso en un literal de cadena de comandos SQL. Además, ni siquiera me entiendes comenzó con vulnerabilidades de inyección de SQL por aquí).
La cuestión es que todavía no he podido encontrar ninguna forma de lograr esto. Es muy posible que pase por alto algo simple, y si ese es el caso, doy la bienvenida a un pequeño empujón en la dirección correcta. Pero tal como está, todo lo que encuentro en línea encaja en una de estas categorías:
- ¡Sí, usted puede hacer esto! Todo lo que necesita es un controlador de IBM para el que no haya ningún enlace de descarga.
- Aquí hay un práctico tutorial para generar un gran ORM para sus objetos comerciales que crea una base de datos desde cero. (NHibernate, en su mayoría, que sería genial usar si puedo usarlo para lo que estoy tratando de hacer).
- Descargue alguna herramienta y genere su ORM. (La herramienta no es compatible con DB2, o reclama pero falla cuando lo intento).
Alguien ha encontrado algo como esto antes? ¿Me estoy acercando a él de una manera completamente incorrecta? Cualquier consejo sobre el tema sería muy apreciado, gracias.
Editar: Voy a seguir adelante y recompensar a este. He hablado con algunas personas y parece que "todavía no se puede hacer" sigue siendo la respuesta, pero si alguien ha solucionado esto y ha encontrado una solución, me encantaría escucharla.
Actualización: gracias a la respuesta a continuación para indicarme el proyecto DB_Linq. En realidad, no me llevó mucho agregar algo de soporte básico de DB2 a eso y ahora tengo un proveedor probado de LINQ to DB2. Es bastante simple por ahora, y muy personalizado para nuestro entorno, por lo que no hay planes de contribuir de nuevo al proyecto. Pero con suerte podré madurar mi tenedor con el tiempo y devolverlo. ¡Gracias!
Si no te opones firmemente a hacer algo de codificación :-) conseguir LINQ para MySql, Oracle y Postgress y modificarlo probablemente también te ahorrará mucho trabajo. Recuerde que LINQ to SQL aún usa la misma conexión ADO.NET.
Tenga en cuenta que LINQ to Entities no es lo mismo que LINQ to SQL e incluso si obtiene que IBM lib funcione, primero tendrá que verificar si se le permitirá usarlo contra DB existente sin muchas pruebas (puede se puede disparar fácilmente y tratar de modificar la base de datos existente; revise este hilo si quiere profundizar en ese aspecto: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/f3a5b27a-5b73-476a -8c38-1eaedc8f197c ).
También puede acceder al subproceso Beta de Entity Framework de IBM (comenzar desde el final, donde algunos usuarios declararon resultados de trabajo).
Lo importante no es tratar de obtener absolutamente todo lo que MS SQL obtuvo, solo necesita clases de representación de tabla y está listo para la primera ronda.
Otra cosa que podría intentar es abrir la conexión ADO.NET normal a DB2 (o forzar ODBC si resulta que la conexión no ODBC es demasiado snoopy y sensible) a DB2, y tratar de actuar como si fuera SQL Server, por así decirlo. Si resulta que SqlMetal acepta trabajar con esa conexión, ya casi has terminado: autogenerará las clases de representación de tabla para ti.
Si no funciona, también necesitará MS SQL Server, al menos para fines de desarrollo. Para un script de inicio saque algunas tablas de DB2, cree luego en SQL Server y luego ejecute SqlMetal y busque el código fuente. Verá que crea bonitas clases de clan para la representación de tablas y simplemente coloca atributos fuertes pero directos en ellos, lo que significa que es fácil de copiar y pegar, o incluso generar mediante un buen guión. Una vez que vea cómo se ve un pequeño archivo autogenerado, también verá que puede adjuntar más código a los ganchos provistos o eliminar algún código existente. Compruebe que LINQ to MySql etc. otra vez.
LINQ solo necesita clases de representación de tabla para que pueda razonablemente tener su propio derivado System.Data.Linq.DataContext casi a los deseos de su corazón y supongo que el esquema en DB2 casi nunca cambia, por lo que no tendrá que cambiar es muy frecuente LINQ es un sistema bastante abierto en general (como lo demuestran muchos LINQ a algo libs), lo que significa que si la modificación del derivado de DataContext no es suficiente, usted también puede hacerse cargo de todas las expresiones LINQ.
Una vez que tenga una prueba de concepto con algunas tablas, es posible que necesite escribir una secuencia de comandos perl o python (o powershell o C #) para reemplazar un poco la expresión regular si las secuencias de comandos de creación de tablas de DB2 no se ejecutan intactas en SQL Server (hay siempre algunas desviaciones de sintaxis) y realmente tienes que tomar la ruta más larga.
La solución que estoy usando en mi proyecto actual es un "servidor vinculado" en Microsoft SQL Server que está vinculado mediante OleDB al servidor de base de datos DB2.
En la base de datos de mi proyecto, he creado vistas que reflejan las tablas de DB2. Ejecutar sqlmetal.exe con / views opción generará el archivo de mapeo para estos también.
Tenga en cuenta que deberá actualizar la asignación manualmente para agregar información sobre claves primarias y campos con nulos.
Tiene sentido en mi proyecto hacerlo de esta manera, ya que tengo que leer / escribir bases de datos tanto en DB2 como en SQL Server y usar un servidor vinculado, puedo hacerlo todo en la misma conexión ADO.NET, confirmando los cambios en ambos base de datos simultáneamente.
Puede usar un ORM ligero como, por ejemplo, dapper-dot-net. http://code.google.com/p/dapper-dot-net/
Esto está en mi lista de cosas que hacer ya que ejecuto un gran sistema IBM DB2 y tengo desarrolladores .net. No es tan fácil obtener los controladores y complementos para visual studio 2008/2010.
ORM: sé (lo he leído) que nHibernate y Entity Framework admiten la sintaxis SQL de DB2. nHibernate tiene una curva de aprendizaje más amplia y estamos indecisos si vamos a saltar sobre esto. Pero el marco de la entidad (el nuevo) se ve muy bien y actualmente se usa contra SQL Server 2008, pero también se debe tener en cuenta para señalar a DB2.
Tanto nhibernate como Entity framework soportan ejecutar LINQ contra ellos, sin ningún problema.
Gracias
Simon
No soy un hombre de DB2, pero he aquí algunas ideas que puede o no haber visto.
- Documentación de IBM del soporte de DB2 Entity Framework: http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=/com.ibm.db2.luw.apdv.ms.doc/doc/c0054118 .html
- LLBLGen, un proveedor de LINQ (Nota: la página afirma que no es compatible con iSeries, pero la compañía ha sido muy buena con nosotros en el pasado, puede considerar darles una llamada telefónica) http://www.llblgen.com/defaultgeneric. aspx
- Una publicación de SO no muy prometedora desde febrero pasado: uso de LINQ con IBM i
Espero que esto ayude.
¡Buena suerte!