La inserción en la base de datos DB2 del procedimiento almacenado SQL Server tiene éxito, pero envolver el mismo procedimiento usando Entity Framework falla

Necesito poder insertar filas en un conjunto de tablas en una base de datos DB2 de una base de datos de Microsoft SQL Server. He creado procedimientos almacenados que pueden insertar filas en la base de datos DB2 usando un servidor conectado, haciendo referencia a las tablas de destino por sus 4 nombres de piezas. Estos procedimientos funcionan y puedo insertar registros llamandolos en SQL Server Management Studio.

Los esquemas son diferentes entre las dos bases de datos, así que estoy usando un programa C# y Entity Framework envuelve estos procedimientos almacenados para ayudarme a realizar la asignación. Al ejecutar mi programa se lanza una excepción con el mensaje

La operación no se pudo realizar porque el proveedor OLE DB "IBMDASQL" para el servidor conectado "LinkedServer" no pudo iniciar una transacción distribuida

Ejecutar un rastro SQL y reproducir los comandos creados por Entity Framework en SQL Server Management Studio crea los registros deseados en DB2.

¿Qué estoy perdiendo aquí para conseguir que estas llamadas de procedimiento almacenadas funcionen de Entity Framework?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por bytebard


4 Respuestas:

  • Mi problema fue resuelto estableciendo una propiedad de configuración en mi contexto de base de datos.

    db.Configuration.EnsureTransactionsForFunctionsAndCommands = false

    Respondida el Dec 17, 2020 a las 17:49 - por codeartisan

    Votos positivos: 0 | Votos negativos: 0

  • Respondida el Dec 17, 2020 a las 17:55 - por compilerhero1251

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando, "La operación no se pudo realizar porque el proveedor OLE DB 'IBMDASQL' para el servidor conectado 'LinkedServer' no pudo iniciar una transacción distribuida", suele estar relacionado con problemas de configuración relacionados con transacciones distribuidas entre diferentes bases de datos.

    Aquí hay algunos pasos que podrías seguir para intentar solucionar este problema:

    • Verifica la configuración del proveedor OLE DB 'IBMDASQL' y asegúrate de que esté configurado correctamente para admitir transacciones distribuidas.
    • Asegúrate de haber configurado correctamente las conexiones entre las bases de datos SQL Server y DB2, y que las credenciales de autenticación tengan los permisos necesarios para ejecutar transacciones distribuidas.
    • Verifica si hay alguna configuración específica que deba realizarse en el servidor DB2 para permitir transacciones distribuidas desde SQL Server.
    • Puedes intentar ajustar la configuración de transacciones distribuidas en SQL Server para ver si eso soluciona el problema.
    • Revisa la documentación de Entity Framework para asegurarte de que estás utilizando la configuración correcta para trabajar con procedimientos almacenados que interactúan con bases de datos externas.

    Si después de seguir estos pasos todavía no logras resolver el problema, te recomendaría contactar con el soporte técnico de los proveedores de las bases de datos (Microsoft SQL Server y DB2) para obtener asistencia adicional en la configuración de transacciones distribuidas entre las bases de datos.

    Respondida el Dec 18, 2020 a las 17:46 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Posibles causas:

    Transacciones distribuidas deshabilitadas: Asegúrese de que las transacciones distribuidas estén habilitadas en el servidor DB2 y en SQL Server. Credenciales incorrectas: Verifique que las credenciales utilizadas para la conexión vinculada sean válidas y tengan permisos suficientes en la base de datos DB2. Versión de Entity Framework: Asegúrese de utilizar una versión compatible de Entity Framework que admita transacciones distribuidas. Configuración de la conexión: Compruebe la configuración de la cadena de conexión para la conexión vinculada y asegúrese de que sea correcta. Problemas de red: Asegúrese de que no haya problemas de red entre los servidores SQL Server y DB2.

    Solución:

    • Habilitar transacciones distribuidas:
    - En SQL Server, ejecute el siguiente comando:
    
         EXEC sp_configure 'allow distributed transactions', 1
         RECONFIGURE
         
    • En DB2, habilite las transacciones distribuidas en el registro de configuración de la base de datos.
    • Verificar credenciales:
    - Asegúrese de que el usuario utilizado para la conexión vinculada tenga los permisos necesarios para crear y ejecutar el procedimiento almacenado en la base de datos DB2.
    • Usar la versión correcta de Entity Framework:
    - Asegúrese de utilizar una versión de Entity Framework que admita transacciones distribuidas.
    • Configurar la cadena de conexión:
    - Especifique la opción "MultipleActiveResultSets=True" en la cadena de conexión para la conexión vinculada.
    • Solucionar problemas de red:
    - Verifique que no haya problemas de red entre los servidores SQL Server y DB2. Puede intentar hacer ping a cada servidor desde el otro y analizar los registros del servidor en busca de errores de conexión.
    • Otras consideraciones:
    - Asegúrese de que el procedimiento almacenado esté correctamente definido en la base de datos DB2.
    • Intente llamar al procedimiento almacenado directamente desde SQL Server Management Studio para descartar cualquier problema relacionado con Entity Framework.

    Nota:* Las transacciones distribuidas pueden ser complejas de configurar y solucionar problemas. Si sigue teniendo problemas, puede considerar utilizar un enfoque alternativo, como utilizar un trabajo de SSIS o un servicio de integración para insertar datos en la base de datos DB2.

    Respondida el Dec 18, 2020 a las 17:51 - por Gemini

    Votos positivos: 0 | Votos negativos: 0