2011-02-06 70 views
5

Estoy utilizando Linq para SQL con SQL Server 2008 SP2, mi aplicación es WinForm .net 4 Estoy importando en SQL Server 200,000 registros. Estoy creando los objetos y los adjunto al contexto de datos en el "insertonsubmit". Luego hago "submitChanges" cada 100 registros. NO TENGO NINGUNA TRANSACCIÓN como siempre.Esta SqlTransaction se ha completado; ya no se puede usar

me sale este error

"This SqlTransaction has completed; it is no longer usable." with stack 
at System.Data.SqlClient.SqlTransaction.ZombieCheck() 
    at System.Data.SqlClient.SqlTransaction.Rollback() 
    at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges() 

De la nada. Ese error no es coherente, puede aparecer después de 10.000 registros o 27.200 registros o XXX.

porque el error parece ser al azar, estaba pensando que tiene algo que ver con la recolección de basura ...

Cualquier persona tiene una pista?

+1

¿Puede mostrarnos algún código para obtener el contexto de datos y adjuntar los objetos a él? – Luis

Respuesta

2

SubmitChanges tiene una transacción implícita. El problema aquí es que su transacción se está agotando, simplemente está haciendo demasiado. Para 200k filas, usaría SqlBulkCopy en una tabla de etapas y luego ejecutaría un comando o SPROC para mover esos 200k en la tabla real; quizás con ese comando/SPROC en una transacción.

SqlBulkCopy es diseñada para este escenario - es un dato de la corriente o TDS prima continua, en lugar de embargo-mayo de ida y vuelta - y al final del servidor que está optimizado también (pero, como consecuencia, se obligada utilice una tabla de etapas, o corre el riesgo de que las inserciones no estén registradas).

+2

He encontrado la solución para el problema. Parece que hay un firewall entre mi máquina con "reglas de carga". – Varpi

+0

¿Podría ser más específico sobre cómo solucionar esto? Veo este problema también y no veo nada sobre esto en mi firewall. ¿Es el firewall de Windows o algo más? Además, el OP dijo que estaba haciendo submitChanges cada 100 registros, por lo que lo que dijo Marc Gravell no tiene sentido. –

Cuestiones relacionadas